陈凯歌,韩晓军,张 宇,杜云飞
(1.天津工业大学 电子与信息工程学院,天津 300387;2.天津工业大学 理学院,天津 300387)
随着计算机技术的不断发展,计算机视觉已成为计算机领域中的热门研究课题之一.利用相机采集图像再结合图像处理和机器视觉等基础知识进行几何体相关参数视觉测量的技术, 已经在现实生活中得到广泛的应用.在进行视觉测量工作之前,首先要对摄像头进行标定,因为相机标定精度在很大程度上决定了视觉测量的精度.标定就是要计算出摄像头的标定内外参数以及畸变参数[1],其结果可以找出世界坐标和图像坐标之间的变换关系,所以寻找标定点的图像坐标是相机标定的重要环节.由于角点包含了被识别物重要的几何参数信息,而在相机标定中需要利用到黑白棋盘格图片,所以利用角点检测获取检测黑白棋盘格图像中的角点,从而可以获取特征点的像素坐标,为相机参数标定提供了已知条件.
在计算机视觉领域中,角点检测技术可以大致分为两大类:一类是基于图像边缘信息如基于边界链码和小波变换模的角点检测算法[2];另一类是基于图像灰度信息如Harris(哈里斯)算法[3]的角点检测技术.第一类算法在角点检测时较多依赖于边缘线,假设由于某种原因边缘线发生中断,则会对角点的检测及提取结果产生影响.比如,当镜头为广角镜时, 会产生比较大的畸变, 边缘检测后棋盘格的边缘会发生弯曲,这时的检测结果就会产生较大误差.Harris角点检测是目前效果较好的角点检测算法,它不仅不受摄像机姿态以及光照的影响[4],而且还适用于数目较多的角点且光源复杂的情况,同时还具有计算简单、提取方便、稳定等诸多优点.鉴于以上情况, 本文采用Harris检测算法对黑白棋盘格图像进行角点检测.
角点被定义为图像边缘曲线上曲率极大值的点或图像亮度变化剧烈的点,这些点既保留了图像的重要特征,又有效地减少了信息的数据量.Harris算法以Morave算法为基础[5],其检测原理为:如果某一点朝任一方向发生小小的偏移都能引起灰度的较大变化, 那么就认为该点是角点.
哈里斯检测算法受信号处理中自相关函数的启发认为,对于一幅图片, 角点与自相关函数的曲率特性相关,自相关函数表述了局部图像灰度的变化程度,并把灰度变化度量定义为:
(1)
式中,Ex,y为窗口偏移(x,y)所引起的图像灰度的平均变化度量;I代表图像灰度函数,w为窗口函数,u,v为滤波窗的系数,通常情况下wx,y=e-(x2+y2)/σ2.对于任何微小的偏移,略去无穷小项得:
Ex,y=∑wu,v⎣u2(Ix)2+v2(Iy)2+2uvIxIy」=Ax2+2Cxy+By2,
(2)
式中,A=(Ix)2⊗w,C=(Ix·Iy)⊗w,B=(Iy)2⊗w(⊗表示卷积).
计算Ex,y的二次型得:
(3)
M为实对称矩阵:
(4)
对式(4)进行对角化处理得:
(5)
式中,R为旋转因子,对角化处理后并不改变以u,v为坐标参数的空间曲面的形状,其特征值反映了2个主轴方向的图像表面曲率.如果2个特征值都较小,那么表明特征点周围区域为“平坦区域”;若特征值为一大一小,那表明目标点位于“边缘”上;当且仅当2个特征值都较大时,沿任何方向的偏移都将导致剧烈的灰度变化.哈里斯的角点响应函数(HRF)可以表示为:
HRF(x,y)=det(M)-k(trace(M)2),
(6)
式中,k为经验值,通常k=0.04能取得良好的检测效果.由于对M矩阵求特征值比较繁琐,故在此使用公式det(M)和trace(M),分别表示M矩阵的行列式和矩阵M的迹.当目标像素点的HRF超过给定的阈值时,认为该像素点就是角点.
开源视觉库使用“IplImage”结构体来处理图像,此结构不仅能比DIB 格式表达更多的图像特征,而且还可以对图像中的像素值进行方便的存取.
在OpenCV 中使用Harris对图像进行角点检测的函数是cvCornerHarris,其具体函数为:cvCornerHarris(const CvArr* image, CvArr* harris_dst, int?block_Size, int aperture_size, double k).式中,参数image为输入图像,harris_dst为存储Harris检测的图像(与输入图像等大),block_size为邻域大小,aperture_size为扩展 Sobel 核的大小,k为Harris 检测器的自由参数,根据经验,k取0.04能够获得比较好的结果[6].
以下是本实验用于测试Harris角点检测效果的核心代码(基于MFC):
//定义IplImage指针
IplImage *image_gray = NULL;
IplImage *image = NULL;
IplImage *image_harris = NULL;
//为灰度图开辟空间
image_gray =
cvCreateImage(cvGetSize(image), IPL_DEPTH_8U , 1);
//彩色图转换为灰度图
cvCvtColor(image,image_gray, CV_BGR2GRAY);
//为角点检测后图像申请空间
image_harris=cvCreateImage (cvGetSize(image_gray),IPL_DEPTH_32F, 1);
//角点检测函数
cvCornerHarris(image_gray , image_harris, 3, 5, 0.04 );
//创建窗口
cvNamedWindow ("Harris", 1);
cvNamedWindow ("Gray", 1);
//显示原图像和检测后的图像
cvShowImage ( "Gray", image_gray);
cvShowImage ( "Harris", image_harris);
//销毁窗口
cvDestroyWindow ( "Gray" );
cvDestroyWindow ( "Harris" );
//释放图像
cvReleaseImage ( &image_gray);
cvReleaseImage ( &image_harris).
为了验证算法的合理性,编写的测试程序在赛扬双核主频2.3 GHz、内存1 G、Windows XP操作系统中进行实验,编程语言采用Visual C++6.0和OpenCV 1.0.实验选用专门检测角点效果的黑白棋盘格图片,测试效果如图1与图2所示.其中,图1为黑白棋盘格图片,图2为Harris角点检测效果图,图2中的“﹡”为检测到的角点,角点坐标如表1所示.根据哈里斯角点检测算法可知, 影响检测效果的参数主要有3个, 即block_size 邻域大小、aperture_size扩展 Sobel 核的大小及k值,本实验所选取的参数如表2所示.
图 1 原始图片Fig.1 The original picture
图 2 角点检测图Fig.2 Corner detection picture
角点坐标(x,y)(2,91)(2,178)(90,89)(90,180)(91,2)(91,265)(178,2)(178,265)(179,89)(179,180)(264,91)(264,178)
表 2 实验参数Tab.2 Experimental parameters
将图2的局部放大得到图3, 从图3明显可以看出图像灰度是渐变的.图3中“*”标记是经Harris角点检测所得的角点位置,“+” 标记是理想中的角点位置.
图 3 检测精度图Fig.3 Detection precision picture
4结论
Harris角点检测算法在现实生活中已经得到了广泛的应用,同时结合OpenCV中的图像处理函数使得复杂的问题简单化,大大缩短了项目的开发周期.从图3可知,可以通过进一步调整参数的值以及使用亚像素坐标等方法来进一步提高角点检测的精度.
参考文献:
[1] Zhang Z.A flexible new technique for camera calibration[J].IEEE Transactions on Pattern Analysis and Mechine Intelligence,2000,22(11):1330-1334.
[2] 田原,梁德群,吴更石.直接基于灰度图像的多尺度角点检测方法 [J].信号处理, 2006,14(12):6-10.
[3] Harris C, Stephens M. A Combined Corner and Edge Detector [C].UK:Proceedings of the Fourth Alvey Vision Conference, Manchester,1998:147-151.
[4] 陈白帆,蔡自兴. 基于尺度空间理论Harris 角点检测[J].中南大学学报, 2005,36( 5):751-754.
[5] Moravec H P. Towards Automatic Visual Obstacle Avoidance[C].Cambridge:Proceedings of International Joint Conference on Artificial Intelligence,1977:584-590.
[6] 刘瑞祯,于仕琪.OpenCV 教程基础篇[M].北京:北京航空航天大学出版社,2009.