李 健,孔令寅
(陕西科技大学电气与信息工程学院,陕西西安710021)
随着计算机视觉技术的不断发展,双目视觉成为了计算机三维测量领域中一个热点研究技术,其测量原理是利用空间同一点在两个摄像机成像平面上的视差大小计算空间点的三维坐标。要计算视差,必须知道该点在左右两幅图像上的二维坐标,左右图像上在三维空间里的同一点称为匹配点[1]。而立体匹配就是查找相应的匹配点。但将三维空间场景投影为二维图像后,由于受到场景中噪声干扰、光照条件、景物物理特性和几何形状、摄像机特性以及畸变等诸多因素的影响,在不同视点下,同一景物的图像会呈现出极大的差别,因此如何对图像进行准确的立体匹配成为了双目视觉三维测量研究领域中的重点和难点问题。
目前所提出的立体匹配算法有许多,主要分为两大类:基于局部约束和基于全局约束。其中,基于局部约束的立体匹配算法又分为3类:区域匹配算法、特征匹配算法和相位匹配算法。区域匹配算法主要基于光度测量学中的不变性原理,将灰度相关程度作为匹配的判别依据,结果得到的视差图较为稠密[2]。该类算法最主要的缺点是由于窗口选择函数的锐度变化不够并且深度的不连续特征不易保留,因此对于无纹理区域的匹配结果常常不很理想;特征匹配算法主要基于几何不变性的原理,对于区域匹配算法中存在的无纹理区域敏感和深度不连续等缺点进行了完善[3],该类算法的优点在于噪声的不敏感性,可得到较为精确的匹配结果,缺点主要有两个:一是由于图像中特征的稀疏性,该类算法得到的都是稀疏的视差图,要得到稠密的视差图需要进行插值。二是特征提取精度将极大影响匹配的结果;相位匹配算法基于傅立叶平移定理,通过对时/空二频域带通滤波后的定位性基元信号进行相位信息处理获得像对间的视差[4]。相比上述两类方法,该类方法更好地反映了信号结构信息,对图像中的高频噪声及畸变也能起到较好的抑制作用,获得的视差是致密的具有亚像素级精度,其缺点主要有两个:第一,由于带通信号输出幅度过低因此产生了相位奇点问题;第二,因带通滤波器波长与相位匹配的算法收敛范围相关带来的相位卷绕问题。
针对现有匹配方法影响匹配因素多,易出现误匹配等问题,本文提出了一种基于OpenCV的立体匹配算法,并利用VC++进行了实现,最后通过实验对算法的匹配效果和精度进行了验证。
目前,计算机视觉领域内对于角点特征还没有一个统一的数学定义,而角点特征的含义本身又较为模糊,因此各种有关角点特征检测方法的文献中对于角点特征的数学定义都有着不同的描述,由此也提出了各种不同角点特征检测的数学方法。目前有关角点特征的定义有以下几种[5-6]:角点特征是灰度梯度局部最大的像素对应点;角点特征是两条及以上边界的连接点;角点特征表示了物体边缘不连续变化的方向;角点特征处具有最大的一阶导数值,并且H阶导数值为0;角点特征处梯度的值不仅大,并且在梯度方向上速率变化也最快。换言之,角点特征处一般是二维空间内,图像中灰度剧烈变化的位置,是和周围相邻点差异明显的像素点[7]。
角点特征按照不同的结构可分为以下几类:“X”型、“K”型、“T”型、“Y”型、“V”型等。
本文使用投影仪将棋盘格投射到待测物体上,这里选择具有规则几何形状的长方体木块作为待测物体,如图1所示,这样就在待测物体表面人工添加了易于识别和检测的角点特征,这里需要注意的是棋盘格图像的分辨率要尽量和投影仪的分辨率一致,不一致则会对匹配的结果产生影响,另外,图像的大小最好是完整覆盖在被测物体上。
图1 角点特征的添加
目前,角点特征的检测方法主要有两种:基于边缘的角点特征检测法和基于图像灰度的角点特征检测法。基于边缘的角点特征检测法由于过于依赖边缘的提取,若提取出的边缘线出现断裂则会对最终角点特征的检测带来较大的影响。因此本文选择基于图像灰度的角点特征检测法,该类方法中比较有代表性的算法有SUSAN算子、Harris算子、Moravec算子、Forstner算子。本文使用OpenCV库函数CvGoodFeaturesToTrack对图像中的角点特征进行检测[8],该函数利用的是Harris算子,计算简单有效,特别适用于点状特征的提取,并且即便是存在视点变换,灰度变化,图像旋转和噪声的影响,提取结果也是相对稳定的。
首先,计算目标图像的一阶导数,即对于目标图像上的每一个点,将其在x方向和y方向上的一阶导数以及二者的乘积进行计算,结果会得到三幅新图像。三幅图像中每个像素分别对应的属性值为对这三幅图像先进行高斯滤波处理,再计算原图像上每个点对应的兴趣值。计算公式如式 (1)所示
由于Harris算子中特征点被定义为指定区域内兴趣值最大的像素点,因此接下来需要对原图像中指定区域内兴趣值最大的像素点进行提取。一般情况下,可以设定一个指定大小的窗口 (如3×3大小),将每个像素点作为窗口的中心,若中心像素点的兴趣值最大,那么该点即为特征点。
通常指定区域内兴趣值最大的像素点数量很多,这样在后续进行匹配计算时,过多的匹配点会大大增加计算量。所以这里本文先将所有满足条件的像素点进行排序,再根据实际需求选择若干个作为最终检测结果。这种做法的好处是可以根据不同质量图片的需要定量的选择特征点,这样所得到的点总是最好的。
用Harris算子进行角点特征检测,所提取到的角点特征位置精度只能达到像素级,这样的精度会影响立体匹配的精确度,因此需要将提取到的角点特征位置精度进一步精确到亚像素级,本文使用OpenCV库函数CvFindCorner-SubPix进行亚像素级精度角点特征位置的计算[9],具体的计算原理如下。
当一个向量和与其正交的向量点积为0,则角点特征满足这种情况,如图2所示。
假设图2中点q的起始位置就在亚像素级角点特征实际位置的附近。对所有向量q-p进行检测,如果点p在一个均匀区域中,那么点p处的梯度值是0。如果向量q-p与区域边缘的方向相同,那么向量q-p正交于该边缘p点处的梯度向量,上述两种情况下,向量q-p与点p处的梯度向量点积为0。则在点p的周围可以找出许多组梯度向量和其相关的q-p向量,将其点集设为0,再对获得的方程组进行求解,得到的解即是角点特征q位置的亚像素级精度值。
图2 计算原理
确定了角点特征检测方法以及亚像素精度位置的计算方法之后,接下来,就需要对左右两幅图上的角点特征进行匹配了,本文提出的匹配算法描述如下:
步骤1 将左右两幅图像上检测到的l行共n个角点特征 (l>0,n>0)的坐标值保存到文件中。
步骤2 定义数组Lx[n]和Ly[n]存放左图中n个角点特征的x坐标值和y坐标值,定义数组Rx[n]和Ry[n]存放右图中n个角点特征的x坐标值和y坐标值。
步骤3 分别计算数组Ly和Ry中n个元素的最小值,即分别找出左图和右图中n个角点特征y坐标的最小值,将最小值分别定义为Lymin和Rymin。
步骤4 确定左图和右图中每个角点特征所在的行。
(1)确定每行角点特征y坐标的阈值,这里可以考虑选择一个棋盘格上边缘与下边缘y坐标的差值Δy作为参考,例如第一行可设为第二行可设为第三行可设为依此类推。当然,具体阈值需要根据不同棋盘格大小、被测物体情况、图象质量情况等因素灵活选定。
(2)计算数组Ly中每个元素与Lymin的差值ΔLy和数组Ry中每个元素与Rymin的差值ΔRy。
(3)将左右两幅图中每个角点特征计算出的差值ΔLy和ΔRy与每行的阈值进行比较,从而确定每个角点特征所在的行。定义数组Lkx[i]和Lky[i]存放左图中第k行(0<k≤l)所有角点特征的x坐标值和y坐标值,定义数组Rkx[i]和Rky[i]存放右图中第k行 (0<k≤l)所有角点特征的x坐标值和y坐标值,其中i的值取l行中角点特征数量的最大值。
步骤5 按角点特征的x坐标值从小到大逐行对左图和右图中的角点特征坐标进行排序,再逐行把排序后的角点特征坐标值重新存到对应的数组Lx,Ly,Rx,Ry中,则左图上坐标为 (Lx[j],Ly[j])的角点特征和右图上坐标为 (Rx[j],Ry[j])的角点特征为一对匹配点。
这里本文在VS2008开发环境下利用VC++将本文提出的匹配算法编写为程序,并通过实验对该算法进行验证。具体实验过程如下:
(1)将拍摄得到的图像对,如图1所示,经过简单的处理和立体校正后分别对图像对中角点特征进行检测并计算像素精度和亚像素精度角点特征的位置,为了便于观察,这里将检测到的角点特征用红色的点在图像对上进行标注,检测结果如图3所示,检测到的角点特征数量为14个。
图3 角点特征检测结果
(2)利用本文立体匹配算法进行特征点匹配,将左图角点特征和右图对应匹配角点特征的坐标值输出到文件中保存,为了能更好的观察匹配效果,本文将计算得到的匹配点对逐对用红点在左图和右图中绘制出来,结果如图4和图5所示。
从最终的匹配结果不难看出,本文提出的立体匹配算法对于左右图上14个检测出的角点特征均能准确进行匹配,匹配效果较为理想。
为了验证本文提出的立体匹配算法的匹配精度,这里还利用棋盘格板进行了三维测距实验,测量棋盘格板到摄像机之间的距离 (即棋盘格板上角点特征Z坐标的值)。并用本文提出的立体匹配算法与OpenCV中提供的传统BM视差图匹配算法分别进行了立体匹配,最后对Z坐标值进行计算[10],结果如表1所示。这里的实际距离是使用卷尺测得的,测量的最小单位为毫米。
通过对比表1中的测量结果和误差值可以看出使用本文提出的立体匹配算法测量得到的距离值较于传统的视差图匹配算法误差更小,匹配精度更高。另外,从理论上讲,亚像素精度的误差应低于像素精度。但第二次测量的结果则是亚像素精度的误差高于像素精度,产生这种现象的原因可能是与两次不同距离拍摄时环境因素不同造成的。
表1 测距实验结果与误差
本文首先对现有的立体匹配算法进行了分析,针对现有算法的不足,提出了一种基于OpenCV的立体匹配算法。先通过使用投影仪在被测物体表面人工添加棋盘格角点特征,再通过OpenCV库函数对角点特征的位置进行检测和计算,最后以这些角点特征作为匹配时的特征点,利用本文的立体匹配算法完成特征点的匹配,并通过实验进行了算法验证,实验结果表明,该算法的匹配效果较为理想。最后进行的三维测距实验说明该算法与传统的视差图匹配算法相比匹配精度高,误差小,对于三维测量工作具有重要意义。
[1]Bleyer M,Gelautz M.Graph-cut-based stereo matching using image segmentation with symmetrical treatment of occlusions[J].Signal Processing:Image Communication,2007,22(2):127-143.
[2]GONG M,YANG Y H.Real-time stereo matching using orthogonal reliability-based dynamic programming[J].IEEE Trans on Image Processing,2007,16(3):879-884.
[3]DENG Y,YANG Q,LIN X,et al.Stereo correspondence with occlusion handling in a symmetric patch-based graph-cuts model[J].IEEE Trans on Pattern Analysis and Machine Intelligence,2007,29(6):1068-1079.
[4]Birchfield B,Natarajan B,Tomasi C.Correspondence as energybased segmentation[J].Image and Vision Computing,2007,25(8):1329-1340.
[5]CHEN Shengyong,LIU Sheng.Realization of computer vision based on OpenCV [M].Beijing:Science Press,2008(in Chinese).[陈胜勇,刘盛.基于OpenCV的计算机视觉技术实现[M].北京:科学出版社,2008.]
[6]BAO Wenxia,LIANG Dong,WANG Nian.Image matching algorithm based on graph cut theory and geometric constraints[J].Computer Engineering,2007,33(1):193-197(in Chinese).[鲍文霞,梁栋,王年.基于图割理论和极几何约束的图像匹配算法 [J].计算机工程,2007,33(1):193-197.]
[7]LIU Tao,YU Zhongqing,MA Qianli.Target distance calculation based on parallel binocular vision[J].Qingdao University(Natural Science),2009,22(1):59-62(in Chinese).[刘涛,于忠清,马千里.基于平行双目视觉的目标距离计算[J].青岛大学学报 (自然科学版),2009,22(1):59-62.]
[8]Gary Bradski,Adrian Kaebler.Learning OpenCV(Chinese version)[M].Beijing:Tsinghua University Press,2009(in Chinese).[Gary Bradski,Adrian Kaebler.学习OpenCV(中文版)[M].北京:清华大学出版社,2009.]
[9]HUA Shungang,ZENG Lingyi.Dense matching algotihm based on corner detection [J].Computer Engineering and Design,2007,28(5):1092-1095(in Chinese).[华顺刚,曾令宜.一种基于角点检测的图像密集匹配算法 [J].计算机工程与设计,2007,28(5):1092-1095.]
[10]LI Keguo,LI Dayun,TAO Xueheng.An improved acquired algorithm in binocular stereo vision technology[J].Development and Innovation of Machinery and Electrical Products.2008,21(5):31-35(in Chinese).[李克国,李大运,陶学恒.一种双目立体视觉技术中三维坐标点的改进求取算法[J].机电产品开发与创新,2008,21(5):31-35.]