1、 基于 OpenCV 的交通视频感知处理程序框架摘 要:为了实现交通视频信息的感知和提取,采用基于 mfc并使用 opencv 进行视频处理的可视化编程方法,通过构造一个包含常见操作的 c+类,同时以 opencv 中的相关函数为接口,建立了一个视频处理程序架构,来实现 mfc 应用程序对 opencv 算法的融合,以智能地感知和处理交通视频中的信息。关键词:mfc;opencv;视频处理;信息感知abstract: in order to achieve the perception and retrieval of traffic video information, the paper
2、adopts the combining method of mfc and opencv for a visual programming for video processing. taking functions in opencv as an interface, a video processing framework is built by constructing operations in c+ class to integrate mfc application with opencv algorithms and to intelligently perceive and
3、process the traffic information.keywords: mfc; opencv; video processing; information perception0 引 言计算机视觉技术是通过对常见的图像、视频进行操作来提取其中信息的一种技术。opencv 是 intel 公司开发的一款开源图像视频处理库,使用 opencv 中封装好的库函数,可以很方便地对视频中的图像进行提取、保存、变换等形态学操作,这种技术在很大程度上简化了开发的进程2。由于 opencv 只提供相关处理的算法,而程序操作界面略显不足,所开发的程序进行参数设置不方便,因此,在实际应用层面,开发者
4、通常将 opencv 函数库与 mfc(microsoft foundation classes是微软基础类库,可提供 windows 编程的框架)相结合进行开发3。这种使用 mfc 构建 win32 程序框架,并使用 opencv 构建算法的各取所长方法,对于软件的实用性和可操作性具有重大意义。本文总结出了一套将 opencv 算法应用于 win32 对话框程序中的标准方法,该方法可以通过定义 c+类创建对象,来轻松实现对公路交通视频中交通参数的提取。1 视频车辆检测器的基本功能本程序以 mfc+opencv 的方式进行开发,并以实用为准则,通过可视化的界面和按钮的方式来实现原始视频的播放,
5、视频信息分析,自定义观测点和车流量计数周期,交通参数的测量,统计结果的存储和重现等功能。其软件各个功能的关系如图 1 所示。2 视频车辆检测器的技术实现要实现上述系统,主要有两方面问题:一是如何构建视频对象,并通过操作视频对象来对视频信息进行提取;二是如何对视频进行操作来实现上述的各个功能。2.1 创建视频对象使用创建对象的方式操作视频时,首先要定义视频的类。在视频处理中,通常先提取出一帧一帧的图像,然后对所提取的图像进行处理,再将其保存或者播放至应用程序的控件中4。跟据此原理,可定义一个视频的类,类中包含上述过程所涉及的属性和操作方法5,其代码及注释如下(代码中视频类的名称为 cvideo)
6、:class cvideo public:cvideo(); /构造函数virtual cvideo(); /析构函数/以下为数据成员cvcapture* pcapture;/opencv 用来读取视频的结构体,存储待读取的视频iplimage* pframe;/opencv 用来存储图像的结构体,存储当前视频帧的图像iplimage* cframe; /存储当前帧处理后的图像hdc hdc1;/定义设备上下文的句柄,用来播放原始视频(可选)crect rect1;/定义一个矩形区域,用来设定原始视频的 roi 区域hdc hdc2;/定义设备上下文的句柄,用来播放处理后的视频crect re
7、ct2;/定义一个矩形区域,用来设定处理后视频的 roi 区域cstring m_file; /字符串,存储视频的路径和名称int m_framepos; /当前的播放位置int m_frametotal; /视频的帧总数int m_fps;/存储视频中每秒的帧数,便于进行播放速度的控制/*以下为成员函数(限于篇幅,本文未提供成员函数的所有代码,读者可以根据注释参考 opencv 文档自行编写)*/void play(int pos);/播放 pos 位置的帧,将此帧的图像放入 pframe 中,将 pframe显示在 hdc1 中void convertedplay();/直接将当前帧处理后
8、的图像 cframe 显示在 hdc2 中void closefile();/关闭文件,释放当前视频所占的内存bool openfile(cstring file);/*根据储存在数据成员 file 中的路径打开视频文件,同时获取视频的帧总数和 fps,将其存储在该类的数据成员中*/;定义好视频的类之后,便可以通过此类所定义的对象中的各个数据和方法对视频进行常见的操作。2.2 视频对象的处理在可视化的界面中通常可通过按钮触发事件。假设现在定义了一个 myvideo 的对象,那么,就可以用以下方法按下相应按钮来执行所需功能。(1) 打开视频。将对话框中播放原始视频的设备的 id 和播放处理后的视
9、频设备 id 分别读入 myvideo 相应的成员中;通过 mfc中的 cfiledialog 类读取文件6,将文件的路径存储在myvideo.m_file 中,调用 myviedo.openfile()方法打开视频。初始化当前播放位置,并初始化对话框。此时,该视频将处于待播放和待转换的状态。(2) 播放和分析视频。播放和分析的过程可以通过定时器来实现。当点击播放后,设置并启动定时器。定时器每隔一定时间中断一次,其中断频率通过视频对象中的 myvideo.m_fps 调节。定时器在一个中断中,首先使用 myvideo.play()函数将当前帧推送至原始视频播放设备中播放,并将当前帧(即 myv
10、ideo.pframe)放入自己定义的图像分析处理函数中进行处理,同时将处理结果放至 myvideo.cframe 中,然后使用 myvideo. convertedplay()函数将处理后的帧推送到处理后的视频播放设备中播放,最后帧位置加 1。至此,一个中断执行完毕。其流程图如图 2 所示。(3) 停止播放。当点击停止播放按钮时,调用myvideo.closefile()函数关闭文件,释放内存。同时还要销毁定时器,清理相关中间变量。(4) 定义观测线和计数周期。为了实现车辆数量的测量,必须首先定义车辆的观测线。观测线的设定可用在背景图像上点击的方式来实现。记录点击下的观测线两端的坐标,即可确
11、定观测线的位置,当有车辆越过观测线时,对车辆数加 1。每一个计数周期过后,输出本周期内车流量的检测结果。(5) 检测结果的显示。检测的车流量统计结果可以通过 vc+中的一个 list 控件呈现出来7。每隔所设定的计数周期时间,则将本时间段检测的结果条目加入 list 控件之中,以通过表格的方式将结果展现出来。(6) 检测结果的导出。通过按键操作程序可以将车辆检测结果导出为 txt 格式的文本文件或者 excel 表格保存,以方便统计。3 视频处理算法在检测系统中必须要设计良好的识别算法来提取交通信息,以下将对本系统所使用的视频处理算法进行简要介绍。当提取出一帧原始图像之后,首先使用高斯背景建模
12、,得到背景图像8,再用当前图像减去背景图像并进行如图 3 所示的变换,再提取出运动车辆的二值图像,只要识别出车辆的轮廓就可以实现对车辆的跟踪,最后将跟踪结果放入处理后的图像中9,这一系列的处理可放在定时器中断的图像处理函数中。在此处理过程中,每一步的处理方法和参数都必须经过反复的试验和测试,才能达到最好的效果。其算法流程如图 3 所示。4 实验结果此程序通过构建 c+的视频类并定义视频对象,可完成交通视频的处理工作。同时,利用此框架,可以快速搭建交通视频处理的win32 应用程序。在此框架上进行合理的扩展,可以胜任当前大部分交通视频的参数提取工作。图 4 所示是基于 mfc+opencv 框架
13、的交通流量检测系统软件界面图。图 4 中,左上角的播放控件播放原始视频,右上角用来播放处理后的视频,下方为输出结果的控件。原始视频和处理后的视频播放同步进行,当车辆接近所设定的计数线时,程序使用矩形框将其圈出;越过计数线后,计数器加 1 并将数字在旁边显示出来。5 结 语本文介绍了一种基于 mfc 和 opencv 的交通视频处理程序。实验结果表明,此设计方法具有较高的稳定性,可以达到预期的效果。但是,本系统在架构和算法方面,仍然具有需要更进一步完善的地方,具体如下:(1) 当视频上有其他因素影响时(如车辆阴影、摄像机微小抖动等),由于软件中并没有加入相关消除的算法,检测结果会受到影响,因此,
14、在进一步处理中,应当加入去阴影、消抖等算法。(2) 公路车辆拥堵时,不能很好识别出背景,干扰较大。(3) 在夜晚时,由于光照、车灯等条件的影响,检测算法不能对车辆进行很好识别。在进一步改进中,应该加入相关的处理算法,也可以通过检测车灯来检测车辆数。(4) 车辆重叠时,有可能将两辆车识别成为一辆。(5) 识别准确率有待提高,计数方法也有待改进。参 考 文 献1 王红琴. 智能交通在我国的发展状况及对策j.统计与管理,2011(3):54.2 intel.opencv intel 官方手册eb/ol.2009-01-08.http:/ 刘瑞祯,于仕琪.opencv 教程m.北京:北京航空航天大学出
15、版社,2007.4 bradski gary, kaebler adrian. learning opencv m.北京:清华大学出版社,2009.5 stroustrup bjarne. c+程序设计语言 m. 裘宗燕,译.北京:机械工业出版社,2010.6 microsoft inc. microsoft developer network (msdn) eb/ol. 2012-01-05. http:/ 孙鑫,余安萍.vc+深入详解m.北京:电子工业出版社,2006.8 刘维杰,梁志剑.基于 opencv 的视频图像序列的运动目标检测j. 电子测试,2010(7): 27-29,33.9 詹群峰.基于 opencv 的视频道路车辆检测与跟踪d.厦门:厦门大学,2009.10 gonzalez rafael c, woods richard e.数字图像处理m. 阮秋琦,阮宇智,译. 北京:电子工业出版社,2011.11 马桂珍,朱玲赞,段丽.基于 opencv 的视频应用程序的开发方法j.现代电子技术,2007,30(4):85-86.12 王润民,赵祥模,惠飞,等.基于嵌入式 linux 与 qt 的汽车虚拟仪表设计j.现代电子技术,2012,35(6):1-4.13 王松.基于虚拟仪器的汽车示波器的设计j.山东交通学院学报, 2002(2):50-52.