【问题标题】:Can you synchronize the data acquisition toolbox and the image acquisition toolbox of Matlab?Matlab的数据采集工具箱和图像采集工具箱能同步吗?
【发布时间】: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


【解决方案1】:

这不会完全解决您的问题,但可能已经足够了。由于您以 50 Hz 的频率获取同步信号,因此您可以使用 clock 为两种类型的数据(相机图像和模拟电压)创建时间戳。由于函数 clock 几乎不需要时间(即低于 1e-7 秒),您可以尝试相应地编辑您的 SaveData 函数:

fprintf(fid, '%f,%f\n ', [clock time data]);

并在for循环中添加:

timestamp(i,:)=clock;

【讨论】:

  • 使用 tic 和 toc 可能会更好,Mathworks 建议将其用于时间测量,因为它们不依赖于对系统时间的调用。
【解决方案2】:

这还不是完整的解决方案,但有一些想法可能有用。

我确实获得了带有 daq 跟踪(时间和数据)的图像和 log.txt 文件,但是如何使用外部触发(触发相机)或其他时钟来同步两者?

您能想出一种校准设置的方法吗? IE。修改您的实验并在图像流和电压测量中创建一个独特的事件,可用于同步? Just like this ...

【讨论】:

    【解决方案3】:

    你可以使用同步来触发 AD 板吗?从 USB-6009 手册...

    使用 PFI 0 作为数字触发器-- 定义模拟输入任务后,您可以将 PFI 0 配置为数字触发输入。启用数字触发后,AI 任务在开始采集之前等待 PFI 0 上的上升沿或下降沿。要将 AI 启动触发 (ai/StartTrigger) 与数字源一起使用,请将 PFI 0 指定为源并选择上升沿或下降沿。

    我的经验表明触发器和 AQ 之间的延迟非常短

    很抱歉,我为此使用 Python 或 C,所以我不能给你 MatLab 代码,但你想看看类似的函数。

    /* Select trigger source */
    Select_Signal(deviceNumber, ND_IN_START_TRIGGER, ND_PFI_0, ND_HIGH_TO_LOW);
    
    /* specify that a start trigger is to be used */
    DAQ_Config(deviceNumber, startTrig, extConv); // set startTrig = 1
    
    /* start the acquisition */ 
    DAQ_Start(deviceNumber, …)
    

    如果您想走这条路,您可以从以下方面获得更多想法: http://www.ni.com/white-paper/4326/en

    希望这会有所帮助, 卡尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 1970-01-01
      • 2015-01-30
      • 2011-03-26
      • 1970-01-01
      • 2011-08-31
      相关资源
      最近更新 更多