2013-02-23 6 views
4

Я хотел бы одновременно получать данные с камеры (то есть изображения) и аналогового напряжения с использованием Matlab. Для камеры я использую IMAQ набор инструментов, для считывания напряжения, я использую DAQ инструментов (чтение NI-USB устройства), со следующим кодом:Можете ли вы синхронизировать панель сбора данных и панель сбора изображений Matlab?

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 

Я получаю изображения и файл log.txt с трассировкой daq (время и данные), но как я могу использовать внешний запуск (который запускает камеру) или некоторые другие часы для синхронизации двух? В этом примере daq считывает камеру, запускающую TTL-сигнал (@ 50 Гц), поэтому я хочу назначить каждый TTL-импульс изображению.

Добавление: Я искал и нашел несколько обсуждений (как этот one) по этому вопросу, и прочитать examples, которые находятся на сайте Mathworks, но не нашли ответа. Документация показывает, как Start a Multi-Trigger Acquisition on an External Event, но обсуждаемое приобретение применимо только для входа на основе DAQ, а не для ввода на основе камеры (он также работает на переднем плане).

+0

Ничего просто не существует в среде MATLAB; вы можете захотеть использовать внешнюю библиотеку C++ на основе Mex или решение на основе Simulink. – Arcturus

+0

Какое устройство вы используете для записи напряжения? –

+0

Я не понимаю, почему это должно иметь значение, но вы можете видеть в коде это устройство NI (аналоговый USB-считыватель напряжения, такой как USB6009). – 2013-02-26 01:22:36

ответ

1

Это не будет полностью решить вашу проблему, но это может быть достаточно хорошо. После того, как вы синхронизируете сигнал с частотой 50 Гц, вы можете использовать clock, чтобы создать отметки времени для обоих типов ваших данных (изображение камеры и аналоговое напряжение). Поскольку функция clock не принимает практически никакого времени (т.е. ниже 1e-7 сек), вы можете попробовать изменить в вашей SaveData функции соответственно:

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

И в течение цикла добавить:

timestamp(i,:)=clock; 
+1

Лучше использовать tic и toc, которые Mathworks рекомендует для измерения времени, поскольку они не Не полагайтесь на вызовы системного времени. –

+0

спасибо за ответ и комментарий, я попробую. – 2013-03-07 22:17:06

0

Это но нет полного решения, но некоторые мысли, которые могут быть полезны.

Я получаю изображения и log.txt файл с DAQ следом (время и данные), но как я могу использовать внешний запуск (которые запускают камеру) или некоторые другие часы, чтобы синхронизировать два?

Можете ли вы придумать способ калибровки вашей установки? То есть изменить свой эксперимент и создать отчетливое событие как в вашем потоке изображения, так и в измерении напряжения, которое можно использовать для синхронизации? Just like this ...

1

Можете ли вы использовать синхронизацию для запуска платы AD? Из руководства USB-6009 ...

Использование PFI 0 в качестве цифрового триггера - Когда задана задача аналогового ввода, вы можете настроить PFI 0 в качестве цифрового триггерного входа. Когда цифровой триггер активирован, задача AI ожидает восходящего или спадающего фронта на PFI 0 перед началом сбора. Чтобы использовать AI Start Trigger (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

Надеется, что это помогает, Карл

 Смежные вопросы

  • Нет связанных вопросов^_^