MATLAB 中的 GETSNAPSHOT 太慢
GETSNAPSHOT in MATLAB is too slow
我有一个代码可以使用 USB 视频采集卡从模拟相机获取图像。对我来说最大的问题是每当我使用 GETSNAPSHOT 获取图像时,该过程需要几秒钟才能执行,而设备的帧速率实际上是每秒 30 帧。有趣的是 preview(vidObj)
工作得很好。我知道有很多关于 GETSNAPHOT 为什么这么慢的讨论,并且有一个使用 TRIGGERCONFIG 非常受欢迎的建议解决方案,但出于某种原因,这对我提高图像采集率没有任何作用。我将在下面解释这两种情况:
直接使用 GETSNAPSHOT
obj = videoinput('winvideo', 2);
while someconditionhere
img= getsnapshot(cam); % extract frame i from the video
imshow(img);
%do stuff
end
使用 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
。您可以使用手动触发器加快速度。此外,通过修改 Image
的 CData
而不是调用 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);
我有一个代码可以使用 USB 视频采集卡从模拟相机获取图像。对我来说最大的问题是每当我使用 GETSNAPSHOT 获取图像时,该过程需要几秒钟才能执行,而设备的帧速率实际上是每秒 30 帧。有趣的是 preview(vidObj)
工作得很好。我知道有很多关于 GETSNAPHOT 为什么这么慢的讨论,并且有一个使用 TRIGGERCONFIG 非常受欢迎的建议解决方案,但出于某种原因,这对我提高图像采集率没有任何作用。我将在下面解释这两种情况:
直接使用 GETSNAPSHOT
obj = videoinput('winvideo', 2); while someconditionhere img= getsnapshot(cam); % extract frame i from the video imshow(img); %do stuff end
使用 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
。您可以使用手动触发器加快速度。此外,通过修改 Image
的 CData
而不是调用 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);