您的位置:首页 > 编程语言 > MATLAB

如何使用Matlab调用笔记本摄像头 - Matlab计算机视觉与机器认知学习笔记 - 001

2019-06-07 17:54 1216 查看

如何使用Matlab调用笔记本摄像头 - Matlab计算机视觉与机器认知学习笔记 - 001

如何使用Matlab调用笔记本摄像头

本文包括以下几点内容:

  1. 函数 imaqhwinfo 的介绍;
  2. 创建视频输入对象;
  3. 预览视频流及关闭;
  4. 获取图像、视频数据。
    该笔记较多的参考了书本、他山之石以及个人实践,仅为个人学习笔记,起自我监督的作用。
    如果有侵权,会尽快删除,请见谅!

1.函数 imaqhwinfo 的介绍及使用

了解该函数的最佳办法当属看MATLAB的文档:
https://ww2.mathworks.cn/help/imaq/imaqhwinfo.html?searchHighlight=imaqhwinfo&s_tid=doc_srchtitle
如果一下没看懂,也没事,可以TRANSLATE THIS PAGE.
函数 imaqhwinfo 主要是输出计算机有关图像采集硬件的信息。不输入任何参数时,该函数返回的是一个结构体,他包含了系统存在的适配器和MATLAB相关的版本信息。

info = imaqhwinfo %初次使用该函数时,可以不设定输入参数。
info =

包含以下字段的 struct:

InstalledAdaptors: {}
MATLABVersion: '9.6 (R2019a)'
ToolboxName: 'Image Acquisition Toolbox'
ToolboxVersion: '6.0 (R2019a)'

上面,我们是无法得知我们计算机有关图像获取的适配器的相关信息的,若要获取指定适配器的相关信息,还需要加上winvideo参数,如下所示

info = imaqhwinfo('winvideo')

但是如果你的显示了:

错误使用 imaqhwinfo (line 131)
To use the 'winvideo' adaptor, install the OS Generic support package via Add-On Explorer.

那你就需要点击 Add-On Explorer去安装了,到第三步的时候可能会花费一两分钟时间,不要着急。
安装完成之后,重新输入如下:

imaqhwinfo('winvideo')

ans =

包含以下字段的 struct:

AdaptorDllName: 'C:\ProgramData\MATLAB\SupportPackages\R2019a\toolbox\imaq\supportpackages\genericvideo\adaptor\win64\mwwinvideoimaq.dll'
AdaptorDllVersion: '6.0 (R2019a)'
AdaptorName: 'winvideo'
DeviceIDs: {[1]}
DeviceInfo: [1×1 struct]

这里我们就通过了函数 imaqhwinfo 得到了我们适配器的名称,为接下来的摄像头的调用作下铺垫。

2.创建视频输入对象

通过 videoinput 函数创建视频输入对象,该函数有诸多参数可以指定适配器名称,设备编号,视频格式等。

vid = videoinput('winvideo')
Summary of Video Input Object Using 'Lenovo EasyCamera'.

Acquisition Source(s):  input1 is available.

Acquisition Parameters:  'input1' is the current selected source.
10 frames per trigger using the selected source.
'MJPG_1280x720' 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.

3.预览视频流及关闭

为了测试得到的视频是否满足实际的要求,我们需要先对其进行预览。

preview(vid)  %建立在已经建立了上述vid变量的基础上的。

这样,就可以查看摄像头的实时录像了,如果想要关闭的话,使用函数close preview函数即可。
目前还是无法对图像进行保存的

4.获取图像、视频数据

获取图像数据是任何图像采集应用的核心,其过程分为三步:

  • 启动视频输入对象
  • 触发采集
  • 获取数据(现使用的是matlab,即将数据采集到MATLAB工作区)
%%
%打开摄像头代码
%调用视频摄像头
%语法:vid=videoinput(adaptorname,deviceID,format)(YUY2格式颜色发红)
vid=videoinput('winvideo',1,'YUY2_640x480');
%设置TriggerRepeat重复地触发
set(vid, 'TriggerRepeat', Inf);
%FramesPerTrigger每特定的帧数去触发捕获选定使用的视频源(FrameGrabInterval帧的抓取时间间隔)
set(vid,'FramesPerTrigger',1);
%设置返回色彩 rgb正常颜色,grayscale是灰度
set(vid,'ReturnedColorSpace','rgb');
%set(vid,'ReturnedColorSpace','grayscale');%如果想采集灰度图可取消注释
%获取分辨率,色彩数目等参数
%视频分辨率
vidRes=get(vid,'VideoResolution');
%色彩数目
nBands=get(vid,'NumberOfBands');
%himage:视频预览窗口对应的句柄,也就是说在指定的句柄对象中预览视频,该参数可以空缺。
%至于预览窗口的关闭和停止可以使用colsepreview和stoppreview函数
hImage=image(zeros(vidRes(2),vidRes(1),nBands));
preview(vid,hImage);

至此,我们已经获取、设定了图像采集各种参数,而且已经可以手动抓拍图片了,但是这个抓拍的仅仅是图片,还不能被保存到MATLAB的工作区域(当然可以被函数再次读进来)。
下面我们再对图和获取某个时刻摄像头中的画面和获取整个视频进行分别介绍和说明:

4.1. 获取某个时刻摄像头的画面

这个有两种办法,第一就是直接打开上述代码,然后手动点击保存按钮,即可随心自拍;
第二个办法通过代码实现,但是,你运行代码的时刻便是获取图像的时刻,但是可以直接将图像读进MATLAB工作区,且可随时调用。代码如下:

%%
frame = getsnapshot(vid);
figure;
imshow(frame);

4.2. 获取整个视频

借用 VideoWrite 函数将摄像头各个时刻的画面连结起来组成视频,然后再保存:

%%
%通过VideoWriter函数获取视频,并命名为test,格式为avi格式,也可以为mp4或者mj2。
writerObj = VideoWriter( ['test.avi'] );
%设置视频播放帧数,要是不设置就自动给为30了。
writerObj.FrameRate = 15;
%对 VideoWriter 对象调用 open 函数后,将无法更改属性的值。因此,请在打开视频文件进行写入之前修改属性值。
%这里打开将要保存的视频
open(writerObj);

for i = 1: 30
frame = getsnapshot(vid);
imshow(frame);
f.cdata = frame;%得到每一帧的RGB数据值
f.colormap = [];%设置颜色空间?
writeVideo(writerObj,f);%将数据从数组f写入名为writerObj的文件,使用时必须先要有open(writerObj),才能写入。
end

close(writerObj);%如果不关闭的话,是不会保存数据的。

OVER!

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: