Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据

1. 两种获取摄像头的方式

Matlab自身不支持直接读取摄像头数据,需要安装硬件支持包才可以获取,目前常用的有两个包:
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第1张图片

第一个是 MATLAB Support Package for USB Webcams,这个包可以获取任何USB摄像头的图像(UVC),也可以获取电脑自带摄像头的数据,兼容 R2014a 到 R2020a 的版本。

第二个是Image Acquisition Toolbox Support Package for OS Generic Video Interface,更加通用,它也兼容 R2014a 到 R2020a 的版本。(推荐)

2. 使用Image Acquisition Toolbox

2.1. 安装硬件支持包

首先执行这条命令打开摄像头,测试是否可以调用videoinput函数:

video_source = videoinput('winvideo',1)

如果出现图中的错误,那么恭喜你,需要手动安装硬件支持包了。
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第2张图片
点击获取附加功能中的获取硬件支持包:
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第3张图片
按照图中所示找到该支持包:
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第4张图片

安装支持包:
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第5张图片
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第6张图片

这个安装之前需要登录Matlab账号,安装过程也比较慢。

2.2. 玩转摄像头

① 查看电脑上已经安装的图像适配器
Matlab的图像获取工具箱(第一步安装的硬件支持包)中提供了函数,可以获取查询当前PC上已经连接的摄像头信息,函数如下:

imaqhwinfo()

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第7张图片
其中InstalledAdaptors的值给出了当前电脑上已经安装的摄像头适配器个数,这里我的电脑上只有一个:winvideo

② 查看摄像头设备具体参数
使用该命令查看上一步获取到的图像适配器的具体参数:

win_info = iimaqhwinfo('winvideo')

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第8张图片

可以看到其中给出了该图像适配器具体的一些参数,特别需要注意的是,该函数返回了连接在当前图像适配器winvideo上的所有摄像头的设备ID和设备信息

当前我的电脑上一共有两个摄像头,一个是笔记本电脑内置的摄像头,另一个是我连接的USB 2.0 摄像头,接下来以USB摄像头为例,说明如何查看摄像头的设备ID和具体信息:

在工作区找到保存信息的变量win_info,双击查看其值:

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第9张图片

可以看到,两个摄像头的设备ID分别为1和2,一般来说,电脑内置的摄像头的ID为1。

同样,双击win_info.DeviceInfo变量,可以查看摄像头的具体参数:
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第10张图片

这里摄像头支持的格式有40多种,不方便查看,我们可以在命令行查看:

win_info.DeviceInfo.SupportedFormats

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第11张图片

③ 创建视频输入对象

使用如下的命令来创建一个视频输入对象:

video_obj = videoinput(adaptorname,deviceID,format)

该函数的三个参数说明如下:

  • adaptorname:适配器名称(必须)
  • deviceID:设备ID号(必须)
  • format:视频采集格式(不填写则使用默认)

如下,我要创建USB摄像头的视频输入对象:

video_obj = videoinput('winvideo',2)

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第12张图片

④ 预览视频对象
使用如下命令即可预览视频对象,该函数会自动打开一个窗口,播放摄像头画面:

preview(video_obj)

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第13张图片

3. 使用USB Webcams包

3.1. 安装硬件支持包

点击获取附加功能中的获取硬件支持包:
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第14张图片
按照图中所示找到该支持包:
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第15张图片

安装支持包:
Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第16张图片

这个包不需要授权,只需要安装之前登录Matlab账号即可,安装过程非常快。

3.2. 玩转摄像头

① 查看当前摄像头设备列表

webcamlist

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第17张图片

需要注意,使用webcam的时候,下标从1开始,1对应USB Camera,2对应Integrated Camera。

② 获取视频对象
一行代码即可获取,非常舒服,比如获取外接USB摄像头的输入对象:

cam1 = webcam(1)

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第18张图片
同样可以获取电脑自带摄像头的输入对象:

cam1 = webcam(2)

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第19张图片

③ 预览视频对象
使用如下命令即可预览视频对象,该函数会自动打开一个窗口,播放摄像头画面:

preview(cam1)

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第20张图片

④ 查看摄像头支持的分辨率并修改:

<刚刚获取的设备对象>.AvailableResolutions

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第21张图片
然后根据修改为需要的分辨率:

<刚刚获取的设备对象>.Resolution = <指定的分辨率>

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第22张图片
再次preview之后即可看到分辨率改变。

⑤ 用完之后清除对象

clear <刚刚获取的对象>

4. 在GUI中显示视频流并拍照

在Gui界面中显示视频流尽量使用Image Acquisition Toolbox。

4.1. 拖动控件,设计界面

在命令行输入guide启动设计界面,新建一个设计文件。

设计的界面如下:

Matlab上位机开发(四)Matlab获取自带摄像头或者USB摄像头数据_第23张图片

4.2. 实时显示摄像头画面

点击开启按钮后,在第一个坐标区实时显示摄像头画面,代码如下:

首先创建一个全局的视频输入对象:

global video_obj;
video_obj = videoinput('winvideo', 2, 'YUY2_640x480');

然后设置图像格式为RGB:

set(video_obj,'ReturnedColorSpace','rgb');

获取视频输入对象的信息,用于在坐标区显示:

videoRes = get(video_obj, 'VideoResolution');
nBands = get(video_obj, 'NumberOfBands');

转换,将视频输入对象与坐标区控件关联起来:

hImage = image(zeros(videoRes(2), videoRes(1), nBands),'parent',handles.axes1);

开始显示:

preview(video_obj,hImage);
start(video_obj);

完整的代码如下:

global video_obj;
video_obj = videoinput('winvideo', 2, 'YUY2_640x480');
set(video_obj,'ReturnedColorSpace','rgb');
videoRes = get(video_obj, 'VideoResolution');
nBands = get(video_obj, 'NumberOfBands');
hImage = image(zeros(videoRes(2), videoRes(1), nBands),'parent',handles.axes1);
preview(video_obj,hImage);
start(video_obj);

接下来启动后,点击开启按钮,就可以在第一个坐标区看到摄像头实时画面了。

4.3. 关闭摄像头实时显示

点击关闭按钮后,关闭在第一个坐标区实时显示的摄像头画面,代码如下:

global video_obj;
stop(video_obj);
closepreview(video_obj);
delete(video_obj);

接下来启动后,点击关闭按钮,就可以关闭在第一个坐标区看到摄像头实时画面了。

4.4. 拍照(抓取画面)

点击拍照按钮,即可抓取当前视频流的画面,显示在第二个坐标区控件,代码如下:

global video_obj;
mypic = getsnapshot(video_obj);
axes(handles.axes2);
imshow(mypic);

如果需要对抓取的图片进行处理,则将图片变量mypic设为全局变量!

启动后即可看到效果。

接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。

你可能感兴趣的:(Matlab上位机开发)