Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2009-04-11
年龄: 38
帖子: 138
声望力: 19 ![]() |
![]()
如何使用MATLAB进行USB2.0摄像头的编程
Matlab中的图像获取工具箱给我们提供了必要的函数,我们直接调用就可以了。在在这帖中我们主要就是简单的介绍如何使用该工具箱进行对USB2.0摄像头的编程 废话不多说,我们开始言归正传了。但是一定记住你必须安装了PC摄像头才可以进行下面的东西,如果说首次安装摄像头最好重启下PC,否则可能出现没法识别摄像头。 整个过程我们需要做如下几件事情: 1、查询USB2.0Camera 的具体参数(imaqhwinfo) 2、创建视频输入对象(videoinput) 3、图像预览和显示(preview、stoppreview、closepreview和image) 4、获取视频图像(getsnapshot) 5、图像获取设备的获取和设置(get和set) 6、关闭视频对象(delete) 在正式讲解之前,我想说明下几个个在图像获取工具箱中的术语: 图像获取设备:比如摄像头、扫描仪 图像获取适配器:主要的目的是通过驱动在Matlab和图像获取设备之间传递信息 ROI:region-of-interest 感兴趣区域 在说说几个常用的函数,我们这里只是说明它的作用,具体如何使用参考帮助系统 getselectedsource imaqfind isvalid peekdata getdata imaqmontage 给我们一个摄像头我们必须知道他的相关参数,才可能进行我们的编程下。当然我们可以查询商家手册,但是那个累不累人呀。 Matlab的图像获取工具箱为我提供了imaqhwinfo(),来获取PC上以安装的图像获取硬件信息 没有输入参数时,返回一个结构体, 它包含了系统中存在的适配器和Matlab相关的版本信息(第一次我们一般使用这个) 代码: >> info=imaqhwinfo info = InstalledAdaptors: {'coreco' 'winvideo'}%这里可以看到我的PC上安装了两个适配器 MATLABVersion: '7.6 (R2008a)' ToolboxName: 'Image Acquisition Toolbox' ToolboxVersion: '3.1 (R2008a)' 有输入参数的时候,返回一个结构体,包含了指定的适配器的数据信息 代码: >> win_info=imaqhwinfo('winvideo')%我们看看第二适配器的具体参数 win_info = AdaptorDllName: [1x81 char]%适配器dll文件绝对路径 AdaptorDllVersion: '3.1 (R2008a)'%适配器dll文件版本 AdaptorName: 'winvideo'%s适配器名称 DeviceIDs: {[1]}%设备ID号,这个我们经常需要用到 DeviceInfo: [1x1 struct]%设备信息,这里主要是图像获取设备的一些参数,比较重要 %====================下面我们了解下,这个图像获取设备到底有哪些的详细信息吧==================== >> win_info.DeviceIDs ans = [1] >> dev_win_info=win_info.DeviceInfo dev_win_info = DefaultFormat: 'RGB24_320x240'%获取图片的默认格式 DeviceFileSupported: 0 DeviceName: 'USB PC CAMERA P227'%设备名称 DeviceID: 1%设备号 ObjectConstructor: 'videoinput('winvideo', 1)'%对象构建方式,这个绝大部分都是一样的 SupportedFormats: {1x12 cell}%获取的图像支持格式,一般都有好多种,上面的DefaultFormat只是默认格式而已 %==================================看看图像获取设备支持的图像格式================================== >> dev_win_info.SupportedFormats%可以看到我的PC上的摄像头支持下面12中图片格式 ans = Columns 1 through 5 'I420_160x120' 'I420_176x144' 'I420_320x240' 'I420_352x288' 'I420_640x480' Columns 6 through 9 'RGB24_1280x960' 'RGB24_160x120' 'RGB24_176x144' 'RGB24_320x240' Columns 10 through 12 'RGB24_352x288' 'RGB24_640x480' 'RGB24_800x600' 视频预览、采集和保存 (1)创建视频输入对象 obj = videoinput(adaptorname,deviceID,format) adaptorname:适配器名称,首次可以使用不带参数的imaqhwinfo函数获取 deviceID:设备ID号,首次可以通过imaqhwinfo函数获取 format:视频采集格式,可以通过DeviceInfo的SupportedFormats获取,不填写则使用默认格式 代码: >> obj = videoinput('winvideo',1,'RGB24_320x240')%这里我们使用默认的视频采集格式 Summary of Video Input Object Using 'USB PC CAMERA P227'. Acquisition Source(s): input1 is available. Acquisition Parameters: 'input1' is the current selected source. 10 frames per trigger using the selected source. 'RGB24_320x240' video data to be logged upon START. Grabbing first of every 1 frame(s). Log data to 'memory' on trigger. Trigger Parameters: 1 'immediate' trigger(s) on START. Status: Waiting for START. 0 frames acquired since starting. 0 frames available for GETDATA. (2)打开视频预览窗口 himage=preview(obj,himage) obj:视频采集对象 himage:视频预览窗口对应的句柄,也就是说在指定的句柄对象中预览视频,该参数可以空缺 至于预览窗口的关闭和停止可以使用colsepreview和stoppreview函数 代码: vidRes = get(obj, 'VideoResolution'); nBands = get(obj, 'NumberOfBands'); figure()%指定预览窗体显示的figure axes()%指定预览窗口显示的坐标系 hImage = image( zeros(vidRes(2), vidRes(1), nBands) ); preview(obj, hImage); (3)图像捕捉、显示和保存 代码: %frame是H×W×B的矩阵。H图像高度,由ROIPosition指定;w图像宽度,由ROIPosition指定;B索线个数,由NumberOfBands指定 frame = getsnapshot(obj); imshow(frame); imwrite(fame,'snap.jpg','jpg'); 实验步骤 1、 查询USB2.0Camera 的具体参数 输入 imaqInfo = imaqhwinfo 返回信息 InstalledAdaptors: {'winvideo'} MATLABVersion: '7.1 (R14SP3)' ToolboxName: 'Image Acquisition Toolbox' ToolboxVersion: '1.9 (R14SP3)' 输入imaqInfo.InstalledAdaptors 返回信息 ans = 'winvideo' 输入winvideoinfo = imaqhwinfo('winvideo') 返回信息 winvideoinfo = AdaptorDllName: [1x76 char] AdaptorDllVersion: '1.9 (R14SP3)' AdaptorName: 'winvideo' DeviceIDs: {[1]} DeviceInfo: [1x1 struct] 输入 winvideoinfo.DeviceInfo 返回信息 ans = DefaultFormat: 'YUY2_160x120' DeviceFileSupported: 0 DeviceName: 'USB 视频设备' DeviceID: 1 ObjectConstructor: 'videoinput('winvideo', 1)' SupportedFormats: {1x5 cell} 输入device1 = winvideoinfo.DeviceInfo(1) 返回信息 device1 = DefaultFormat: 'YUY2_160x120' DeviceFileSupported: 0 DeviceName: 'USB 视频设备' DeviceID: 1 ObjectConstructor: 'videoinput('winvideo', 1)' SupportedFormats: {1x5 cell} 输入device1.DeviceName 返回信息 ans = USB 视频设备 输入device1.DeviceID 返回信息 ans = 1 输入device1.DefaultFormat 返回信息 ans = YUY2_160x120 输入device1.SupportedFormats 返回信息 Columns 1 through 4 'YUY2_160x120' 'YUY2_176x144' 'YUY2_320x240' 'YUY2_352x288' Column 5 'YUY2_640x480' 2、 最简单采集实验,输入如下代码,可以得到预览下的默认格式的摄像头捕捉窗口obj=videoinput('winvideo',1); preview(obj); 3、 输入如下代码 vidobj = videoinput('winvideo',1,'YUY2_640x480'); sources = vidobj.Source; whos sources set(vidobj,'SelectedSourceName','input1'); sources selectedsrc = getselectedsource(vidobj); get(selectedsrc); delete(vidobj); clear vidobj; 返回信息 Name Size Bytes Class sources 1x1 726 videosource object Grand total is 30 elements using 726 bytes Display Summary for Video Source Object: Index: SourceName: Selected: 1 'input1' 'on' General Settings: Parent = [1x1 videoinput] Selected = on SourceName = input1Tag = Type = videosource Device Specific Properties: BacklightCompensation = on Brightness = -16 Contrast = 120 FrameRate = 30.0000 Gamma = 60 Hue = 0 Saturation = 40 Sharpness = 3 4、 输入如下代码 clc; clf; clear all; imaqmem(30000000); %申请内存空间 %ADAPTOR:MATLAB与视频设备之间的接口,主要的目的是传递信息 vid = videoinput('winvideo', 1, 'YUY2_640x480'); preview(vid); start(vid); h=figure('NumberTitle','off','Name','视频',... 'MenuBar','none','color','c',... 'Position', [0, 0, 1, 1], 'Visible', 'on'); %新建窗口 set(h,'doublebuffer','on','outerposition',get(0,'screensize')); h1=axes('Position', [0.02, 0.1, 0.4, 0.8],'Parent',h); %新建显示窗口 hold on; axis off; while ishandle(h) %判断是否有效的图像对象句柄 a=getsnapshot (vid); % 捕获图像 flushdata(vid); %清除数据获取引擎的所有数据、置属性SamplesAvailable为0 imshow(a); %显示图像 drawnow; % 实时更新图像 end; delete(vid); 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hmg25/archive/2...6/4126122.aspx
__________________
看帖回帖,就是对我们最大的支持! |
![]() |
![]() |
![]() |
#2 |
初级会员
注册日期: 2010-09-17
年龄: 42
帖子: 3
声望力: 0 ![]() |
![]()
这个帖非常好
看完后对我帮助很大 谢谢啊 |
![]() |
![]() |
![]() |
#3 |
初级会员
注册日期: 2010-12-22
年龄: 35
帖子: 4
声望力: 0 ![]() |
![]()
我想知道这个贴是不是指用matlab调用摄像头,带摄像头的笔记本可以吗?
|
![]() |
![]() |
![]() |
#4 |
初级会员
注册日期: 2009-10-06
年龄: 38
帖子: 2
声望力: 0 ![]() |
![]()
LZ太伟大了,几行命令就搞定摄像头。回答三楼的问题,笔记本自带的摄像头是可以的
|
![]() |
![]() |
![]() |
#5 |
初级会员
注册日期: 2011-01-19
帖子: 2
声望力: 0 ![]() |
![]()
监视窗口的图像很清楚,但截取出来的图像怎么就不清楚了呢,这是为什么
|
![]() |
![]() |
![]() |
#6 |
初级会员
注册日期: 2011-03-18
年龄: 37
帖子: 3
声望力: 0 ![]() |
![]()
感谢楼主,楼主很好,很强大!
|
![]() |
![]() |
![]() |
#7 |
初级会员
注册日期: 2011-04-06
帖子: 2
声望力: 0 ![]() |
![]()
牛啊牛啊牛啊牛啊牛啊牛啊
|
![]() |
![]() |
![]() |
#8 |
初级会员
注册日期: 2011-08-06
帖子: 2
声望力: 0 ![]() |
![]()
对我很有用,谢谢了!!!
|
![]() |
![]() |
![]() |
#9 |
初级会员
注册日期: 2011-11-07
帖子: 3
声望力: 0 ![]() |
![]()
楼主很强大 谢谢分享
|
![]() |
![]() |
![]() |
#10 |
游客
帖子: n/a
|
![]()
很好,很强大 。欢迎楼主继续分享 。
|
![]() |