首页 / 资讯中心 / 文章详情

【秣厉科技】LabVIEW工具包——OpenCV 教程(3):摄像头与视频读写

【秣厉科技】LabVIEW工具包——OpenCV 教程(3):摄像头与视频读写 ★ FEATURED ARTICLE
文章目录前言读取摄像头1. 使用 read 读取方式2. 使用 grab-retrieve 读取方式3. 设置与获取参数4. 小技巧LV图片控件自适应缩放5. 连续采集摄像头画面读取URL视频流拓展open 函数直接传参以应对视频源连接超时读取视频文件录制视频文件总结前言需要下载安装OpenCV工具包的朋友请前往 此处 系统要求Windows系统LabVIEW2018兼容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.vi5. 连续采集摄像头画面使用LabVIEW的While循环结构连续采集摄像头画面并显示如下图。open 与 read 都有bool类型的返回值代表操作是否成功可以作为程序异常退出的条件从而避免由于摄像头意外断开或出错时造成LabVIEW程序死锁。用户点击stop按钮也可以手动停止采集画面。读取URL视频流将 open.vi 切换成“filename”模式可以读取URL视频流。 这种模式适合网络摄像头比如海康威视系列摄像头URL规则为rtsp://username:passwordcamera_ip/h264/ch1/main/av_stream下图展示的是连续采集网络摄像头的画面并同步显示。特别读取 CAP_PROP_FPS 参数每秒帧数并以此计算得到采集间隔从而控制While循环的周期时间。同时还可以获取网络视频源、直播源的URL画面。以下两个URL留给大家做测试1、吃鸡游戏观战rtmp://liteavapp.qcloud.com/live/liteavdemoplayerstreamid2、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 函数直接传参以应对视频源连接超时我们知道可以通过 set 函数设置参数包括连接超时时间CAP_PROP_OPEN_TIMEOUT_MSEC但是由于 set 函数必须用在 open 之后假如视频源早已关闭那么 open 函数会等待默认超时时间很长其后面 set 设置的参数无法及时生效也就无法缩短这个时间。为解决这个问题我们可以使用 open 函数直接传参接线端位于 VI 的顶部。需要传递一个一维参数数组数组元素的排列顺序为参数1名称参数1数值参数2名称参数2数值 … 以此类推。如果你能准确记住每种参数名称对应的 “宏” 的话那么直接填数字也是可以的如下图。读取视频文件同样将 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各位看官有什么想法、建议、吐槽、批评或新奇的需求也欢迎留言讨论。
阅读完成 · 觉得有帮助?
咨询建站