【问题标题】:GETSNAPSHOT in MATLAB is too slowMATLAB中的GETSNAPSHOT太慢了
【发布时间】:2015-08-08 18:28:57
【问题描述】:

我有一个代码,它使用 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
    

我试图让预览窗口在后台运行(我在网上找到了一个粗略的解决方案),但是我的 while 循环没有执行。另外,如果在第一个代码中,我添加了start(obj),那么它会给我一个错误:“GETSNAPSHOT 期间发生超时。”

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

【问题讨论】:

  • 另外,我在使用我的网络摄像头时根本没有遇到这个问题,所以我知道代码可以工作,但真正发挥作用的是摄像头。而且由于预览效果很好,绝对不是 USB 视频采集卡导致任何问题。

标签: image matlab real-time


【解决方案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.7325 fps :( 之前更慢,所以这是一个改进,但仍然不能接受。
  • 对不起。我不能进一步帮助你,因为我目前有学生版的 matlab,它没有附带图像采集工具箱。
【解决方案2】:

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

 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。希望这会有所帮助!

【讨论】:

    【解决方案3】:

    关键是不要使用有很多开销的getsnapshot。您可以使用手动触发器加快速度。此外,通过修改ImageCData 而不是调用imshow,您可以减少显示数据的时间。

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

    vid = videoinput('winvideo', 2);
    
    triggerconfig(vid, 'manual');
    vid.TriggerRepeat = inf;
    vid.FramesPerTrigger = 1;
    
    start(vid);
    trigger(vid);
    
    img = getdata(vid);
    h = imshow(img);
    
    while (condition)
        trigger(vid);
        img = getdata(vid);
        h.CData = img;
    end
    
    stop(vid);
    delete(vid);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-18
      • 2013-03-10
      • 2014-06-07
      • 2016-05-31
      • 2011-07-07
      • 2015-08-23
      • 2012-07-05
      • 2016-01-08
      相关资源
      最近更新 更多