附源代码文件,见下面
系列实验
脑与认知实验:图像中的注意区域预测
脑与认知实验:认知过程中的面孔识别加工
在屏幕中左右各显示一张图像,并显示提示词:要求用户选择一张图像,并根据选择点击键盘按键N或M(此处可以设置为其它键盘按键)。等待用户点击键盘,输出根据键盘判定点击的图像是哪一张,并输出从显示图像到用户点击键盘的时间。**
对于实验a,我的程序设计的思路是首先创建数据文件夹,然后创建一个窗口并读入pic文件夹内的图片(如图所示为程序的文件目录结构),用imread方法读取其RGB码。再之后就创建材质并画出材质与调整其位置。图片画出来后,开始绘制文字并调整其位置,我用的是DrawFormattedText方法绘制的。所有内容均显示后就设置一个按键检测机制,构建一个循环检测按键输入。若按键为l或r(l表示选择左边图片, r表示选择右边的)则记录按键信息与反应时间并跳出循环。最后在data文件夹创建data.csv文件存储数据并关闭窗口。 详细的代码文件可见附件压缩包内的a.m。
按下r或l键后会自动退出并记录数据。
数据文件(位于data/data.csv)内容如图所示,1.119s按下r键,选择了右边的图片。
clear;clc %清除变量与清屏
PsychDebugWindowConfiguration; %调用Debug模式窗口
datadir = fullfile(fileparts(mfilename('fullpath')),'data'); %存储数据
if ~exist(datadir,'dir') % 如果数据文件夹不存在则创建
mkdir(datadir);
end
Screen('Preference','SkipSyncTests',1); %跳过同步性检测
%试验开始
HideCursor %隐藏鼠标 防止试验过程误触
[w,wrect]=Screen('OpenWindow',0,0,[]); %打开窗口
[c,d]=WindowCenter(w); %获取屏幕的中心位置
%读取图片
%遍历pic文件夹中的所有jpg图片
allpic=dir("pic\*.jpg"); %*通配符表示所有
for i=1:length(allpic)
%需要先记录每张图片的名字
name=allpic(i).name;
%记录完后读取这图片的二进制码
array=imread(['pic\',name]); %这里的['pic\',name]是用来连接字符串的 imread...直接读取目录的文件
%然后再的赋值给allpic
allpic(i).array=array;
tex(i)=Screen('MakeTexture',w,allpic(i).array) %制作材质
end
pic1Rect=Screen('Rect', tex(1)); %这个可以用来获取图片的尺寸 tex(1)是材质
pic2Rect=Screen('Rect',tex(2));
%需要注意下面代码的最后一项的四个数字其实是代表图片左上角坐标与右下角坐标的 不是代表尺寸
%下面代码用于绘制图像
Screen('DrawTextures',w,tex(1), [], [c-pic1Rect(3)/2-500 d-pic1Rect(4)/2-100 c+pic1Rect(3)/2-500 d+pic1Rect(4)/2-100])
Screen('DrawTextures',w,tex(2), [], [c-pic1Rect(3)/2+500 d-pic1Rect(4)/2-100 c+pic1Rect(3)/2+500 d+pic1Rect(4)/2-100])
%绘制文字
text='Please choose a pic.\n press "l" to choose the left one. \n press "r" to choose the right one.)'
Screen('TextSize',w,30);
DrawFormattedText(w,double(text),'center',800,[255,255,0]);
Screen('Flip',w) %刷新画面
start_time=GetSecs %当画面显示出来时 记录开始时间
KbName('UnifyKeyNames'); %按键设置
l = KbName('l');
r = KbName('r');
T = table %创建表格用来存储数据
%按键检测
while 1
[keyisdown,secs,keycode] = KbCheck;
if keycode(l)
T.key='l'
T.time=GetSecs-start_time
break
elseif keycode(r)
T.key='r'
T.time=GetSecs-start_time
break
end
WaitSecs(0.001);
end
ShowCursor %显示鼠标
%写入文件
datafile = fullfile(datadir,sprintf('data.csv')); %创建结果文件
writetable(T, datafile); %将表格写入文件中
Screen('CloseAll')
在屏幕中显示两个不同颜色的圆,并显示提示词:要求用户选择其中一个圆,并根据选择使用鼠标点击屏幕。等待用户点击屏幕,输出通过点击位置判定点击的是哪一个圆,并输出从显示图像到用户点击屏幕的时间。
此题的程序设计与a实验的类似,因此在这个程序中,我只改变了图像绘制与呈现以及鼠标检测的部分。椭圆的绘制我用的是Screen的FillOval方法,然后鼠标检测用的是getmouse方法。然后最后根据鼠标是否在圆区域(矩形区域)中并且有没有点击来进行判断。点击成功后程序会自动记录数据并输出到data.csv文件内。 详细代码可见附件压缩包内的b.m。注意a与b程序共用了同一个数据输出文件,可根据真实需要调整。
鼠标点击圆后会自动退出并记录数据。
数据文件(位于data/data.csv)内容如图所示,1.67s点击了左边的圆。
%在屏幕中显示两个不同颜色的圆,并显示提示词:要求用户选择其中一个圆,
%并根据选择使用鼠标点击屏幕。等待用户点击屏幕,输出通过点击位置判定点击的是哪一个圆,
%并输出从显示图像到用户点击屏幕的时间。
clear;clc %清除变量与清屏
PsychDebugWindowConfiguration; %调用Debug模式窗口
datadir = fullfile(fileparts(mfilename('fullpath')),'data'); %存储数据
if ~exist(datadir,'dir') % 如果数据文件夹不存在则创建
mkdir(datadir);
end
Screen('Preference','SkipSyncTests',1); %跳过同步性检测
%试验开始
[w,wrect]=Screen('OpenWindow',0,0,[]); %打开窗口
[c,d]=WindowCenter(w); %获取屏幕的中心位置
%绘制两个圆
rect1=[c-600 d-100 c-400 d+100]
rect2=[c+400 d-100 c+600 d+100]
Screen('FillOval',w,[255 100 100],rect1)
%同样是左上角 右下角
Screen('FillOval',w,[255 255 100],rect2);
%绘制文字
text='Please click the oval you want to choose .'
Screen('TextSize',w,30);
DrawFormattedText(w,double(text),'center',800,[255,255,0]);
Screen('Flip',w) %刷新画面
start_time=GetSecs %刷新画面后开始计时
T = table %创建表格用来存储数据
%鼠标检测
while 1
[mx,my,button]=GetMouse
if mx>=rect1(1)&&mx<=rect1(3)&&my>=rect1(2)&&my<=rect1(4)&&button(1)==1
%此条件用来判断鼠标是否在 左圆区域且是否点击
T.key='l'
T.time=GetSecs-start_time
break
elseif mx>=rect2(1)&&mx<=rect2(3)&&my>=rect2(2)&&my<=rect2(4)&&button(1)==1
%此条件用来判断鼠标是否在 右圆区域且是否点击
T.key='r'
T.time=GetSecs-start_time
break
end
WaitSecs(0.001);
end
%此中判断方法存在一定误差 因为这里把圆当成了矩形对象
%写入文件
datafile = fullfile(datadir,sprintf('data.csv')); %创建结果文件
writetable(T, datafile); %将表格写入文件中
Screen('CloseAll')
源码下载链接
https://download.csdn.net/download/weixin_51735061/85304526