基于OpenCV的试飞视频数据回放技术

2018-11-22 11:58刘升护
计算机技术与发展 2018年11期
关键词:视频流线程解码

郝 朝,山 寿,刘升护

(中国飞行试验研究院,陕西 西安 710089)

0 引 言

在飞行试验中,视频数据能够全面、直观、时效、客观地反映人机交互动作,是试飞工程师给出航空武器装备鉴定/定型试飞结论的重要依据[1]。目前机载记录视频数据格式为TS流,文件后缀名为*.m2t,采用现有的视频播放软件像暴风影音等即可进行播放。机载视频影像数据自身是没有时间的,时标叠加在每一帧视频画面的左上角,无法直接进行获取。课题人员通常关心的关键数据段较短,在对机载记录的视频数据进行回放时,为了查找关键时刻的视频数据,采用现有播放软件进行播放时通过拖动进度条进行查找无法实现精确绝对时间快速定位,数据回放效率较低。

基于以上分析,提出了一种基于OpenCV的机载视频图像时间识别方案,采用OpenCV技术对每帧图像中的时间进行识别,在每帧数据前面打上对应的时间戳,通过时间跳转进行视频图像快速定位。

1 OpenCV简介

OpenCV[2-3](open source computer vision library)是一个开源的计算机视觉库。OpenCV由一系列C语言函数和少量C++类构成,还为Matlab等其他语言提供相应的接口[4-5],在图像处理和计算机视觉等方面实现了很多通用算法,对图像处理和视频技术的二次开发大有裨益。OpenCV主体可分为5个模块[6],其中4个模块如图1所示。另一个模块CvAux包括一些过时以及新出现的算法和函数。

图1 OpenCV的基本结构

OpenCV的图像和矩阵运算能力极为强大,使得开发效率和程序运行的可靠性得到显著提高。OpenCV是一个包括300多个C/C++函数的跨平台的中高层API,既可独立运行,也可使用其他库。Windows和Linux两种平台可供开发者选择。

2 总体流程

在飞行试验视频数据回放中,需要截取当前视频流图像并保存为BMP文件以便进行后续图像处理,包括图像预处理、特征提取和判决等处理流程,如图2所示。

图2 图像识别处理流程

获取图像信息,就是从试飞视频流中截取当前图像,用红、绿、蓝三基色的8位亮度值(RGB值)[7]表示图像,RGB值的范围为0~255。

图像预处理[8],就是采用图像增强、滤波和变换等方式,去除相关噪声,将原始图像变成适用于计算机进行特征提取的形式。图像增强就是利用数学方法提高图像中人们所关注部分的清晰度,削弱无用信息,突出有用信息,包括去除噪声、修正灰度、图像平滑、腐蚀与锐化等。图像变换是指使用傅里叶变换、小波变换等数学方法的性质和特点,将图像空间转换到频域空间,提高运算速度并改善图像质量。

图像特征提取,就是对当前图像信息进行归纳与分析,提取出能反映当前图片本质的可用于图像判决的特征量。

图像判决,通过特征量与域值进行的计算分析,判断图像状态,给出最终结果。

3 图像处理

机载视频时标只存在于视频画面的左上角位置,因此为了提高图像识别的速度,只需对一帧图像的左上角部分区域进行处理。对图像进行处理须经过以下几个步骤:

(1)采用高斯模糊算法对图像进行平滑处理,减少图像的噪声或失真。

cvSmooth(src_img, src_img,CV_GUASSIAN,5,0);

(2)对图像进行灰度处理[9]。

cvCvtColor(src_img,gray_img,CV_BGR2GRAY);

(3)对图像进行直方图均衡化处理,增强图像的亮度及对比度。

Ipllmage *img_zf=cvCreateImage(size,IPL_DEPTH_8U,1);

cvEqualizeHist(gray_img, img_zf);

cvReleaseImage(&gray_img);

(4)对图像进行二值化处理。

Ipllmage *img2=cvCreateImage(size,IPL_DEPTH_8U,1);

cvThreshold(img_zf,img2,50,255,CV_THRESH_BINARY_INV);

cvReleaseImage(&img_zf);

(5)细化处理。

Ipllmage *img3=cvCreateImage(size,IPL_DEPTH_8U,1);

cvZero(img3);

cvThin(img2, img3,5);

cvReleaseImage(&img2);

(6)图像腐蚀[10],去掉图像的边缘毛刺。

Ipllmage *img4=cvCreateImage(size,IPL_DEPTH_8U,1);

CvErode(img3,img4,NULL,1);

cvReleaseImage(&img3);

(7)图像膨胀[11-12],扩大图像边缘,使图像表面更平滑。

lplConvKernel *iplele=cvCreateStruringElementEx(3,3,0,0,CV_SHAPE_RECT);

cvDilate(img4,img4,iplele,1);

cvReleaseStructuringElement(&iplele);

(8)查找轮廓,进行数字分割。

Ipllmage *img5=cvCreateImage(size,IPL_DEPTH_8U,1);

cvCopy(img4,img5);

CvSeq *contour=NULL;

CvMemStorage *storage=cvCreateMemStorage(0);

cvFindContours(img5,storage,&contour,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);

cvReleaseImage(&img5);

4 图像识别

