1 前言
如果你是视频技术处理研究领域的工程人员,那么用MATLAB&OpenCV打开摄像头,以及获取相关信息,是再常规不过的操作了。
本文是对MATLAB打开USB摄像头操作的知识点梳理和总结。
操作环境
- MATLAB 2015b
- Logitech HD720P
- Windows 10 Enterprise 64Bit
2 打开USB摄像头并写视频
2.1 摄像头相关操作
video_source = videoinput('winvideo',1);
preview(video_source);
这两行指令就可以打开USB摄像头,并预览显示了,当然,这里采用的都是默认参数,如果想控制视频参数,可以通过set方法。
video_source = videoinput('winvideo',1,‘RGB24_640x480’);
set(video_source,'ReturnedColorSpace','rgb');
preview(video_source);
此时打开摄像头成功,会有一个弹窗出现显示实时的画面。
如果想在某一时刻获取视频帧,可以这样操作
frame = getsnapshot(video_source);
image(frame);
获取的帧是从视频输入流中直接获取,可以通过时间函数来控制获取的频率,获取的帧可以存储在一个矩阵当中,作为一个视频流,方便计算。
2.2 写视频相关操作
打开摄像头,更多的操作是保存一段视频,这要用到一个保存操作。
video_source = videoinput('winvideo',1,'RGB24_640x480');
set(video_source,'ReturnedColorSpace','rgb');
preview(video_source);
file_name = 'test.avi';
% 创建一个写文件的对象
writer = VideoWriter(file_name,'Motion JPEG AVI');
writer.FrameRate = 30.0;
% 通过总帧数来控制视频长度
length = 300;
% MATLAB里的视频文件其实是包含了两个部分的复合结构体,
% 这两个部分,一个是色域colormap,一个是视频数据内容
file.colormap=[];
% 打开对象,开始录制
open(writer);
for i=1:length
frame = getsnapshot(video_source);
file.cdata = frame;
writeVideo(writer,file);
end
% 随手把该关的对象全关掉,是个好习惯
close(writer);
closepreview;
delete(video_source);
此时你会发现你的根目录文件夹里多了一个test.avi
的文件。VideoWriter能做的事情还有很多,比如使用set方法更改一些视频录制参数等。
3 查询摄像头设备信息指令
有些时候需要用到一些硬件信息,如视频编码格式。摄像头的硬件性能决定了其视频编码范围,相比于软件编码近乎万能的超凡能力(FFMPEG),硬件设备的硬编码能力十分有限,所以我们需要知道我们用的摄像头都有哪些信息和功能。
win_info = imaqhwinfo('winvideo');
此时会打开一个结构体,这个结构体几乎包含了我们所需要的一切了,简单一点,可以直接从工作站里面点击打开其中内容,其中最常用的是DeviceInfo
字段,里面包含其所支持的所有编码格式:
相对应的,其编码格式的完整查询指令:
win_info = imaqhwinfo('winvideo');
win_info.DeviceInfo.SupportedFormats;
可能更直观一点——
顺便吐槽一下,不知道为什么,网上的技术贴总是把视频编码的查询写得那么复杂,明明2行就能解决问题的事情,非要写七八行……
4 常见问题
videoinput函数报错问题
如果你是第一次使用MATLAB操作摄像头,有时候可能需要你安装一个插件来支持你的硬件设备,比如这种情况——
点击Support Package Installer,安装一个插件就行了,不需要重启MATLAB
如果你打不开这个界面,那么可能你的MATLAB没有破解完整,最糟糕的情况,可能需要重装MATLAB。
帧率问题
**软件手段只能在硬件范围内起控制作用。**尽管我们有一个设置帧率的set函数,但麻烦的是,硬件有时候并不受软件控制,比如你设置帧率为100fps,但是一般USB摄像头只能支持到30fps了,100+都是高速摄像机的水平(好几万的那种),所以只能到30fps。更常见的情况是,当时用笔记本电脑,笔记笨使用内置电池,电量低的时候,摄像头受操作系统电量管理的影响,此时帧率会变得可能只有10fps左右(就是画面看起来糊糊的那种)。所以帧率有时候真的很难控制,因情况而异,如果你需要帧率作为计算参数,可以考虑通过统计时间,通过总帧数反推实际帧率,得到真实值。
编码格式的问题
图像色域、视频编码格式、文件格式,这是三个概念,这里不再详细展开,但一般而言,几乎所有的设备都是支持RGB色域和RGB编码格式的,文件格式默认avi即可。如果对其他格式有想法,硬件又不支持,可以考虑使用视频转码(推荐使用FFMPEG)。
#5 总结
这些操作其实没有技术含量,如果需要更深入的探索,可以钻研MATLAB DOC。这里写个帖子,以记录自己过去所学的知识点。