Matlab自身不支持直接读取摄像头数据,需要安装硬件支持包才可以获取,目前常用的有两个包:
第一个是 MATLAB Support Package for USB Webcams,这个包可以获取任何USB摄像头的图像(UVC),也可以获取电脑自带摄像头的数据,兼容 R2014a 到 R2020a 的版本。
第二个是Image Acquisition Toolbox Support Package for OS Generic Video Interface,更加通用,它也兼容 R2014a 到 R2020a 的版本。(推荐)
首先执行这条命令打开摄像头,测试是否可以调用videoinput函数:
video_source = videoinput('winvideo',1)
如果出现图中的错误,那么恭喜你,需要手动安装硬件支持包了。
点击获取附加功能中的获取硬件支持包:
按照图中所示找到该支持包:
这个安装之前需要登录Matlab账号,安装过程也比较慢。
① 查看电脑上已经安装的图像适配器
Matlab的图像获取工具箱(第一步安装的硬件支持包)中提供了函数,可以获取查询当前PC上已经连接的摄像头信息,函数如下:
imaqhwinfo()
其中InstalledAdaptors
的值给出了当前电脑上已经安装的摄像头适配器个数,这里我的电脑上只有一个:winvideo
。
② 查看摄像头设备具体参数
使用该命令查看上一步获取到的图像适配器的具体参数:
win_info = iimaqhwinfo('winvideo')
可以看到其中给出了该图像适配器具体的一些参数,特别需要注意的是,该函数返回了连接在当前图像适配器winvideo
上的所有摄像头的设备ID和设备信息!
当前我的电脑上一共有两个摄像头,一个是笔记本电脑内置的摄像头,另一个是我连接的USB 2.0 摄像头,接下来以USB摄像头为例,说明如何查看摄像头的设备ID和具体信息:
在工作区找到保存信息的变量win_info
,双击查看其值:
可以看到,两个摄像头的设备ID分别为1和2,一般来说,电脑内置的摄像头的ID为1。
同样,双击win_info.DeviceInfo
变量,可以查看摄像头的具体参数:
这里摄像头支持的格式有40多种,不方便查看,我们可以在命令行查看:
win_info.DeviceInfo.SupportedFormats
③ 创建视频输入对象
使用如下的命令来创建一个视频输入对象:
video_obj = videoinput(adaptorname,deviceID,format)
该函数的三个参数说明如下:
如下,我要创建USB摄像头的视频输入对象:
video_obj = videoinput('winvideo',2)
④ 预览视频对象
使用如下命令即可预览视频对象,该函数会自动打开一个窗口,播放摄像头画面:
preview(video_obj)
点击获取附加功能中的获取硬件支持包:
按照图中所示找到该支持包:
这个包不需要授权,只需要安装之前登录Matlab账号即可,安装过程非常快。
① 查看当前摄像头设备列表
webcamlist
需要注意,使用webcam的时候,下标从1开始,1对应USB Camera,2对应Integrated Camera。
② 获取视频对象
一行代码即可获取,非常舒服,比如获取外接USB摄像头的输入对象:
cam1 = webcam(1)
cam1 = webcam(2)
③ 预览视频对象
使用如下命令即可预览视频对象,该函数会自动打开一个窗口,播放摄像头画面:
preview(cam1)
④ 查看摄像头支持的分辨率并修改:
<刚刚获取的设备对象>.AvailableResolutions
<刚刚获取的设备对象>.Resolution = <指定的分辨率>
⑤ 用完之后清除对象
clear <刚刚获取的对象>
在Gui界面中显示视频流尽量使用Image Acquisition Toolbox。
在命令行输入guide
启动设计界面,新建一个设计文件。
设计的界面如下:
点击开启按钮后,在第一个坐标区实时显示摄像头画面,代码如下:
首先创建一个全局的视频输入对象:
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);
接下来启动后,点击开启按钮,就可以在第一个坐标区看到摄像头实时画面了。
点击关闭按钮后,关闭在第一个坐标区实时显示的摄像头画面,代码如下:
global video_obj;
stop(video_obj);
closepreview(video_obj);
delete(video_obj);
接下来启动后,点击关闭按钮,就可以关闭在第一个坐标区看到摄像头实时画面了。
点击拍照按钮,即可抓取当前视频流的画面,显示在第二个坐标区控件,代码如下:
global video_obj;
mypic = getsnapshot(video_obj);
axes(handles.axes2);
imshow(mypic);
如果需要对抓取的图片进行处理,则将图片变量mypic设为全局变量!
启动后即可看到效果。
接收更多精彩文章及资源推送,欢迎订阅我的微信公众号:『mculover666』。