我感兴趣的是,为了我的刺激演示,我有兴趣从心理工具箱迁移到shady。我浏览了在线文档,但我不太清楚如何在阴影中复制我目前在matlab中所做的事情。
实际上,我做的事情非常简单。对于每个试验,
就这样。我怎么能在shady中做到这一点呢?有没有我应该看的例子?
发布于 2019-05-17 01:16:22
查找此信息的位置是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数值数组而不是文件名)加载到显卡内存中的单个纹理中。但是,由于size规范,Stimulus将仅显示阵列的左下角1000x1000像素部分。然后,您可以通过相对于信封移动载波来切换“帧”。例如,如果您要说:
s.carrierTranslation = [-1000, -2000]然后,您将查看位于5x5数组中的一个“列”和两个“行”的框架。
最后,请记住,您可以利用Shady的动态gamma校正和抖动-除非您显式禁用它们,否则它们无论如何都会发生,尽管如果您将刺激.gamma保留为1.0并使用整数像素值,它们当然不会产生物理效果。因此,您可以将刺激生成为单独的1000x1000数组,每个数组包含范围为[0.0,1.0]的非线性浮点值,并让Shady担心超出此范围的所有事情。
https://stackoverflow.com/questions/56172775
复制相似问题