MATLAB中的GETSNAPSHOT太慢了

时间:2015-05-26 21:41:19

标签: image matlab real-time

我有一个代码,可以使用USB视频采集卡从模拟摄像机获取图像。对我来说,巨大的问题是每当我使用GETSNAPSHOT获取图像时,该过程需要几秒钟才能完成,而设备的帧速率实际上是每秒30帧。有趣的是preview(vidObj)完美无缺。我知道有很多关于为什么GETSNAPHOT如此缓慢的讨论,并且有一个提议的解决方案使用TRIGGERCONFIG非常受欢迎,但出于某种原因,这对我来说无法提高图像采集速率。我将在下面解释这两种情况:

  1. 直接使用GETSNAPSHOT

    obj = videoinput('winvideo', 2);
       while someconditionhere
       img= getsnapshot(cam); % extract frame i from the video
       imshow(img);
       %do stuff
    end
    
  2. 使用TRIGGERCONFIG

    obj = videoinput('winvideo', 2);
    triggerconfig(obj,'manual');
    start(obj);
    while someconditionhere
        img= getsnapshot(cam); % extract frame i from the video
        imshow(img);
        %do stuff
    end
    
  3. 我试图让预览窗口在后台运行(我在网上找到的原始解决方案)但是我的while循环没有执行。另外,如果在第一个代码中,我添加start(obj),那么它会给我一个错误:“在GETSNAPSHOT期间发生超时。”

    我的想法已经不多了,我会在几个小时内到期。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

您可以尝试以下链接吗?有人在matlab中进行了实时鼠标指针控制,所以他们应该得到相当快的响应。 http://www.mathworks.com/matlabcentral/fileexchange/42943-virtual-mouse--mouse-pointer-control-using-color-detection/content/MouseControl.m

你会发现有用的主要代码应该是这个 -

cam = imaqhwinfo; % Get Camera information
cameraName = char(cam.InstalledAdaptors(end));
cameraInfo = imaqhwinfo(cameraName);
cameraId = cameraInfo.DeviceInfo.DeviceID(end);
cameraFormat = char(cameraInfo.DeviceInfo.SupportedFormats(end));

vidDevice = imaq.VideoDevice(cameraName, cameraId, cameraFormat, ... % Input Video from current adapter
                'ReturnedColorSpace', 'RGB');

while (condition)
   rgbFrame = step(vidDevice); % Acquire single frame

答案 1 :(得分:0)

我的一位朋友和我设法解决了这个问题中描述的问题,我只是想描述一下,如果有人需要知道:

 cam = imaq.VideoDevice('winvideo');
  • 我没有像之前那样使用VideoReader,所以我可以使用step函数绘制每个帧,并且速度更快:

    I = step(cam);
    h = imagesc(I);
    set(h, 'EraseMode', 'none');
    
  • 我在开始使用上面的代码循环之前捕获了第一帧,然后我开始循环以一次获取一帧:

    img = step(cam);
    set(h, 'CData', img);
    
  • 除了imshow之外,上述内容还会删除getsnapshot,这会减慢图像绘制速度。

这显着加快了代码速度,最高可达30 fps。希望这有帮助!

答案 2 :(得分:0)

关键是不要使用getsnapshot,这会带来很多开销。您可以使用手动触发器来加快速度。另外,通过修改CData的{​​{1}}而不是调用Image,可以减少显示数据的时间。

这是一个基于您的代码的最小示例:

imshow