【问题标题】:MATLAB simultaneous recording for multiple camerasMATLAB同时记录多个相机
【发布时间】:2016-03-04 03:15:04
【问题描述】:

我目前正在使用两台摄像机进行视频录制,我正在尝试弄清楚如何同时开始和停止两台摄像机的录制。

我正在使用getsnapshotVideoWriter 来获取帧并存储视频文件。但是,使用 for 循环时,它们之间总是存在延迟,并且还会影响相机的帧速率。

我尝试使用parfor,但它从不写入视频文件并且似乎有一些内部问题。我也试过DiskLogger,但只有一个视频可以正确写入文件,另一个基本上什么都不包含。

如果有任何建议或简短的示例代码来解释并行计算如何用于运行多个摄像头,我将不胜感激!

附:我正在使用成像源 Dmm 42BUC03-ML 相机,以防信息有所帮助。它是 OEM 相机。

【问题讨论】:

  • 您面临着一个不小的挑战,尤其是选择不支持多线程的编程语言。对于 MATLAB,我不知道有任何解决方案。如果您愿意切换到 simulink,您可以快速构建解决方案。使用两个from video device 块并连接输出以获得连接两个数据的宽屏视频。然后您可以轻松检查它是否真的同步录制,例如在两个摄像头前丢东西并验证两者在相同高度看到它。

标签: multithreading matlab video-capture


【解决方案1】:

您将无法使用软件获得同步的帧速率,但您可能会获得可接受的结果。基本上,您必须将捕获每一帧所需的时间减少到最低限度,这次设置您的最大帧率(在您的情况下,两个摄像机的帧率/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

您需要为第二个摄像头创建第二个摄像头对象,但您可以为这两个摄像头使用相同的计时器对象。您还可以为第二个摄像头创建第二个计时器对象,但不能保证两个计时器执行之间的同步。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多