MATLAB 中的 GETSNAPSHOT 太慢

GETSNAPSHOT in MATLAB is too slow

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

我试图在后台保留预览 window 运行(我在网上找到的一个粗略的解决方案)但是我的 while 循环没有执行。另外,如果在第一个代码中,我添加 start(obj),那么它会给我一个错误:"A timeout occurred during GETSNAPSHOT."

我 运行 没主意了,几个小时后就要交了。任何帮助将不胜感激!

你能试试下面的方法吗link。有人在 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

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

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

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

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

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

关键是不要使用开销很大的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);