我有一个代码,可以使用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
我试图让预览窗口在后台运行(我在网上找到的原始解决方案)但是我的while循环没有执行。另外,如果在第一个代码中,我添加start(obj)
,那么它会给我一个错误:“在GETSNAPSHOT期间发生超时。”
我的想法已经不多了,我会在几个小时内到期。任何帮助将不胜感激!
答案 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