opencv + DDS 视频传输

概述

1、opencv介绍

OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉机器学习软件库,可以运行在LinuxWindowsAndroidMac OS操作系统上。 [1]  它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了PythonRubyMATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

OpenCVC++语言编写,它具有C ++,PythonJavaMATLAB接口,并支持Windows,Linux,Android和Mac OS,OpenCV主要倾向于实时视觉应用,并在可用时利用MMX和SSE指令, 如今也提供对于C#、Ch、Ruby,GO的支持。

2、DDS

数据分发服务DDS(DataDistributionService)对象管理组织(OMG)HLACORBA等标准的基础上制定的新一代分布式实时通信中间件技术规范,DDS采用发布/订阅体系架构,强调以数据为中心,提供丰富的QoS服务质量策略,能保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求

DDS数据分发中间件是一种轻便的、能够提供实时信息传送的中间件技术。

模型图

这里使用的DDS版本是RTI公司的connext DDS 5.2.3及以上。opencv版本是3.4.0。其他版本均合适,因为这里只用到了opencv读取摄像头和视频演示的功能。考虑到opencv的版本越高,所需要的编译指令越复杂,编译器版本要求越高。因此这里使用较低版本。

3、难点分析

  • opencv开关摄像头,并读取每一帧数据,并将每一帧数据进行演示是相对容易的,opencv提供了方便易用的接口,并且opencv的说明手册中也有相关的example code,直接拿过来用。
  • DDS的发布-订阅编码也是框架化的,DDS也提供了丰富的example code,并且RTI的DDS还提供了非常成熟的代码生成器,所有生成的代码都是一个完美的example code,不需要任何配置,windows下使用VS直接生成,直接运行;Linux下直接make,非常方便。你可能不知道他的代码是啥,但是程序构建成功,可执行程序已就绪。完美……

以上都是比较容易的,可能费点神,但是不是不能完成的。

  • 接下来就是,opencv读取摄像头数据,每一帧都是一个很大的矩阵,我这里是640*480,又考虑到配色方案,实际是640*3*480。那么这么大的矩阵如何通过网络进行传输,就涉及到矩阵的序列化和反序列化(这里姑且称之为序列化和反序列化)。这个问题 解决了,那么该工程就基本完成了。
  • 再有一个小的考虑,由于矩阵很大,我不可能通过DDS一包发送,这里需要拆包,组包。该问题理清了之后,该工程就真的100%结束了,接下来就是编码实现了。

4、Linux虚拟机中构建工程

  • 编写Makefile脚本

        Makefile编写_闻啼鸟的blog-CSDN博客

  • 编写cmake脚本

       CMake 入门实战 | HaHack

  • 开启虚拟机摄像头

       首先要将摄像头与linux连接,右键点击下图红框中的图标,选择链接。

其次,如果无法调用摄像头,那么进行下面设置,选择虚拟机(M)->选择USB控制器,切换USB兼容性(C),然后再重新进行上一步,断开,再重连。

5、rk3399部署

  • 问题描述1:opencv源码安装系统内存不足

       内存不足的情况,opencv提供了各个模块的选项,可以通过编译指令自定义编译部分模块。

#!/bin/sh
cmake -DBUILD_DOCS=off \
    #-DBUILD_SHARED_LIBS=off \
    -DBUILD_FAT_JAVA_LIB=off \
    -DBUILD_TESTS=off \
    -DBUILD_TIFF=on \         
    -DBUILD_JASPER=on \        
    -DBUILD_JPEG=on \      
    -DBUILD_PNG=on \          
    -DBUILD_ZLIB=on \
    -DBUILD_OPENEXR=off \
    -DBUILD_opencv_apps=off \
    -DBUILD_opencv_calib3d=off \
    -DBUILD_opencv_contrib=off \
    -DBUILD_opencv_features2d=off \
    -DBUILD_opencv_flann=off \
    -DBUILD_opencv_gpu=off \
    -DBUILD_opencv_java=off \
    -DBUILD_opencv_legacy=off \
    -DBUILD_opencv_ml=off \
    -DBUILD_opencv_nonfree=off \
    -DBUILD_opencv_objdetect=off \
    -DBUILD_opencv_ocl=off \
    -DBUILD_opencv_photo=off \
    -DBUILD_opencv_python=off \
    -DBUILD_opencv_stitching=off \
    -DBUILD_opencv_superres=off \
    -DBUILD_opencv_ts=off \
    -DBUILD_opencv_video=on \
    -DBUILD_opencv_videostab=off \
    -DBUILD_opencv_world=off \
    -DBUILD_opencv_lengcy=off \
    -DWITH_1394=off \
    -DWITH_EIGEN=off \
    -DWITH_FFMPEG=on \
    -DWITH_GIGEAPI=off \
    -DWITH_GSTREAMER=off \
    -DWITH_GTK=off \
    -DWITH_PVAPI=off \
    -DWITH_UNICAP=on \
    -DWITH_V4L=on \
    -DWITH_LIBV4L=off \
    -DWITH_CUDA=off \
    -DWITH_CUFFT=off \
    -DWITH_OPENCL=off \
    -DWITH_OPENCLAMDBLAS=off \
    -DWITH_OPENCLAMDFFT=off ..
  • 问题描述2:系统自带摄像头打不开

