matlab+snapshot采集图片

您所在的位置:网站首页 matlab的gui调用摄像头拍照 matlab+snapshot采集图片

matlab+snapshot采集图片

2023-12-22 23:53| 来源: 网络整理| 查看: 265

最近用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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3