Multithreading MATLAB多摄像机同步记录

Multithreading MATLAB多摄像机同步记录,multithreading,matlab,video-capture,Multithreading,Matlab,Video Capture,我目前正在使用两台摄像机进行视频录制,我正在尝试找出如何同时启动和停止两台摄像机的录制 我正在使用getsnapshot和VideoWriter获取帧并存储视频文件。然而,使用for循环时,它们之间总是有延迟,这也会影响相机的帧速率 我尝试使用parfor,但它从未写入视频文件,似乎有一些内部问题。我还尝试了磁盘记录器,但只有一个视频可以正确写入文件,而另一个基本上不包含任何内容 如果您能给我一些建议或简短的示例代码来解释并行计算如何运行多个摄像头,我将不胜感激 另外,我正在使用成像源Dmm 4

我目前正在使用两台摄像机进行视频录制,我正在尝试找出如何同时启动和停止两台摄像机的录制

我正在使用
getsnapshot
VideoWriter
获取帧并存储视频文件。然而,使用for循环时,它们之间总是有延迟,这也会影响相机的帧速率

我尝试使用
parfor
,但它从未写入视频文件,似乎有一些内部问题。我还尝试了
磁盘记录器
,但只有一个视频可以正确写入文件,而另一个基本上不包含任何内容

如果您能给我一些建议或简短的示例代码来解释并行计算如何运行多个摄像头,我将不胜感激


另外,我正在使用成像源Dmm 42BUC03-ML摄像机,以防信息有用。这是一台OEM相机。

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

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

    您面临着一个不平凡的挑战,尤其是选择一种不支持多线程的编程语言。对于MATLAB,我不知道任何解决方案。如果您愿意切换到simulink,则可以快速构建解决方案。使用两个块并连接输出,以获得连接两个数据的宽屏视频。然后,你可以很容易地检查它是否真的是同步录制的,例如,在两台摄像机前放下东西,并验证两台摄像机在同一高度看到它。