在 Shady 中呈现预先准备好的图像阵列的各个部分



我有兴趣从心理工具箱迁移到阴暗的刺激演示。我浏览了在线文档,但我不太清楚如何在 matlab 中以阴暗的方式复制我目前正在做的事情。

我做的其实很简单。对于每次试验,

  1. 从磁盘加载一张图像(我离线进行亮度线性化),其中包含我计划在该试验中显示的所有帧(刺激是 1000x1000 像素,我呈现 25 帧,因此图像是 5000x5000 像素。我只使用 BW 图像,所以我每个像素只有一个 int8 值)。

  2. 我将整个图像从 CPU 传输到 GPU

  3. 在某些时候(外部控制)我将第一帧复制到视频缓冲区并呈现它

  4. 在其他某个点(外部控制)我触发 剩余的 24 帧(将图像的相关部分复制到每个视频帧的视频缓冲区,然后调用 Flip())。

  5. 外部控制是通过让另一台机器通过 TCP/IP 与激励呈现代码进行通信来实现的。在控制 PC 向演示 PC 发送命令并执行此命令后,演示 PC 需要向控制 PC 发送回确认消息。我需要发送三条ACK消息,一条当第一帧出现在屏幕上时,一条当第二帧出现在屏幕上时,另一条当第25帧出现在屏幕上时(这样控制PC可以轻松验证帧是否已被丢弃)。 在 matlab 中,我通过调用阻塞方法 flip() 来呈现一个帧,当它返回时,我将 ACK 发送到控制 PC。

就是这样。在阴暗中我该怎么做?有没有我应该看的例子?

查找此信息的地方是Shady.StimulusShady.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.png24.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 担心除此之外的一切。

相关内容

  • 没有找到相关文章

最新更新