www.opticsjournal.net中国光学期刊网
ARTICLE|论文一种基于OpenCV的摄像机标定新方法ANovelMethodofCameraCalibrationBasedonOpenCV
李明金熊显名张绍兵(桂林电子科技大学电子工程学院,广西桂林541004)LiMingjinXiongXianmingZhangShaobing(SchoolofElectronicEngineering,GuilinUniversityofElectronicTechnology,Guilin,Guangxi541004,China)
摘要针对基于计算机视觉技术的空间方位测量系统研制过程中摄像机标定问题,分析了通用摄像机模型,深入
讨论了镜头的径向畸变和切向畸变对标定精度的影响以及相应的解决办法。介绍了2D平面标定靶标制作规范,给出了一种改进型SUSAN算子进行角点亚像素检测的方法,该方法具有速度快、定位精度高等优点。在VC++6.0环境下调用OpenCV1.0库函数实现了摄像机的标定,在实现过程中充分利用了OpenCV库函数,提高了标定精度和计算效率。关键词摄像机标定;改进型SUSAN算子;OpenCV;镜头畸变;内部参数
AbstractForthecameracalibrationprobleminresearchofspatialpositionmeasurementsystembasedon
computervisiontechnology,thegeneralcameramodelisanalysed,theinfluencesandsolutionsoflensradialdistortionandtangentialdistortionarediscussed.A2Dplanarpatternisbuilt,andanimprovedSUSANoperatorforsub-pixelcornerdetectionisproposed,whichhashighspeedandpositioningaccuracy.ThecameracalibrationusingthelibraryfunctionsofOpenCV1.0inVC++6.0isachieved,whichimprovesthecalibrationaccuracyandcalculationefficiency.Keywordscameracalibration;improvedSUSANoperator;OpenCV;lensdistortion;intrinsicparameter中图分类号:O436doi:10.3788/LOP20094612.0099
1引言基于计算机视觉技术的空间方位测量系统的一个主要任务是根据摄像机获取的图像信息计算三维空间中物体的几何信息。图像上每一点的亮度反映了空间物体表面某点反射光的强度,而该点在图像上的几何位置则与空间物体表面相应点的几何位置有关。这些位置的相互关系由摄像机成像的几何模型所决定,这些几何模型的参数就是摄像机参数,实验与计算这些参数的过程称为摄像机标定[1]。
摄像机标定技术在视觉测量研究中占有非常重
要的地位,是视觉测量工作中开展其他方面研究的基础。目前摄像机标定方法主要分为两大类:传统的摄像机标定方法和摄像机自标定方法。传统的摄像机标定方法,以利用最优化理论的标定算法和透视变换矩阵算法等为代表,这类算法通过建立参照物上三维坐标已知点与其图像点之间的对应关系来计算摄像机的内外参数,精确度高但计算复杂。摄像机自标定方法则不需要标定参照物,直接利用从图像序列中得到的约束关系来计算摄像机的内外参数,但自标定的精确度没有传统标定的高[2,3]。本文在传统摄像机标定的
99论文|ARTICLE激光与光电子学进展2009.12基础上,借助于OpenCV强大的函数库给出了一种基于改进型SUSAN算子[4]进行角点检测的摄像机标定算法,该算法思路清晰,标定精度较高。OpenCV是英特尔公司开发的开放型计算机视觉类库。它在数字图像处理和计算机视觉方面具有强大的功能,可轻松实现物体轮廓跟踪图像的几何处理、形态学处理图像特征提取、背景分离、主动轮廓算法、摄像机的校正、姿势的识别等众多操作[4]。OpenCV中的摄像机标定模块为用户提供了良好的接口,同时支持MS-Windows,Linux平台,具有良好的跨平台移植性,用户可以直接在组件的层次上实现个性化的标定应用,是实际工程当中理想的二次开发工具。2摄像机模型及内外参数为了更好地描述摄像机光学成像过程,根据世界坐标系、摄像机坐标系、像平面坐标系和计算机图像坐标系之间的相互关系[1],本文首先给出了摄像机的通用模型,如图1所示。其中XYZ坐标系为世界坐标系,xyz坐标系为摄像机坐标系,x′y′坐标系为像平面坐标系,uv坐标系为计算机图像坐标系。由于透镜、成像平面与透镜光轴在空间位置上存在偏差等原因,像点、光心和物点并不能保证在同一条直线上,实际中的成像模型并不满足线性关系,而是一种非线性关系,需要引入透镜畸变,定义为x=xd+dx(x,y),y=yd+dy(x,y),(1)式中xd和yd分别表示实际的图像点的坐标,dx和dy表示非线性畸变值的X,Y轴分量。OpenCV中的非线性畸变,定义为dx(x,y)=k1x(x2+y2)+p2(3x2+y2)+2p1xy,dy(x,y)=k2y(x2+y2)+p1(3x2+y2)+2p2xy,(2)式中k1,k2为径向畸变,p1,p2为切向畸变。确定畸变系数是摄像机标定的重要步骤之一。根据通用摄像机模型及其具体的成像模型,考虑摄像机可能出现的各种畸变,三维空间点w(X,Y,Z)的齐次坐标(X,Y,Z,1)在世界坐标系中投影到图像平面上像素坐标系(u,v)的过程为
zcuv1=agu000bv000010RT0001xwywzw1=A·M·Xw=P·Xw,
(3)式中zc为任意比例因子a=f/dx,b=f/dy,f为摄像机的焦距,dx,dy为每一个像素在x轴与y轴方向上的物理尺寸,g是图像坐标轴偏斜度参数,(u0,v0)为摄像机光轴平面交点在图像直角坐标系中的坐标,R为摄像机坐标系相对于世界坐标系的3×3的旋转矩阵,T为摄像机坐标系相对于世界坐标系的3×1平移矩阵,A为摄像机内参数矩阵(内参数矩阵只与摄像机内部结构有关,一旦计算出来,在焦距一定的情况下可以被重复使用),M为摄像机外参数矩阵,P为投影矩阵。
3摄像机标定方法和标定系统实现3.1一种基于改进型SUSAN算子的棋盘格角点亚像素检测在基于2D平面靶标的摄像机标定中,角点位置提取对后续摄像机标定的精度产生重要影响[5],OpenCV中用于角点检测的cvFindChessboardCorners()函数得到的只是一个大概的坐标,不能很好地满足更高精度的摄像机标定,针对这个问题采用了一种改进型SUSAN算子对棋盘格平面模板亚像素级角点进行检测并提取其坐标。首先用sobel算子检测图像边缘,然后对图像边缘处的像素进行SUSAN角点检测,最后用灰度平方重心法[6]进行亚像素角点定位,角点灰度的重心(x0,y0)为
x0=(i,j)∈MΣiw(i,j)(i,j)∈MΣw(i,j),y0=(i,j)∈MΣjw(i,j)
(i,j)∈MΣw(i,j)
,(4)
式中w(i,j)为权值,M是用改进后的SUSAN算子检测到的角点邻域。该方法运算速度快,可以有效地实现角点亚像素定位,其重投影平均误差为0.215pixel。3.2标定系统实现3.2.1标定靶标的制作及其图像拍摄规范在OpenCV中利用这种改进型SUSAN算子进行
图1通用摄像机模型
100www.opticsjournal.net中国光学期刊网
ARTICLE|论文图2摄像机标定算法流程框图角点亚像素检测的摄像机标定方法,同样采用棋盘格平面模板作为标定的靶标。由于靶标的不平整度对标定精度造成的影响远大于随机噪声造成的影响,为了能更好地对角点进行检测,需要对该标定靶标做如下约定:用高质量的纸张在高清晰的激光打印机中打印出棋盘格平面靶标,并粘贴在特制的平面玻璃板上,在棋盘格平面标定模板边缘保留至少一个棋盘格宽的白色空白区域,在对模板进行拍摄时其最好与图像平面成45°角;由于采用最小二乘法进行拟、合迭代,拍摄的图越多,标定的结果就越精确,因此要在光线充足的情况下在不同的角度拍摄至少8幅以上的图像[5]。
3.2.2标定程序的分析及实现OpenCV提供了很多摄像机标定及三维重建方面的库函数,运用这些库函数及OpenCV编程规范,结合改进型SUSAN算子对棋盘格角点进行亚像素检测的方法,中给出摄像机标定算法的流程框图,如图2所示。
读取从摄像机传输进来的多帧标定图像时,用到可以方便存取图像中像素值的IplImage结构,CvPoint2D32f结构用来定义基于二维浮点型的坐标点,CvMat结构用来定义标定用的多通道矩阵;cvLoadImage()函数用来从文件中打开对象;为了提高角点检测的效率和精度,仍然采用cvFindChessboardCorners()函数对输入的图像进行筛选,选出符合标定用的图像,并用cvDrawChessboardCorners()函数在图上画出角点;用cvCreateMat()函数为摄像机的内外部参数、畸变系数、角点在世界坐标系的坐标值以及在图像坐标系中的坐标值开辟内存存储空间。然后用改进型的SUANSAN算子对筛选出的标定图片进行角点的检测,得到标定角点的图像坐标值;将角点在世界坐标系中的坐标值和在图像坐标系中的坐标值经结构转化后传递给cv2CalibrateCameras()函数,初始化所有的输入参数后计算得到摄像机的内参数矩阵、畸变系数向量和每幅标定图像的外参数矩阵;当得到内参数和畸变系数后将这些数值传递给Undistort2()函数,完成对图像的变换,从而抵消掉径向畸变和切向畸变对图像的影响,并用cvShowImage()函数将变换过的图像显示出来,通过对比变换前后的图像判断变换后的图像畸变减小的程度,从而初步验证求得的内参数和畸变系数的可靠性。在进行误差分析时,通过上述求得的内参数和外参数运用cvProjectPoints2()计算出三维角点投影到二维图像平面上的坐标值,再用函数cvNorm()比较计算出的投影坐标与通过角点提取到的投影坐标,从而得到一个误差值;最后将检测出的角点坐标,摄像机的内外参数矩阵、镜头的畸变系数写入到文本文件中并保存下来,当完成上述工作后一定要注意用cvReleaseMat()函数释放前面用cvCreateMat()函数开辟的内存空间,防止内存泄露。