2

我得到了一个由外部源以 1/0.14s 的恒定速率触发的相机,并使用 Matlab for-loop 拍摄定时图片以进行实时测量。但是,每次执行“getsnapshot”的时间都非常不同。有时我得到一张不到 0.14 秒的照片,有时需要 0.5 秒才能拍一张照片。无论如何要将“getsnapshot”与外部触发器同步?或者至少让“getsnapshot”准确计时?

以下是我的代码:

vid = videoinput('camera');  
preview(vid);  

for i=1:100  
data=getsnapshot(vid);  
%...data processing...  
%....  
clear data  
end
4

1 回答 1

2

首先,删除该preview(vid)行,这可能就是 rep. 你得到的利率很奇怪。当您获取数据时,您不需要启用此预览选项,因为它会从您的 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 次迭代,你应该没问题)。

于 2013-04-01T18:38:56.000 回答