文章目录
前言
- 需要下载安装OpenCV工具包的朋友,请前往 此处 ;
- 系统要求:Windows系统,LabVIEW>=2018,兼容32位和64位。
读取摄像头
从摄像头读取画面,需要用到 videoio 模块的 VideoCapture 类,选板位置如下图。
1. 使用 read 读取方式
从摄像头读取一帧画面,然后关闭摄像头,最简单的方法就是依照 “new - open - read - release” 流程,如下图。
其中,open.vi 切换到“index”模式,输入的参数index代表摄像头索引号(默认0),参数apiPreference代表优先调用的摄像头API类型(默认为CAP_ANY)。
如果摄像头打开较慢,可以将apiPreference改成与你的摄像头适配的值,比如Windows自带摄像头常用DirectShow,那么apiPreference就改为CAP_DSHOW。
2. 使用 grab-retrieve 读取方式
另一种读取方式是,先用 grab 快速将本帧标记为“已读”,然后再用 retrieve 获取本帧图像。相当于将 read 过程一分为二。这种方式在多摄像头同步方面十分有用。
3. 设置与获取参数
使用 VideoCapture 类下的 set 与 get 函数,可以设置、获取摄像头的参数。必须在 open 之后使用!
最常用的是修改视频分辨率参数,即 CAP_PROP_FRAME_WIDTH 和 CAP_PROP_FRAME_HEIGHT,分别代表画面的宽度和高度,如下图。
注意,如果你设置了摄像头不支持的分辨率,那么实际读取的图像尺寸与你设置的将会不同。
4. 小技巧:LV图片控件自适应缩放
为了能在各种分辨率下,让图像在LV控件中 “铺满+居中”,可以使用属性节点,动态调整图片控件的缩放因子与起点偏置。注意,这种方法仅仅是改变了LV控件属性,而Mat图像本身的尺寸并未改变。
- 对“picture”控件点右键 - create - Reference ,得到该控件的引用;
- 插入属性节点,分别获取控件绘图区域的宽、高,以及Mat图像的宽(cols)、高(rows);
- 将控件的宽、高,分别与Mat图像的宽、高做除法,取两个商中的较小值作为最佳缩放因子。缩放之后,若宽有剩余则水平调整居中,若高有剩余则垂直调整居中。同样使用属性节点,将计算得到的缩放因子和偏置量,写入picture控件的属性。
- 上述框图有点大,在范例文件夹下,有一个封装好的子VI,可以直接拿来用。
范例位置:/examples/Molitec/OpenCV/videoio/_subVI/fit_to_center.vi
5. 连续采集摄像头画面
使用LabVIEW的While循环结构,连续采集摄像头画面并显示,如下图。
open 与 read 都有bool类型的返回值,代表操作是否成功,可以作为程序异常退出的条件,从而避免由于摄像头意外断开或出错时造成LabVIEW程序死锁。用户点击stop按钮,也可以手动停止采集画面。
读取URL视频流
将 open.vi 切换成“filename”模式,可以读取URL视频流。 这种模式适合网络摄像头,比如海康威视系列摄像头,URL规则为:rtsp://username:password@camera_ip/h264/ch1/main/av_stream
下图展示的是:连续采集网络摄像头的画面,并同步显示。特别读取 CAP_PROP_FPS 参数(每秒帧数),并以此计算得到采集间隔,从而控制While循环的周期时间。
同时,还可以获取网络视频源、直播源的URL画面。以下两个URL,留给大家做测试:
1、(吃鸡游戏观战)
rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid
2、(iphone宣传视频)
https://www.apple.com/105/media/us/iphone-x/2017/01df5b43-28e4-4848-bf20-490c34a926a7/films/feature/iphone-x-feature-tpl-cc-us-20170912_1920x1080h.mp4
读取视频文件
同样将 open.vi 切换成“filename”模式,输入参数填写本地视频文件的路径,就可以读取视频文件。
请参考工具包附带的范例:examples/Molitec/OpenCV/videoio/VideoCapture_2(File).vi
特别读取 CAP_PROP_FPS 参数(每秒帧数),并以此计算得到采集间隔,从而控制While循环的周期时间。否则视频将会被“快进”播放。读取 CAP_PROP_FRAME_COUNT (总帧数),除以FPS,得到视频总时长。
当读取完最后一帧后,下一次循环的 read 将返回False,进而将While循环退出。
录制视频文件
将一系列连续的画面帧,写成视频文件,需要用到 VideoWriter 类,选板位置如下图。
VideoWriter 类的标准使用流程与 VideoCapture 类似:“new - open - write - release”。必要时,使用 set 和 get 函数来设置和获取参数。
请参考工具包附带的范例:examples/Molitec/OpenCV/videoio/VideoWriter_1(record to file).vi
该范例从摄像头采集画面,并录制成MP4格式的视频文件,如下图。
总结
- 本系列博文作为LabVIEW工具包—OpenCV的教程,将以专栏的形式陆续发布和更新。
- 对工具包感兴趣的朋友,欢迎下载试用:秣厉科技 - LabVIEW工具包 - OpenCV
- 各位看官有什么想法、建议、吐槽、批评,或新奇的需求,也欢迎留言讨论。