2016-03-02 104 views
0

我目前正在使用兩個攝像頭進行視頻錄製,我正試圖弄清楚如何同時啓動和停止兩個攝像頭的錄製。MATLAB同時錄製多個攝像頭

我使用getsnapshotVideoWriter來獲取幀和存儲視頻文件。但是,使用for循環時,它們之間始終存在延遲,並且會降低攝像機的幀速率。

我試過使用parfor但它從不寫入視頻文件,似乎有一些內部問題。我也嘗試了DiskLogger,但只有一個視頻會正確寫入文件,另一個基本上不包含任何內容。

我真的很感激任何建議或簡短的示例代碼來解釋並行計算如何運行多個攝像頭!

P.S.我使用成像源Dmm 42BUC03-ML相機,以防信息有用。這是一個OEM相機。

+0

您正面臨一個非平凡的挑戰,尤其是選擇一種不支持多線程的編程語言。對於MATLAB我不知道任何解決方案。如果您願意切換到simulink,您可以快速構建解決方案。使用兩個[從視頻設備](http://www.mathworks.com/help/imaq/saving-video-data-to-a-file.html)塊並連接輸出以獲得連接兩個數據的寬屏視頻。然後你可以很容易地檢查它是否真的是同步錄製的,例如在兩臺攝像機前放置一些東西,並確認兩者在同一高度。 – Daniel

回答

0

您將無法使用軟件獲得同步幀率,但您可能能夠獲得可接受的結果。基本上你必須減少捕獲每幀所需的時間到最小,這次設置你的最大幀速率(在你的情況下,兩個攝像機的幀率/ 2)。我使用兩種技術在matlab中實現了可接受的視頻錄製:

  1. 創建一個定時器對象以定期捕獲幀。

  2. 請勿使用getsnapshot。它很慢。相反,請手動配置相機 ,然後發出觸發命令以捕獲圖像。

此代碼說明了一個攝像頭的想法:

function RecordFromCamera 
% RECORDFROMCAMERA Captures still images and appends them to a video file 

% % Camera setup 
cam_fps = 1; % target framerate. Actual performance depends on hardware. 

camInfo=imaqhwinfo; 
cam = videoinput(camAdaptor,camInfo.DeviceID,camInfo.DefaultFormat); 
% setup camera for individual image mode 
triggerconfig(cam, 'manual'); 
set(cam,'TriggerRepeat',Inf); 
set(cam,'FramesPerTrigger',1); 


% % Timer Object for capturing camera images 
camTimer=timer('ExecutionMode','fixedRate','Period',1/cam_fps,'Name','camTimer'); 
set(camTimer,'TimerFcn',@getCamImage); 
% save the camera object for the timer to use 
camTimerInfo.cam=cam; 
camTimerInfo.video=VideoWriter('camera_video_images.avi','Motion JPEG AVI'); 
set(camTimer,'UserData',camTimerInfo); 


% Test the functionality; capture images for 5 seconds 
start(camTimer) 
pause(5) 
stop(camTimer) 
delete(timerfind) 


%% sub: getCamImage 
function getCamImage(obj,event) 
% GETCAMIMAGE gets and saves an image from the camera 
% Intended for use as a TimerFcn 

disp('getCamImage') 
% disp(event.Data) % this will include a timestamp 

% the camera handle is stored in the UserData 
camTimerInfo=obj.UserData; 

% get an image, add it to video file 
try 

    trigger(camTimerInfo.cam); 
    pic=getdata(camTimerInfo.cam,1); 
    writeVideo(camTimerInfo.video,pic); 

catch imgEx 
    fprintf(1,'getCamImage: WARNING: camera image acquisition error at %s\n "%s"\n',datestr(now),imgEx.message); 
    %stop(obj); 
end 

您需要創建第二相機的第二相機的對象,但你可以使用同一個定時器對象兩者。您也可以爲第二臺攝像機創建第二個計時器對象,但不保證兩個計時器執行之間的同步。