我以1 / 0.14s的恒定速率从外部源触发摄像机,并使用Matlab for-loop拍摄定时图像进行实时测量。但是,执行"获取快照的时间为#34;每次都是如此不同。有时我会得到1张不到0.14秒的照片 有时拍照需要0.5秒。无论如何都要同步" getsnapshot" 使用外部触发器?或至少制作"获取快照"确切的时间?
以下是我的代码:
vid = videoinput('camera');
preview(vid);
for i=1:100
data=getsnapshot(vid);
%...data processing...
%....
clear data
end
答案 0 :(得分:2)
首先,删除preview(vid)
行,这可能就是为什么代表。你得到的速度很奇怪。当你获取数据时,你不需要这个预览选项,因为它从你的cpu中获取资源。
然后,您可能需要将imaq工具箱上的摄像机属性设置为触发模式。例如,对于gentl
相机类型,这可能类似于:
triggerconfig(vid, 'hardware', 'DeviceSpecific', 'DeviceSpecific');
src = getselectedsource(vid);
src.FrameStartTriggerMode = 'On';
src.FrameStartTriggerActivation = 'RisingEdge';
src.FrameStartTriggerDelayAbs = 0;
src.FrameStartTriggerSource = 'Line1';
src.FrameStartTriggerOverlap = 'Off';
然后,使用某些相机,您可以读取它们的触发器,即每当相机曝光时,它会向某个输出发送ttl。 Matlab定义它的方法就像:
src.SyncOut1SyncOutPolarity = 'Normal';
src.SyncOut1SyncOutSource = 'Exposing';
同样,您需要在imaq工具中使用相机的选项。 此外,您之后执行的数据处理步骤可能需要一些时间,因此请对其进行基准测试,以便您可以在不发生瓶颈的情况下即时获取数据并对其进行分析。
最后,您可以使用getdata
代替getsnapshot
(阅读文档以了解其差异),并采用以下格式:[img, time, metadata] = getdata(vid);
这将为您提供每张图像的时间戳,以便您可以看到正在发生的事情。另外,代替clear data
使用flushdata(vid)
来保持vid对象不会完全填充内存缓冲区(尽管如果你只在循环中运行100次迭代,你应该没问题。)