使用AMR9开发板(zedboard)基于opencv读取并处理网络监控相机rtsp视频流

来源:互联网 发布:linux为什么喜欢开源 编辑:程序博客网 时间:2024/06/06 09:16

好久没写博客了,主要是因为这段时间都在忙于重复别人的工作,因此没有什么发博客的必要,即使是发也是重复的东西,实在没有什么益处。

因为课题的需要,最近在研究怎么把网络监控摄像头的数据读到嵌入式开发平台上进行视频处理。(注意这里是网络监控摄像机,不是基于UVC协议的平时用的那种USB小摄像头。 )然而我发现网上多数基于arm的视觉项目很少有对网络视频流数据处理的,基本上是对USB摄像头或者OV7xxx摄像头模块的视频数据处理的,因此我也是摸索了一段时间。希望有同样需求的朋友能少走弯路。

大概的框图就是这样的

这里写图片描述
我使用的赛灵思的zedboard,一块ARM9+fpga的开发板,但只使用了其中的AMR9部分,想必这个博客文章对使用其他ARM平台的开发板也是通用的。另外我使用的网络监控摄像头是海康的DS-2CD63C2F-I(V)(S)摄像头。它的详细参数,支持的视频格式什么的可以去海康网站上查找:http://www.hikvision.com/cn/prgs_1245_i11403.html#prettyPhoto,这里不再赘述。
这里写图片描述

一开始本来是想在桌面VS环境下,使用opencv实现读取海康视频流,再往硬件上移植。
参考这篇文章:http://blog.csdn.net/wanghuiqi2008/article/details/31410509
这篇文章对海康视频流处理基本都是通过海康SDK,从海康提供的SDK中扣代码,再对抓取的帧转换成opencv能处理的Mat或者IplImage格式。的确这样在vs环境下处理海康视频流不失为一种好方法,但我的最终目的是要移植硬件,用arm内核的开发板去处理视频,这就涉及到交叉编译的问题。那么问题来了,海康SDK提供的一堆库和头文件怎么交叉编译?而且它们都不是开源的。因此这使我一度怀疑这个方案的可行性。直到我遇到了这篇文章:https://funvision.blogspot.jp/2015/11/opencv-300-videocapture-file-web-camera.html (请科学上网),这篇文章讲的是在Linux环境下使用opencv访问rtsp视频的方法,经过opencv+ffmpeg安装后访问网络相机rtsp视频流就是一行代码的事:
附上源代码

#include <stdio.h>#include <opencv2/opencv.hpp>using namespace std;using namespace cv;//Chose input//通过以下三行代码分别表示选择视频流来源//VideoCapture capture(0);//这行代码选择usb摄像头的视频源VideoCapture capture("rtsp://USER:PASS@xxx.xxx.xxx.xxx/axis-media/media.amp?camera=2");//这行代码选择访问rtsp视频流!!!!!!//VideoCapture capture("input.mp4");//选择播放本地视频// create mat to fill by external sourceMat frame;for(;;){       bool OK = capture.grab();        if (OK == false){        cout << "cannot grab" << endl;        }        else{          // retrieve a frame of your source           capture.read(frame);          //OR         // capture >> frame;       }}

当时我就震惊了。居然可以这么容易,比起动辄几百行代码的海康SDK去获得视频流,用这个方法岂不是容易的多?而且不用费劲心思去交叉编译各种SDK库了,对于我这种小白来说简直再好不过了。
我先检查了下我的摄像头是不是支持这个协议的,你也需要做同样的事情。不然无法进行下去

这里写图片描述

发现是支持的!
然后我下载个VLC视频播放器,验证了这个想法
这里写图片描述

打开网络
这里写图片描述

再输入:

rtsp://<用户名>:<密码>@<网络摄像机IP地址>/<视频编解码格式>/<通道号>/<主码流或者子码流>/av_stream
例如:rtsp://admin:123456@192.168.1.10/h264/ch1/sub/av_stream
就可以打开视频流了!
这里写图片描述

惊喜不惊喜?意外不意外?

同样的使用上面的提供的opencv代码,就可以实现opencv获取网络相机视频流!效果一样就不上图了。

那移植硬件怎么办呢?

这就跟使用ARM去做USB视频处理一样了!网上教程一大堆,什么人脸识别的,还有其他的,反正很多就是了。

主要对运行linux系统的arm板做以下两个库的移植,

这里写图片描述

网络上教程很多,在此不再赘述,反正都比我写得好。
我的开发板跑的ramdisk精简Linux系统,移植完了opencv+qt后能够流畅输出网络相机视频流720*720.实时性什么的都尚可。
最后又作死跑个鱼眼图像矫正算法,这个时候,图像就卡的不要不要的了,因此单纯使用arm9,去执行实时视频处理是很吃力的
效果如下图所示。
这里写图片描述

这个过程中还是出现了一些问题:比如画面卡帧等等,我通过切换子码流解决了。在外文网站上看到有人说还可以通过移植VLC的库来在opencv环境下读取rtsp视频流,这应该也是可行的。

以上,欢迎交流!

阅读全文
1 0