【发布时间】:2013-02-08 18:53:14
【问题描述】:
我想使用 matlab 同时从相机(即图像)和模拟电压获取数据。对于相机我使用 imaq 工具箱,读取电压我使用 daq 工具箱(读取 NI-USB 设备),代码如下:
clear all
% Prepare camera
vid = videoinput('gentl', 1, 'Mono8');
src = getselectedsource(vid);
vid.FramesPerTrigger = 1;
vid.TriggerRepeat = Inf;
triggerconfig(vid, 'hardware', 'DeviceSpecific', 'DeviceSpecific');
src.FrameStartTriggerMode = 'On';
src.FrameStartTriggerActivation = 'RisingEdge';
% prepare DAQ
s=daq.createSession('ni');
s.addAnalogInputChannel('Dev1','ai1','Voltage');
fid = fopen('log.txt','w');
lh = s.addlistener('DataAvailable',@(src,event)SaveData(fid,event));
s.IsContinuous = true;
% Take data
s.startBackground();
start(vid)
N=10;
for ii=1:N
im(:,:,ii)=getsnapshot(vid);
end
% end code
delete(lh );
fclose('all');
stop(vid)
delete(vid)
函数SaveData在哪里:
function SaveData(fid,event)
time = event.TimeStamps;
data = event.Data;
fprintf(fid, '%f,%f\n ', [time data]);
end
我确实获得了带有 daq 跟踪(时间和数据)的图像和 log.txt 文件,但是如何使用外部触发(触发相机)或其他时钟来同步两者? 对于这个例子,数据采集器读取相机触发 TTL 信号 (@ 50 Hz),所以我想将每个 TTL 脉冲分配给一个图像。
附录: 我一直在搜索并找到了一些关于该主题的讨论(例如 one),并阅读了 Mathworks 网站上的 examples,但没有找到答案。该文档显示了如何Start a Multi-Trigger Acquisition on an External Event,但讨论的采集仅与基于 DAQ 的输入相关,而不是基于摄像头的输入(它也在前台工作)。
【问题讨论】:
-
MATLAB 中没有直接的东西;您可能想要使用基于 Mex 的外部 C++ 线程库或基于 Simulink 的解决方案。
-
你用什么设备来记录电压?
-
我不明白它为什么重要,但您可以在代码中看到它是一个 NI 设备(模拟电压 USB 读取器,例如 USB6009)
-
为什么不通过额外的模拟输入通道用NI记录触发相机的TTL信号?然后,您可以通过将数据引用到第二个模拟输入通道中的脉冲,将图像分配给第一个模拟通道中的电压数据。
-
我试过了,但是数据采集卡和相机之间总是有一些延迟,所以在记录触发信号时,只有在相机启动一段时间后。换句话说,它需要
s.startBackground();大约0.15秒要处理,在那段时间我记录了几个这样的触发器,但相机的“getsnapshot”还没有开始......
标签: matlab camera synchronization data-acquisition nidaqmx