Psychopy/Python中如何获取ImageStim内点击点的目标坐标?
问题:如何追踪Psychopy中ImageStim内的鼠标点击坐标?
我正在为Psychopy/Python课程设计一个找Waldo的被试间视觉实验:
- 自变量:图像尺寸(G1:全尺寸;G2:2/3尺寸;G3:1/3尺寸),通过裁剪图像缩小搜索区域以降低视觉噪声
- 因变量:找到Waldo的时间和点击准确率(正确/错误猜测)
我编写了测试脚本用于获取图像内Waldo位置的(x,y)点击坐标,以此定义实验中的正确响应。计划通过For循环与If布尔语句实现逻辑:点击Waldo坐标则进入下一试次,点击非Waldo坐标则需重新尝试。
当前脚本仅追踪鼠标在窗口中的初始位置,而非实际点击位置。现需修改脚本以追踪ImageStim内的点击点坐标。
原测试代码:
#figuring out how to define a mouse click location in an image object #===================== #IMPORT SETTINGS #===================== from psychopy import visual, event import numpy as np import os #===================== #PATH SETTINGS #===================== main_dir = os.getcwd() data_dir = os.path.join(main_dir,'experimentData') image_dir = os.path.join(main_dir, 'images') #===================== #WINDOW SETTINGS #===================== win = visual.Window(units='norm', size= [1000,642], fullscr=None) #===================== #STIMULUS SETTINGS #===================== waldoImage = visual.ImageStim(win, size=2, interpolate=True) #interpolate >> helping with blurry image?? waldoImage.image = os.path.join(image_dir, 'wallpaperflare.com_wallpaper (2).jpg') #original size = 1920 x 1233 px mouse = event.Mouse() x = visual.TextStim(win, text='x', color='black') findWaldo = np.array([]) #Waldo locations list waldoImage.draw() win.flip() if mouse.getPressed(waldoImage): # if mouse.isPressedIn(waldoImage): #tried this instead, but did not work loc = mouse.getPos() #location = mouse starting point in the window, not where moved to and clicked findWaldo = np.append(findWaldo, loc) event.waitKeys() # just to help control flow for testing # test coordinates of collected location waldoImage.draw() x.pos = findWaldo x.draw() # at collected mouse coordinates win.flip() event.waitKeys() # just to help control flow for testing win.close() print(findWaldo) # testing coordinate collection is working
解决方案
核心问题分析
原脚本的问题在于:
- 仅在窗口刷新后立刻检查一次鼠标状态,未持续监听用户的点击操作
- 未正确使用
isPressedIn方法来检测点击是否发生在目标刺激范围内
修改后的代码
# 获取ImageStim内的鼠标点击坐标 #===================== #IMPORT SETTINGS #===================== from psychopy import visual, event import numpy as np import os #===================== #PATH SETTINGS #===================== main_dir = os.getcwd() data_dir = os.path.join(main_dir,'experimentData') image_dir = os.path.join(main_dir, 'images') #===================== #WINDOW SETTINGS #===================== win = visual.Window(units='norm', size= [1000,642], fullscr=None) #===================== #STIMULUS SETTINGS #===================== waldoImage = visual.ImageStim(win, size=2, interpolate=True) waldoImage.image = os.path.join(image_dir, 'wallpaperflare.com_wallpaper (2).jpg') mouse = event.Mouse(win=win) # 将鼠标绑定到当前窗口 x = visual.TextStim(win, text='x', color='black') findWaldo = np.array([]) # 绘制图像并等待用户点击 waldoImage.draw() win.flip() # 循环监听鼠标点击,直到用户在图像区域内完成点击 while True: # 检测左键是否点击在waldoImage范围内 if mouse.isPressedIn(waldoImage, buttons=[0]): loc = mouse.getPos() # 获取点击的窗口坐标(与图像内部坐标匹配,因图像尺寸设为2) findWaldo = np.append(findWaldo, loc) break # 有效点击完成,退出循环 # 按ESC键可强制退出程序 if event.getKeys(keyList=['escape']): win.close() exit() # 测试显示点击位置 waldoImage.draw() x.pos = findWaldo x.draw() win.flip() event.waitKeys() win.close() print(findWaldo)
关键修改说明
- 绑定鼠标到窗口:初始化
Mouse时指定win=win,确保坐标检测与当前窗口关联 - 循环监听点击:用
while True持续检测鼠标状态,直到用户完成有效点击 - 正确使用
isPressedIn:该方法会判断点击是否发生在目标刺激的可视范围内,buttons=[0]限定只响应左键点击 - 退出机制:添加ESC键退出逻辑,避免程序无响应
- 坐标匹配:因图像尺寸设为2(norm单位,占满窗口),窗口坐标直接对应图像内部的[-1,1]范围,无需额外转换
内容的提问来源于stack exchange,提问作者Kelsey Brick
相关产品推荐
相关产品推荐

