我有兴趣从心理工具箱迁移到阴暗的刺激演示。我浏览了在线文档,但我不太清楚如何在 matlab 中以阴暗的方式复制我目前正在做的事情。
我做的其实很简单。对于每次试验,
我从磁盘加载一张图像(我离线进行亮度线性化),其中包含我计划在该试验中显示的所有帧(刺激是 1000x1000 像素,我呈现 25 帧,因此图像是 5000x5000 像素。我只使用 BW 图像,所以我每个像素只有一个 int8 值)。
我将整个图像从 CPU 传输到 GPU
在某些时候(外部控制)我将第一帧复制到视频缓冲区并呈现它
在其他某个点(外部控制)我触发 剩余的 24 帧(将图像的相关部分复制到每个视频帧的视频缓冲区,然后调用 Flip())。
外部控制是通过让另一台机器通过 TCP/IP 与激励呈现代码进行通信来实现的。在控制 PC 向演示 PC 发送命令并执行此命令后,演示 PC 需要向控制 PC 发送回确认消息。我需要发送三条ACK消息,一条当第一帧出现在屏幕上时,一条当第二帧出现在屏幕上时,另一条当第25帧出现在屏幕上时(这样控制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 担心除此之外的一切。