我目前正在使用两台摄像机进行视频录制,我正试图弄清楚如何同时开始和停止两台摄像机的录制。
我正在使用getsnapshot
和VideoWriter
来获取帧并存储视频文件。然而,对于for循环,它们之间总是存在延迟,并且它也会损害摄像机的帧速率。
我尝试使用parfor
,但它从不写入视频文件,似乎有一些内部问题。我也尝试了DiskLogger
,但只有一个视频可以正确写入文件而另一个基本上不包含任何内容。
我真的很感激任何建议或简短的示例代码来解释并行计算如何运行多个摄像头!
P.S。我正在使用成像源Dmm 42BUC03-ML相机,以防信息有用。它是一台OEM相机。
答案 0 :(得分:0)
您将无法使用软件获得同步帧率,但您可能会获得可接受的结果。基本上,您必须将捕获每个帧所需的时间减少到最小,并且这次设置最大帧速率(在您的情况下,两个摄像机的帧速率/ 2)。我使用两种技术在matlab中实现了可接受的视频录制:
创建一个计时器对象,以定期捕获帧。
请勿使用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
您需要为第二台摄像机创建第二个摄像机对象,但您可以为两者使用相同的计时器对象。您还可以为第二个摄像头创建第二个计时器对象,但不保证两个计时器执行之间的同步。