原因:猜测可能还是opencv没有安装gstreamer模块,显示“NO”,应该是系统中找不到相关依赖库,导致配置显示“NO”。

具体原理不清楚,安装gstreamer,但是实际表现是这样。说明跟gstreamer相关的东西还是找不到。

解决步骤(等验证后,在来完善):

1、使用opencv+gstreamer方式打开

2、增加环境变量

    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.usr/local/lib

6、opencv读取视频文件

通过opencv VideoCapture接口传入文件路径读取视频文件,发现打开失败。几番折腾也是没有任何进展。

该问题是否与问题5存在关系,或者说是同一个问题尚不得而知。

接下来,考虑opencv安装的问题,重新安装opencv,待结果。按照下面的链接重新安装openCV

Ubuntu16.04 install OpenCV with ffmpeg:Ubuntu16.04 install OpenCV with ffmpeg - 简书

按照教程安装完毕要有下面显示输出:

ok,读视频文件的问题解决。对于视频开启需要FFMPEG模块。
 

如下图,左边是读视频演示,右边是DDS接收视频后演示:

7、opencv编解码

  1. 基于像素访问进行传输,传输的大小是图像的分辨率以及他的通道数,一般普通摄像头拍摄到图像大小的分辨率是640 x 480,也就是说单通道灰度图像,一次要传输的数据量大小是640 x 480=307200个字节,如果是彩色3通道那就是640 x 480 x 3 = 921600个字节。90万的字节对网络资源的消耗是非常大,采用这种方式进行网络图像传输,容易造成视频的卡顿。

  2. OpenCV提供了imencode和imdecode两个函数,将图像进行二进制编码。

  3. cv2.imdecode()函数从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像。 cv2.imencode()函数是将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输。

8、vp8编码

   

VP8(视频压缩格式或视频压缩规范)是一种将高清晰度视频编码和解码为文件或比特流以供观看的规范。VP8和VP9都包含在由谷歌赞助的WebM开源项目中。与对应的H.264编解码器不同,VP8编解码器是免费的。这是由于谷歌已经发布了所有的VP8专利,它拥 有一个免版税的公共许可证。然而,H.264包含专利技术,需要专利持有者的许可和有限的硬件使用费。


VP8是目前WebRTC使用的默认视频编解码器。大约90%或更多的WebRTC视频会话使用VP8。

参考:

Use OpenCV with Gstreamer:Use OpenCV with Gstreamer

Ubuntu16.04 install OpenCV with ffmpeg:Ubuntu16.04 install OpenCV with ffmpeg - 简书

Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV:Ubuntu 14.04 LTS下使用arm-linux-gcc交叉编译OpenCV 2.4.9 - 云+社区 - 腾讯云

交叉hisiv3531,OpenCV、ffmpeg与libx264交叉编译:hisiv3531,OpenCV、ffmpeg与libx264交叉编译_樊小辫的博客-CSDN博客_opencv交叉编译包含ffmpeg

Jetson之GStreamer+OpenCV读取显示摄像头:Jetson之OpenCV硬件解码摄像头_ZONGXP的博客-CSDN博客_gstreamer opencv

跟牛人学视频编码:视频编码_闻啼鸟的blog-CSDN博客

  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值