You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决方案

核心问题分析

原脚本的问题在于:

  1. 仅在窗口刷新后立刻检查一次鼠标状态,未持续监听用户的点击操作
  2. 未正确使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:20:27