图像匹配技术[13]是指根据已知图像模式(基准模板)从实时图像中搜索相同或相似图像模式的过程。图像匹配就是要根据参考图像和实时图像来选定某些特征、相似性准则及搜索策略进行相关运算,以确定匹配的最佳空间对应点,得到不同图像之间的相似度。

常用的图像匹配方法有基于线形形状的匹配、模板匹配[14-15]、利用射影空间的匹配等。在试飞视频数据中,机载记录的视频数据在硬件正常的情况下是不存在干扰与噪声的,因此采用基于模板匹配的OCR算法[16]来对试飞图像进行识别是一种有效方法。模板就是数字0到数字9的字符图像,而模板匹配就是在一幅大图像中搜寻目标,该目标与模板有同样的方向、尺寸和图像元素,通过一定的算法在图中找到目标图像。将数字0到数字9以图片的形式保存到字符数据库中作为模板进行对象匹配。首先将待识别数字字符进行二值化处理,然后将其从尺寸进行缩放,与字符数据库中的模板大小保持一致,与数据库中的模板依次进行匹配分析,给出最佳识别结果。该算法识别率高,实现较简单,也有一定程度的抗干扰能力。通过OpenCV的matchTemplate函数进行模板匹配后,可以得到一个映射图,这张图中最大值的地方便是匹配度最大的子图的左上角坐标,可以使用minMaxLoc函数获得子图位置和相应分数,再进行后续操作。

5 应用效果

机载记录数据格式为标准的TS流文件,视频解码与显示采用开源的FFmpeg与SDL库实现。FFmpeg是一个开源且跨平台的音视频流方案,是自由软件中最完备的一套多媒体支持库,为音视频转换、解码以及流化提供了完整的解决方案。音视频编解码库为libavcodec,相关数据结构包括AVFormatContext、AVCodecContext、AVCodec、AVPacket、AVFrame与AVPicture等。调用FFmpeg解码视频流的流程为:

(1)avcodec_register_all()。首先初始化FFmpeg以及注册解码器,在后面的过程中,将使用已注册的解码器对视频流进行解码。

(2)avcodec_open2()。打开指定格式(H.264或MPEG4)的解码器。

(3)avcodec_decode_video2()。使用相应的解码器对获取到的每帧视频数据进行解码。

依次读取一帧视频数据调用(3)即可对视频流进行解码,并获得解码后的YUV数据,对YUV数据进行数据格式转换和处理,用于视频显示。

SDL(simple directmedia layer)是一套基于C语言的跨平台多媒体开发库,提供了多种控制音视频输入与输出的函数。SDL显示YUV数据流程如下:

(1)SDL_Init()。初始化SDL。

(2)SDL_CreateWindow()。创建SDL显示窗口用于视频播放。

(3)SDL_CreateRender()。基于窗口创建渲染器,用于渲染SDL_Texture至SDL_Window。

(4)SDL_CreateTexture()。创建纹理用于显示YUV数据,一个SDL_Texture对应一帧YUV数据。

(5)SDL_UpdateTexture()。设置纹理的像素数据。

(6)SDL_RenderCopy()。将纹理数据复制给渲染目标。

(7)SDL_RenderPresent()。显示画面。

采用FFmpeg将一帧视频图像解码为YUV数据,然后调用(5)~(7)即可实现SDL播放与显示。

考虑到播放视频时要对视频进行拖动进度条、暂停等操作,为了充分利用系统资源,采用多线程并发技术,以用户UI界面操作为主线程,视频解码与显示为子线程,同时视频显示子线程接收主线程消息进行视频画面的暂停、截图等操作。通过消息机制传递参数实现多线程间通信。当主线程对视频线程进行操作的时候,视频显示线程进入等待状态,直到消息响应唤醒该线程。使用SDL封装的SDL_thread 来进行线程管理。创建显示线程使用SDL_CreateThread,操作视频画面时使用SDL_WaitThread实现线程间通信等待,退出使用SDL_KillThread来关闭视频显示线程。

实际应用效果如图3所示。首先采用图像处理与识别技术对机载视频每帧图像进行预处理,对时间进行识别,然后在每帧视频数据前打上对应的时间戳。在进行视频数据回放时只需要输入关键动作段时刻即可快速定位至该帧图像。应用效果表明,利用OpenCV能够准确识别当前图像的时间,通过时间跳转功能可迅速定位至指定时间的图像。

图3 实际应用效果

6 结束语

为了解决机载视频关键图像快速定位的问题,设计了基于OpenCV的试飞视频数据快速回放软件。采用基于OpenCV的图像识别技术对机载视频进行预处理,识别每帧处理后图像中的时间,然后在每帧视频数据前打上相应的时间戳,在进行回放时通过时间对比实现图像快速定位。该技术已经应用于多个型号的飞行试验视频数据回放中,可以通过指定时间快速跳转到该帧画面,正确性和可靠性得到验证,有效提高了视频数据回放效率,为保障型号试飞的高效顺利进行发挥重要作用。

猜你喜欢
视频流线程解码
5G终端模拟系统随机接入过程的设计与实现
边缘实时视频流分析系统配置动态调整算法研究
实时操作系统mbedOS 互斥量调度机制剖析
浅析体育赛事售票系统错票问题的对策研究
文化解码
解码eUCP2.0
文化 解码
文明 解码
铁路货场智能大门集装箱全景图像采集方法研究
美国视频流市场首现饱和征兆