首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Shady中显示预先准备好的图像数组的一部分

在Shady中显示预先准备好的图像数组的一部分
EN

Stack Overflow用户
提问于 2019-05-17 00:17:40
回答 1查看 59关注 0票数 0

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

实际上,我做的事情非常简单。对于每个试验,

  1. I从磁盘加载单个图像(我脱机进行亮度线性化),其中包含我计划在该试验中显示的所有帧(刺激为1000x1000px,我呈现25帧,因此图像为5000x5000px。
  2. I传输整个图像到GPU
  3. 在某个点(外部控制)我将第一帧复制到视频缓冲器并在其他点(外部控制)呈现
  4. 我触发其余24帧的呈现(为每个视频帧将图像的相关部分复制到视频缓冲器,然后调用int8 ())
  5. 外部控制通过让另一台机器通过TCP/IP与刺激呈现代码通信来实现。在控制PC向演示PC发送命令并执行该命令之后,演示PC需要向控制PC发回确认消息。我需要发送三个ACK消息,一个是当第一个帧出现在屏幕上时,一个是当第二个帧出现在屏幕上时,另一个是当第25个帧出现在屏幕上时(这样,控制PC就可以很容易地验证一个帧是否已经被丢弃)。在matlab中,我通过调用分块方法flip()来显示帧,当它返回时,我将确认发送到控制PC。

就这样。我怎么能在shady中做到这一点呢?有没有我应该看的例子?

EN

回答 1

Stack Overflow用户

发布于 2019-05-17 01:16:22

查找此信息的位置是Shady.StimulusShady.Stimulus.LoadTexture的文档字符串,以及包含的示例脚本animated-textures.py

像大多数Python一样,有多种方法可以做你想做的事情。下面是我会怎么做:

代码语言:javascript
复制
w = Shady.World()
s = w.Stimulus( [frame00, frame01, frame02, ...], multipage=True )

其中每个frameNN是1000x1000像素的numpy阵列(浮点或uint8)。

或者,您可以要求Shady直接从磁盘加载:

代码语言:javascript
复制
s = w.Stimulus('trial01/*.png', multipage=True)

其中目录trial01包含25个1000x1000像素的图像文件,命名为(比如) 00.png24.png,以便正确排序。或者,您可以提供一个明确的文件名列表。

无论采用哪种方法,无论是从内存还是从磁盘加载,帧都会在该调用中传输到图形卡。然后,您可以使用以下命令(时间关键)在它们之间进行切换:

代码语言:javascript
复制
s.page = 0  # or any number up to 24 in your case

注意,由于我们使用了multipage选项,我们使用的是“页面”动画机制(每帧创建一个OpenGL纹理),而不是默认的“帧”机制(创建一个1000x25000的OpenGL纹理),因为后者将超过许多图形卡上单个纹理的最大允许尺寸。在Shady.Stimulus类的文档字符串中以及前面提到的交互式演示中讨论了这些机制之间的区别:

代码语言:javascript
复制
python -m Shady demo animated-textures

要准备下一次试验,您可以使用.LoadPages() ( Shady版本1.8.7中的新功能)。这将遍历现有的“页面”,将新纹理加载到以前使用的显卡纹理缓冲区中,并根据需要添加更多页面:

代码语言:javascript
复制
s.LoadPages('trial02/*.png')

现在,您提到已建立的工作流程是将帧连接为一个5000x5000像素的图像。我上面的解决方案假设您已经完成了将其再次分割为1000x1000像素的帧的工作,大概使用了numpy调用(听起来您现在可能正在Matlab中执行相同的操作)。如果你打算继续保存为5000x5000,保持对事物的控制的最好方法可能确实是维护你自己的代码来分解它。但值得一提的是,您可以采取完全不同的策略,一次性将其全部转移:

代码语言:javascript
复制
s = w.Stimulus('trial01_5000x5000.png', size=1000)

这会将整个预先准备好的5000x5000图像从磁盘(或再次从内存,如果您想要传递5000x5000数值数组而不是文件名)加载到显卡内存中的单个纹理中。但是,由于size规范,Stimulus将仅显示阵列的左下角1000x1000像素部分。然后,您可以通过相对于信封移动载波来切换“帧”。例如,如果您要说:

代码语言:javascript
复制
s.carrierTranslation = [-1000, -2000]

然后,您将查看位于5x5数组中的一个“列”和两个“行”的框架。

最后,请记住,您可以利用Shady的动态gamma校正和抖动-除非您显式禁用它们,否则它们无论如何都会发生,尽管如果您将刺激.gamma保留为1.0并使用整数像素值,它们当然不会产生物理效果。因此,您可以将刺激生成为单独的1000x1000数组,每个数组包含范围为[0.0,1.0]的非线性浮点值,并让Shady担心超出此范围的所有事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56172775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档