我有兴趣从 psychtoolbox 迁移到 shady 来进行刺激演示。我浏览了在线文档,但我不太清楚如何在 shady 中复制我目前在 matlab 中所做的事情。
我做的事情其实很简单。对于每次试验,
我从磁盘加载单个图像(我进行离线亮度线性化),其中包含我计划在该试验中显示的所有帧(刺激为 1000x1000 像素,我呈现 25 帧,因此图像为 5000x5000 像素。我只使用 BW 图像,因此每个像素有一个 int8 值)。
我将整个图像从CPU传输到GPU
在某个时刻(外部控制)我将第一帧复制到视频缓冲区并呈现它
在其他某个点(外部控制)我触发了 剩余24帧(将每个视频帧的图像相关部分复制到视频缓冲区,然后调用flip())。
外部控制是通过让另一台机器通过 TCP/IP 与刺激呈现代码进行通信来实现的。当控制PC向展示PC发送命令并执行后,展示PC需要向控制PC发回确认消息。我需要发送三个 ACK 消息,一个当第一帧出现在屏幕上时,一个当第二帧出现在屏幕上时,一个当第二十五帧出现在屏幕上时(这样控制 PC 可以轻松验证帧是否已丢失) )。 在 matlab 中,我通过调用阻塞方法 Flip() 来呈现一个帧,当它返回时,我将 ACK 发送到控制 PC。
就是这样。在阴凉处我该怎么做?有我应该看的例子吗?
Shady.Stimulus
和 Shady.Stimulus.LoadTexture
的文档字符串,以及包含的示例脚本 animated-textures.py
。
与 Python 的大多数功能一样,有多种方法可以满足您的需求。我会这样做:
w = Shady.World()
s = w.Stimulus( [frame00, frame01, frame02, ...], multipage=True )
其中每个
frameNN
是一个 1000x1000 像素 numpy
数组(浮点或 uint8
)。
或者,您可以要求 Shady 直接从磁盘加载:
s = w.Stimulus('trial01/*.png', multipage=True)
其中目录
trial01
包含 25 个 1000x1000 像素的图像文件,命名为(例如)00.png
到 24.png
,以便它们能够正确排序。或者您可以提供明确的文件名列表。
无论哪种方式,无论是从内存还是从磁盘加载,帧都会在该调用中传输到显卡。然后,您可以(时间紧迫)在它们之间切换:
s.page = 0 # or any number up to 24 in your case
请注意,由于我们使用了
multipage
选项,我们使用“页面”动画机制(每帧创建一个 OpenGL 纹理)而不是默认的“帧”机制(创建一个 1000x25000 OpenGL 纹理),因为后者将超出许多显卡上单个纹理的最大允许尺寸。这些机制之间的区别在 Shady.Stimulus
类的文档字符串以及前面提到的交互式演示中进行了讨论:
python -m Shady demo animated-textures
要准备下一次试验,您可以使用
.LoadPages()
(Shady 版本 1.8.7 中的新增功能)。这会循环遍历现有“页面”,将新纹理加载到以前使用的显卡纹理缓冲区中,并根据需要添加更多页面:
s.LoadPages('trial02/*.png')
现在,您提到您建立的工作流程是将帧连接为单个 5000x5000 像素图像。我上面的解决方案假设您已经完成了将其再次切割成 1000x1000 像素帧的工作,大概使用 numpy 调用(听起来您目前可能在 Matlab 中执行相同的操作)。如果您打算继续保存为 5000x5000,那么保持控制的最佳方法可能确实是维护您自己的剪切代码。但值得一提的是,您可以采取完全不同的策略一次性转移所有内容:
s = w.Stimulus('trial01_5000x5000.png', size=1000)
这会将整个预先准备好的 5000x5000 图像从磁盘(或者再次从内存中,如果您想传递 5000x5000 numpy 数组而不是文件名)加载到显卡内存中的单个纹理中。但是,由于
size
规范,Stimulus
将仅显示数组的左下 1000x1000 像素部分。然后,您可以通过相对于信封移动载体来切换“帧”。例如,如果你说:
s.carrierTranslation = [-1000, -2000]
然后您将看到在 5x5 数组中位于横向一“列”和向上两“行”的框架。
最后一点,请记住,您可以利用Shady的即时伽马校正和抖动——除非您明确禁用它们,否则它们无论如何都会发生,当然,如果您离开,它们不会产生任何物理效果。刺激
.gamma
为 1.0 并使用整数像素值。因此,您可以将刺激生成为单独的 1000x1000 数组,每个数组都包含[0.0,1.0]
范围内的非线性浮点值,并让 Shady 担心超出范围的所有事情。