我是PsychoPy的新手,之前曾与Pygame合作过几个月(我转而启用刺激功能在多个屏幕上显示)。
我试图弄清楚如何使用PsychoPy来显示使用一系列图像创建的动画。我之前在Pygame中通过将整个图像序列保存在单个大型png文件(spritesheet)中,然后每帧仅翻转该图像的一小部分(例如,480 x 480像素),同时移动到下一个相同大小下一帧中图像的一部分。这大致是我的代码在Pygame中的样子。我真的很想知道是否有相同的方法在PsychoPy中生成动画,只选择要与每个帧一起显示的图像部分。到目前为止,谷歌搜索没有提供任何答案!
gameDisplay=pygame.display.set_mode((800, 480))
sequence=pygame.image.load('C:\Users\...\image_sequence.png')
#This image contains 10 images in a row which I cycle through to get an animation
image_width=480
image_height=480
start=time.time()
frame_count=0
refresh=0
while time.time()<=start+15:
gameDisplay.blit(sequence,(160,0),(frame_count*image_width,0,image_width,image_height))
if time.time()>= start+(refresh*0.25): #Flip a new image say every 250 msec
pygame.display.update()
frame_count+=1
refresh+=1
if frame_count ==10:
frame_count=0
答案 0 :(得分:0)
您可以使用方形光圈限制可见内容,然后移动图像。所以这样的事情(未经测试,但可以给你一些想法):
from psychopy import visual
win = visual.Window(units='pix') # easiest to use pixels as unit
aperture = visual.Aperture(win, shape='rect', size=(480, 480))
image = visual.ImageStim('C:\Users\...\image_sequence.png')
# Move through x positions
for x in range(10):
image.pos = [(-10.0/2*+0.5+x)*480, 0] # not sure this is right, but it should move through the x-positions
image.draw()
win.flip()
如果您有原始图像,我认为按顺序显示原始图像会更简单。
import glob
from psychopy import visual
image_names = glob.glob('C:\Users\...\*.png')
# Create psychopy objects
win = visual.Window()
image_stims = [visual.ImageStim(win, image) for image in image_names]
# Display images one by one
for image in image_stims:
image.draw()
win.flip()
# add more flips here if you want a lower frame rate
也许它在运行时加载它们的速度甚至足够快而不丢帧,这样可以简化代码并减少内存:
# Imports, glob, and win here
# Create an ImageStim and update the image each frame
stim = visual.ImageStim(win)
for name in image_names:
stim.image = name
stim.draw()
win.flip()
答案 1 :(得分:0)
实际上,给定一个spritesheet,您可以使用GratingStim做一些时髦和高效的事情。这会将图像作为纹理加载,然后允许您设置该纹理的空间频率(sf)和相位。如果1.0 / sf(在两个维度上)小于刺激的宽度(在两个维度中),将仅显示纹理的一部分并且相位确定将是哪个部分。它不是为此目的而设计的 - 它通常用于创建不止一个纹理的不止一个循环 - 但我认为它会起作用。