凃 洋,刘春晶,曹文洪,王向东
(中国水利水电科学研究院,北京 100048)
基于OpenCV实现金字塔光流法对表面流场的计算
凃 洋,刘春晶,曹文洪,王向东
(中国水利水电科学研究院,北京 100048)
本文基于OpenCV视觉函数库和VisualStudio2010平台,采用C++编程语言开发了基于金字塔光流法的PTV(Particle Track Velocimetry)表面流场测量程序。程序计算结果显示:基于金字塔光流法实现PTV技术,需要在金字塔光流法对示踪粒子角点跟踪匹配的基础上进一步实现示踪粒子的质心匹配,该过程可使金字塔光流法准确、合理地应用于PTV技术,实现对示踪粒子运动速度的正确计算,同时还可剔除掉金字塔光流法对非匹配关系的角点产生的错误匹配。
OpenCV;金字塔光流;PTV;角点匹配;质心匹配
粒子跟踪测速技术PTV(Particle Track Velocimetry)是表面流场测量的重要方法,其主要实现途径是通过摄像机记录带有示踪粒子运动的流场情况,再通过计算机程序实现对视频图像中多个运动目标的跟踪与匹配,属于计算机视觉与图像处理技术在水利领域的应用。在计算机视觉研究领域中,目标跟踪主要包括[1]基于匹配的目标跟踪算法(CamShift法、Kalman滤波法等)、基于运动检测的目标跟踪算法(光流法)、基于对比度分析的目标跟踪算法(边缘跟踪法、重心跟踪法等)等几大类。其中光流法应用广泛、跟踪效果较好,与其他方法相比,光流法又具备跟踪多运动目标的能力。与以往PTV跟踪匹配算法不同(如最邻近法、匹配几率法、PCSS法等)[2],光流法是通过计算图像像素信息的表观的运动(运动目标的像素运动速度)来实现对运动目标的跟踪。在光流算法中,以Horn-Schunck法[3]、Lucas-Kanade方法(L-K法)[4]及金字塔光流法Pyramid Lucas-Kanade方法(PyrLK法)[5]为典型代表。其中PyrLK法是目前应用较广的方法,属于稀疏光流法,相较于其他两种方法具有计算速度快、可应用于大位移的目标跟踪计算[6]。因此将PyrLK法引入到PTV技术,通过对图像像素信息变化的检测计算来实现对流场中示踪粒子运动的跟踪进而实现流场速度的求解,这是一个全新的角度。然而,PyrLK法作为稀疏光流法,实现的是对示踪粒子角点(特征点)的跟踪,事实上角点速度往往并不能准确地代表示踪粒子的运动速度,因此还需解决通过PyrLK法计算出示踪粒子质心的速度的问题。
基于视频图像的运动目标识别与跟踪,需要编写计算机程序实现。如果所有需要的底层算法和图像处理函数都从头编写,则需要较大的工作量,且难以保证程序的鲁棒性和通用性。OpenCV、Matlab等图像处理开发平台恰好可以解决上述问题,其作用正是可以为用户提供函数库以高效解决计算机视觉和图像处理中的一些问题。但Matlab提供的计算函数在Matlab环境下的运行速度较慢,将m文件转化为C代码后,C代码的执行效率和可读性存在较大问题。因此本研究选择OpenCV视觉库作为开发平台,在VisualStudio2010开发环境下采用C++语言实现PyrLK法的PTV表面流场测量过程。
OpenCV(Open Source Computer Vision Library)由Intel公司开发,是一款可以免费下载、开源、跨平台的视觉库,实现了计算机视觉与图像处理方面的很多通用算法,目前已在特征检测与跟踪、目标识别、目标运动分析及3D重建等方面得到了广泛应用。OpenCV视觉库有以下特点:可跨平台,不依赖于操作系统和硬件环境,可以运行于Linux、W indows和Mac OS操作系统;轻量级且高效,由一系列C函数和少量C++类构成,同时Intel公司在OpenCV库函数的设计和汇编方面针对英特尔处理器做了相应优化;可扩展性好,接口主要为C++语言,但也同时保留了C语言接口,此外还有大量的Python、Java、Matlab等的接口。与我们所熟悉的计算机视觉与图像处理的工具Matlab相比,OpenCV有以下优越性[7]。
表1 计算机视觉与图像处理工具特性
程序的目的是根据拍摄的流场中示踪粒子运动的连续图像,通过光流计算获得表面流场。整个目的的实现需要依次完成3个模块:文件导入,摄像机标定,流场计算,见图1。即导入图像文件后,需要对图像进行图像畸变校正以及摄像机标定,以校正后的图像作为流场计算的图像输入从而得到示踪粒子的像素位移,再通过摄像机标定所得到的图像与三维空间中的物体之间的转化参数将像素位移转化成实际位移,进而得到流场中的示踪粒子运动速度。每个模块的开发均以OpenCV视觉库作为开发平台,在实现具体功能时直接调用平台内函数。本研究将详细介绍各模块的实现过程与实现过程中所调用的平台函数,并在各模块的关键部分辅以真实实验图片的相应计算结果用以分析和检验,选取的两帧图像见图2。
图1 程序流程图
图2 原始图像
3.1 文件导入 通常情况下,在图像文件的计算中有两种需求:一种是从含有整个流场过程的图像中选择特定图像进行计算以观察结果和分析;一种是针对含有整个流场的所有图像进行前后两帧的连续计算。因此,根据两种不同的需要设置了两种不同的文件导入方式,即打开文件与打开文件夹。打开文件可实现特定图像文件的手动输入,打开文件夹可实现一个文件夹的所有图像文件的自动输入。
3.2 摄像机标定 由于透镜的结构特点,摄像机在成像过程中会产生畸变。此外,为了将图像中的像素位移转化成世界坐标系下的实际物体位移,需要计算出相机坐标系与世界坐标系之间的转化参数。本文基于OpenCV平台函数库采用张正友标定法对摄像机进行标定[8],通过张正友标定法计算出摄像机的内部参数(包括图像中心、焦距、镜头畸变等)和外部参数(即相对于世界坐标系的摄像机坐标的三维位置和方向),进而可以根据其内部参数和外部参数对拍摄出的图像进行摄像机标定与图像畸变校正。校正后图像见图3。
图3 校正后图像
摄像机标定部分基于OpenCV平台的实现步骤如下:(1)采用想要进行标定的摄像机,从不同角度对黑白格标定板进行拍摄。为保证计算精度,应至少拍摄10张图像,用于作为标定模板图像。(2)采用im read函数循环读入每一张标定模板图像,并采用findChessboardCorners函数对标定模板图像上的角点进行检测,获取角点在图像像素坐标系中的像素坐标;为提高角点坐标的精度,采用corner-SubPix函数进一步计算各角点的亚像素坐标,然后存入Point2f类型的二维动态数组中。(3)可选择采用drawChessboardCorners函数在图像中将识别出来的角点进行绘制,并采用imshow函数展示。该步为可选步骤。(4)以黑白格标定板中左上角第一个角点位置为坐标系的原点,沿水平向右为x轴,竖直向下为y轴建立世界坐标系,并计算出各角点在世界坐标系中的坐标,并存入Point3f类型的二维动态数组中。(5)将角点在世界坐标系中的坐标数组和在图像像素坐标系的坐标数组代入calibrateCamera函数,求出摄像机的内部参数和外部参数。(6)将计算获得的内部参数和需要进行校正的图像代入undistort函数中,即可实现图像的畸变校正。(7)可选择将计算获得的内部参数存入xm l或ym l格式的文件中,以便于下次进行图像畸变校正时直接使用。
3.3 流场计算 PyrLK法属于稀疏光流法,需要在计算前提取出图像中的角点(包含示踪粒子角点)作为PyrLK法的计算输入,可实现对示踪粒子的角点跟踪。本研究选用Shi-Tomasi方法提取角点[9]。以图像校正后的实验图像作为PyrLK法的输入,其对示踪粒子位移矢量的计算结果见图4,示踪粒子位移区间设为[1~30]pix,金字塔层数为3层,计算窗口为5×5(pix)。图4的结果显示该方法对示踪粒子的角点均可以实现正确的跟踪匹配。但由于示踪粒子各角点位置处在流场中的流速不完全相同,相同的角点在前后两帧图像中的像素信息也会产生变化。因此角点的位移并不等于整个示踪粒子的实际位移,只有通过示踪粒子质心位移计算出的速度才是该示踪粒子所在流场的真实速度,因此需要将示踪粒子的角点匹配转化为示踪粒子的质心匹配。
本文实现示踪粒子角点匹配向示踪粒子质心匹配的具体方法是:对图像进行二值化并提取出示踪粒子轮廓;确定每个被匹配的角点所属的示踪粒子轮廓;计算示踪粒子轮廓的质心;示踪粒子的质心匹配。该过程实现后的示踪粒子像素位移矢量图见图5,图像二值化分割阈值为130,其余计算参数与PyrLK法计算时选用的参数一致。图5的结果显示,该方法可成功完成示踪粒子角点匹配向示踪粒子质心匹配的转化,进而实现对示踪粒子位移的正确计算。图4与图5中选取同一个粒子(图4中方形标识),并对其角点像素位移与质心像素位移进行分析,可发现同一示踪粒子的角点的像素位移与质心像素位移并不一致,进一步说明角点位移求出的示踪粒子运动速度并不能代表示踪粒子的真实运动速度,见表2。
表2 同一示踪粒的角点像素位移与质心像素位移
图4 PyrLK法示踪粒子位移矢量图
图5 角点匹配向质心匹配转化后的示踪粒子位移矢量图
从图4及图5的计算结果可看出,除示踪粒子外,有部分的错误匹配(见图4及图5中的椭圆形标识)。其原因是由于光照变化和图像噪声等问题,使一些实际静止的图像区域的角点出现了位移(这些产生了位移的角点并无匹配关系),并且计算值对应的前后两帧角点查找到的所属轮廓的质心位置也出现了差别,从而产生错误计算。将图4与图5中的非示踪粒子错误匹配结果进行对比可发现:PyrLK“角点-质心”法的对非示踪粒子的错误匹配要明显少于PyrLK法。这是由于除示踪粒子以外的图像一般静止不变的,因此在两帧图像二值化后所提取出的非示踪粒子的轮廓是静止不变的。在PyrLK“角点-质心”法的角点匹配转化为质心匹配的过程中,大部分没有匹配关系却产生匹配的角点被转化为同一个轮廓的同一质心,这时转化后的位移计算值为0。可见角点匹配向质心匹配的过程转化可自动剔除掉PyrLK法对非匹配关系的角点产生的部分错误匹配。
流场计算部分基于OpenCV平台的实现过程如下:(1)首先依据Shi-Tomasi方法,采用goodFeaturesTo Track函数提取出图像中的角点,这些角点一般位于示踪粒子的边缘;(2)采用cornerSubPix函数进一步计算各角点的亚像素坐标,以提高角点坐标的精度;(3)依据PyrLK法,采用calcOptical-FlowPyrLK函数对示踪粒子角点进行跟踪;(4)完成示踪粒子角点跟踪之后,开始进一步实现示踪粒子的质心匹配:①采用cvThreshold函数对图像进行二值化分割处理;②采用cvFindContours函数提取出图像中所有示踪粒子的轮廓;③依据几何矩法采用cvMoments和cvGetSpatialMoment函数计算出粒子轮廓的质心;④采用cvPointPolygonTest函数,循环判断任一被跟踪的角点和所有轮廓之间的位置关系,找到该角点所属的轮廓(即与该角点位置最近的轮廓),即可找到各粒子角点所对应的粒子质心,进而实现角点跟踪到质心匹配的转化,通过匹配质心的像素坐标可计算出质心位移,从而获得示踪粒子的运动速度(见图6)。
图6 表面流场计算实现过程
采用PyrLK法对示踪粒子进行跟踪,并在此基础上提取有匹配关系粒子的质心进行匹配,这种角点匹配向质心匹配转化的处理过程不仅可实现对示踪粒子运动速度的正确计算,还可剔除掉部分PyrLK法对非匹配关系的角点产生的错误匹配,使光流理论能够合理、准确地应用于PTV技术。
以OpenCV视觉函数库为基础,在VisualStudio2010开发环境下采用C++语言实现PyrLK对示踪粒子的跟踪匹配和表面流场计算,程序运行稳定,满足计算要求。通过对OpenCV库函数的调用,减少了程序开发的工作量,提高了工作效率。采用OpenCV和C++的混合开发模式进行开发环境的配置较为简便,并具有较高的运算速度,是计算机视觉与图像处理方面程序开发的一个很好选择。
[1] 蔡荣太,吴元昊,王明佳,等.视频目标跟踪算法综述[J].电视技术,2010,34:135-138.
[2] 胡涛.PTV匹配算法的对比分析[D].北京:清华大学,2010.
[3] Horn B K,Schunck BG.Determining optical flow[J].Artificial Intelligence,1981,17(81):185-203.
[4] Lucas B D,Kanade T.An Iterative Image Registration Technique with an Application to Stereo Vision[C]//International Joint Conference on Artificial Intelligence(IJCAI),1981:674-679.
[5] Bouguet J Y.Pyramidal implementation of the lucas kanade feature tracker description of the algorithm[J].Intel Corporation,2001(5):1-10.
[6] BradskiGary,Kaehler Adrian.学习OpenCV[M].于仕琪,刘瑞帧译.北京:清华大学出版社,2009.
[7] 李振伟,陈种,赵有.基于OpenCV的运动目标跟踪及其实现[J].现代电子技术,2008,31(20):128-130.
[8] 高文娟,李健.基于OpenCV的摄像机标定问题研究[J].计算机与数字工程,2008,36(12):128-130.
[9] Jianboshi,Carlo Tomasi.Good Features to Track[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition,1994:593-600.
[10] 禹明忠.PTV技术和颗粒三维运动规律的研究[D].北京:清华大学,2002.
Realization of the surface flow field measurement by Pyram id LK method based on OpenCV
TU Yang,LIU Chunjing,CAO Wenhong,WANG Xiangdong
(China Institute of Water Resources and Hydropower Research,Beijing 100048,China)
This research adopts the Pyramid LK optical flow method for PTV surface flow field measurement.Program is developed using C++language,based on OpenCV vision function library and VisualStudio 2010 platform in this paper.Program app lication results show that the application of Pyram id LK optical flow method in PTV technology needs to further realize the centroid matching of trace particles based on the corner matching,which can make Pyram id LK optical flow method be well applied to the PTV technique,be able to obtain good results of the tracer particles,and automatically remove the error tracking of corners which do not have matching relationships in the Pyramid LK optical flow method.
OpenCV;Pyramid LK optical flow method;PTV;corner matching;centroid matching
TP391.41
A
10.13244/j.cnki.jiwhr.2016.03.011
1672-3031(2016)03-0224-05
(责任编辑:祁 伟)
2015-11-10
国家自然科学基金项目(11472310);国家国际科技合作专项项目(2015DFR70980)
凃洋(1986-),女,黑龙江齐齐哈尔人,博士生,主要从事水力学及河流动力学研究。E-mail:tyiwhr@126.com