由于(我猜)每次调用都会初始化网络摄像头,因此 getsnapshot 函数需要花费很多时间。如果您要获取高帧频的图像,这将是一个问题。

我欺骗我偶然发现的是调用 preview 函数,该函数使网络摄像头处理程序保持打开状态,从而使getsnapshot几乎是瞬时的,但它使一个小的预览窗口保持打开状态:

% dummy example
cam = videoinput(...);
preview(cam);

while(1)
    img = getsnapshot(cam);
    % do stuff
end

有没有一种“清洁”的方法来加快getsnapshot的速度? (未打开预览窗口)

最佳答案

您可以使用为视觉应用程序专门构建的新“机器视觉”工具箱。参见下面的代码:

vid = videoinput('winvideo', 1, 'RGB24_320x240'); %select input device

hvpc = vision.VideoPlayer;   %create video player object

src = getselectedsource(vid);
vid.FramesPerTrigger =1;
vid.TriggerRepeat = Inf;
vid.ReturnedColorspace = 'rgb';
src.FrameRate = '30';
start(vid)

%start main loop for image acquisition
for t=1:500
  imgO=getdata(vid,1,'uint8');    %get image from camera
  hvpc.step(imgO);    %see current image in player
end

如您所见,您可以使用getdata获取图像。 Matlab视频应用程序的瓶颈是预览窗口,该窗口大大延迟了编写代码的时间。新的vision.VideoPlayer的速度要快很多(我在Matlab的实时视觉应用程序中使用了此代码。当我编写了没有视觉工具箱的第一个版本时,获得了约18 fps的帧速率并使用了新的工具箱。到70左右!)。

注意:我需要使用Matlab的图像应用程序中的速度,您应该真正考虑通过mex使用OpenCV库来获得良好的图像处理性能。

09-12 11:47