从PsychoPy中的图像序列生成动画?

时间:2017-01-05 18:53:47

标签: python animation psychopy

我是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

2 个答案:

答案 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(在两个维度上)小于刺激的宽度(在两个维度中),将仅显示纹理的一部分并且相位确定将是哪个部分。它不是为此目的而设计的 - 它通常用于创建不止一个纹理的不止一个循环 - 但我认为它会起作用。