matlab+snapshot采集图片

最近用matlab从摄像头获取图像+处理

在网上看了不少别人的日志都是获取设备信息,然后用preview或者getsnapshot两个函数,

preview函数是从摄像头获取图像直接在窗口中显示

getsnapshot则是抓取一帧图像。

对于图像处理,当然是抓取图像,然后处理,再显示,显然preview就不能满足要求了。

但对于不少现有的代码存在用getsnapshot函数获取的帧率很低的问题,

http://www.mathworks.cn/cn/help/imaq/examples/acquiring-a-single-image-in-a-loop.html

上面这个网页讲的较详细,

The GETSNAPSHOT function performs a lot of work when it is called. It must connect to the device, configure it, start the acquisition, acquire one frame, stop the acquisition, and then close the device. This means that the acquisition of one frame can take significantly longer than would be expected based on the frame rate of the camera. To illustrate this, call GETSNAPSHOT in a loop.

GETSNAPSHOT函数在调用的时候作了一系列处理,包括连接设备、配置、开始采集、获取一帧图像,停止采集、关闭设备。因此获取一帧图像需要花相当长的时间。因此通常情况下直接调用该函数会存在帧率低的问题,现象就是直接采集+显示就会出现很卡的现象。


这个网页也讲了解决办法,代码贴在下边供大家参考吧,也可以去参考原网页。

clc
close all

vidobj = videoinput('winvideo',1,'YUY2_320x240');
triggerconfig(vidobj,'manual');
start(vidobj);
tic 
for i = 1:1000
     snapshot = getsnapshot(vidobj);
     frame = ycbcr2rgb(snapshot);
     imshow(frame);
%      pause(0.033);
end
elapsedTime = toc
timePerFrame = elapsedTime/1000
effectiveFrameRate = 1/timePerFrame

stop(vidobj);
delete(vidobj);
disp('end');
我的摄像头获取的图像是YUV格式,因此在采集函数getsnapshot后面添加了ycrcb2rgb函数进行格式转换,然后直接显示。至于后面的pause(0.033)是一个延时函数,可要可不要。通常情况下人眼对于30帧以上的图像已经认为很流畅了。

使用以上代码可以顺利采集图像,基本可以达到实时显示。如果要对采集到的图像进行处理,只需要imshow函数前添加处理代码即可。

对于最后的delete(vidobj) 这句要解释一下,如果不添加这一句,当程序结束再重新运行时,会提示设备被占用,不能从该设备获取图像。切记

最后的timePerFrame会在matlab主程序的窗口中显示帧率


我的运行数据,虽然是不断更新图片,对于30帧每秒人眼基本看不出是图片更新。

timePerFrame =
   0.0342
effectiveFrameRate =
   29.2812
end


评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值