您的当前位置:首页正文

如何使用MATLAB进行USB2.0摄像头的编程

2024-11-10 来源:个人技术集锦

Matlab中的图像获取工具箱给我们提供了必要的函数,我们直接调用就可以了。在在这帖中我们主要就是简单的介绍如何使用该工具箱进行对USB2.0摄像头的编程

废话不多说,我们开始言归正传了。但是一定记住你必须安装了PC摄像头才可以进行下面的东西,如果说首次安装摄像头最好重启下PC,否则可能出现没法识别摄像头。

整个过程我们需要做如下几件事情:
1
、查询USB2.0Camera 的具体参数(imaqhwinfo)
2
、创建视频输入对象
(videoinput)
3
、图像预览和显示(previewstoppreviewclosepreview
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
:视频采集格式,可以通过DeviceInfoSupportedFormats获取,不填写则使用默认格式

代码:

>> 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
:视频预览窗口对应的句柄,也就是说在指定的句柄对象中预览视频,该参数可以空缺
至于预览窗口的关闭和停止可以使用colsepreviewstoppreview函数

代码:

vidRes = get(obj, 'VideoResolution');
nBands = get(obj, 'NumberOfBands');
figure()%
指定预览窗体显示的
figure
axes()%
指定预览窗口显示的坐标系

hImage = image( zeros(vidRes(2), vidRes(1), nBands) );
preview(obj, hImage);

(3)图像捕捉、显示和保存

代码:

%frameH×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);     %清除数据获取引擎的所有数据、置属性SamplesAvailable0

    imshow(a);                   %显示图像

    drawnow;                     % 实时更新图像

end;

delete(vid);

 

Top