基于OpenCV的摄像机标定方法实现

时间:2022-08-09 02:21:49

基于OpenCV的摄像机标定方法实现

摘 要: 为了实现在三维重建系统中的对摄像机进行标定的目的,采用理想摄像机成像模型为基础,在模型中引入透镜径向畸变和切向畸变影响的计算方法。在VC++环境下开发了一种基于OpenCV算法库的摄像机标定算法,并同基于Matlab摄像机标定工具箱的标定结果进行了比较。实验结果表明,该方法具有标定精度高、鲁棒性好等优点,可以满足增强现实和其他计算机视觉系统的需要。

关键词: 摄像机标定; OpenCV; 计算机视觉; 透镜畸变

中图分类号: TN919?34; TP391.9 文献标识码: A 文章编号: 1004?373X(2013)08?0097?04

0 引 言

摄像机标定的目的,就是要建立三维世界坐标与二维图像坐标之间的一种对应关系。在单目视觉中,这种对应关系是一对多的对应,即二维图像上的一个像素点对应着三维空间中的一条直线;而在双目视觉中,可以通过两幅二维图像上的对应像素点计算得到三维世界坐标与二维图像坐标的一一对应关系。由此,便可以得到物体的三维坐标值。

目前常用的标定方法是由Tasi首先提出的基于“两步法”的传统摄像机标定方法[1]。随后,张正友提出用二维平面模板来标定摄像机,他的方法首先利用线性和非线性方法求取摄像机内外参数的初值,然后再解非线性最小化方程,以求得内外参数的精确解[2]。因此,其无论在精度方面,还是在简便方面都优于Tsai的方法,可以说它是两步法的代表,从而使摄像机标定技术大大前进了一步。

OpenCV(Open Source Computer Vision Library)是Intel开放计算机视觉函数库,具备强大的图像和矩阵运算能力[3]。尽管有很多求解摄像机参数的方法,OpenCV函数库中提供的摄像机标定方法就是基于张正友的标定方法。OpenCV中的摄像机标定模块为用户提供了良好的接口,并且执行速度快,具有良好的跨平台移植性,因此可以很好地应用于工程实际当中。

1 摄像机标定原理

1.1 理想摄像机模型

如图1所示[4],首先在棋盘模板平面上,建立世界坐标系(xw,yw,zw),世界坐标系的原点为Ow;然后以摄像机透视中心Oc为坐标原点,并使其xc轴和yc轴分别平行于像平面(Image Plane)坐标系的x轴和y轴,且方向相同,zc轴为摄像机镜头的主光轴,按右手定则建立摄像机坐标系(xc,yc,zc);再以像平面上像素坐标值(0,0)的点为坐标原点O,以水平像元阵列方向为u方向,以垂直像元阵列方向为v方向,建立图像像素坐标系(Pixel Image Coordinate)(u,v);最后以主光轴与像平面的交点Od为坐标原点,建立图像物理坐标系(Physical Image Coordinate)(xd,yd),并使其坐标轴分别平行于图像像素坐标系。

建立好以上4个坐标系后,棋盘模板平面上的一点pw(xw,yw,zw),在不考虑透视畸变情况下,其成像点在图像像素坐标系下的坐标pu(u,v)记为[2]:

[zcuv1=A3×3R3×3t3×1xwywzw1] (1)

式中:[zc]为pw点在摄像机坐标系下的深度;[A3×3]为摄像机内参数矩阵;[R3×3t3×1]是摄像机的外参数矩阵;R和t分别表示世界坐标系相对于摄像机坐标系的旋转矩阵和平移向量。其定义如下:

[A3×3=αcu00βv0001,R3×3=r1r2r3]

式中:a,b分别表示在x和y方向上像点的物理坐标到像素坐标的比例系数;u0,v0表示主光轴与像平面的交点(主点)在像素坐标系下的坐标;参数[c]描述了2个图像坐标轴之间的歪斜(即2个坐标轴不完全垂直的情况)。需要说明的是,考虑到当前的像机制造水平,可以认为2个坐标轴是垂直的,因此在OpenCV所使用的模型中认为c=0。

在张正友的平面标定法中,标定板位于世界坐标系的z=0平面内,即对于模板上的点,其zw=0,这样式(1)重写为[5?6]:

[zcuv1=A3×3r1r2r3t3×1xwywzw1=A3×3r1r2r3t3×1]

[xwyw01=A3×3r1r2t3×1xwyw1] (2)

式中:[r1],[r2],[r3]为旋转矩阵[R3×3]的列向量。令[H=r1r2r3=Ar1r2t],H称为模板和图像之间的单应矩阵(Homography)。式(2)可以改写为:

[zcuv1=Hxwyw1] (3)

通过一系列运算后,就可以得到摄像机的所有内参数和外参数[2,4]。

1.2 引入畸变后的摄像机模型

以上表示的是理想情况下的透镜成像方程,然而由于实际的像机存在着制造精度误差,因此实际的摄像机存在着径向、切向畸变。

这里,为摄像机定义一个归一化的图像平面,这个平面平行于摄像机的像平面,且到针孔的距离为单位长度。接着在这个平面上建立一个坐标系,原点在光轴和这个平面的交点处。由针孔透视投影可知,摄像机坐标系下的点([xc],[yc],[zc])在这个归一化的像平面上的投影点的坐标([xn],[yn],1)可以写为:

[xn=xczcyn=yczc] (4)

引入透镜的畸变后,新的归一化坐标值定义为[7]:

[xdyd=1+k1r2+k2r4xnyn+2k3xnyn+k4(r2+2x2n)k3(r2+2y2n)+2k4xnyn] (5)

式中:[r2=x2n+y2n];[k1],[k2]表示径向畸变系数;[k3],[k4]表示切向畸变系数。

应用上述畸变模型后,最终成像点在图像像素坐标系下的坐标为:

[uv1=A3×3xdyd1] (6)

当4个畸变系数为0时,上面的公式退变成[8]:

[uv1=A3×3xczcyczc 1=1zcA3×3xcyczc] (7)

1.3 标定方法

OpenCV中的摄像机标定是基于张正友的平面标定方法来完成的[3,5]。该方法要求使用一个具有较高绘制精度的棋盘模板,然后通过自由移动摄像机或标定模板,使得摄像机至少在3个不同的位置(相对标定模板)拍摄模板图像。在求解相机内外参数时,第一步暂不考虑摄像机镜头的畸变,通过将检测到的所有角点代入投影方程,求得模板和图像之间的单应矩阵H,然后确定摄像机的内部参数和外部参数的初始值。第2步,再以这些参数为初始值,考虑畸变的影响,应用Levenberg?Marquardt算法对图像点与再投影点间的距离之和进行非线性最小优化,以得到一组精度更高的值[9]。

2 基于OpenCV 的标定系统实现

摄像机标定算法的流程如图2所示。

(1)初始化。用cvCreateMat()函数为摄像机的内外参数以及所有图像最大可能数量的角点分配存储空间。

(2)读取一副标定用的图像并进行角点检测。用cvFindChessboardCorners()函数检测并提取图像中的棋盘角点位置。如果返回值为1,则表示该幅图像上提取的角点数目和设定的相同,角点提取成功;否则返回0,表示角点提取失败,即该幅图像中提取到的角点数要少于设定的数目。

(3)细化角点坐标并绘制。对提取到的角点,需要使用cvFindCornerSubPix()函数对这些角点进一步的细化,以得到更为精确的角点像素坐标。而后,调用cvDrawChessboardCorners()绘制提取到的角点。

(4)对于角点提取成功的图像,存储角点在世界坐标系下的坐标值以及在图像坐标系下亚像素级的坐标值。

(5)读取完所有图像后,根据角点提取成功的图片数量,为它们中的所有角点重新分配数据空间,并释放原有的数据空间。

(6)标定。调用cvCalibrateCamera2()函数,求取摄像机的内外参数。需要注意的是该函数输出参数里的rotation_vectors矩阵。

该矩阵里的每一行(或列)向量表示的是相应的一副图像所对应的旋转向量,当需要转换成旋转矩阵时,要使用罗格里格斯变换函数(cvRodrigues2)。

(7)标定结果的误差分析。这里使用重投影的方法来计算标定误差,即根据得到的摄像机内外参数,调用cvProjectPoints2()计算角点三维坐标在图像上的投影坐标,然后,调用cvNorm函数将其与通过角点提取到的投影坐标进行比较,从而得到一个均方误差值。

(8)计算每幅角点提取成功图像的旋转矩阵、旋转向量和平移向量。

3 试验与结果分析

根据以上标定原理和开发步骤,本文在Windows XP平台下,用Visual C++开发了一个基于OpenCV 1.0版本的摄像机标定程序。试验使用Canon IXUS 85IS型照相机,分辨率为640×480像素。标定所用的模板是在A4纸上用激光打印机打印的黑白相间的国际象棋图案,然后将其粘贴在平板上。

模板中方格边长为30 mm,共有6×8=40个角点。利用9副图像对摄像机进行标定,检测出的角点如图3所示,标定结果如表1第2列所示,总体平均误差为0.031 562 6个像素。

为了验证标定结果的正确性,本文还利用Matlab中标定工具箱对这9副图像进行了摄像机标定,结果如表1第3列所示。从中可以看出,两者的值是非常接近的,因此证明了本文标定程序的正确性。

4 结 语

利用OpenCV开发的摄像机标定程序具有标定结果精确、运算效率高、跨平台移植性好等优点,可以有效地应用于需要计算机视觉系统的各个领域。利用OpenCV库的强大功能可以缩短程序员的开发周期,使计算机视觉技术从理论走向实际应用。

参考文献

[1] TSAI R Y. A versatile camera calibration technique for high?accuracy 3D machine vision metrology using off?the?shelf TV cameras and lenses [J]. IEEE Journal of Robotics and Automation, 1987, 3(4): 323?344.

[2] ZHANG Zheng?you. Flexible camera calibration by viewing a plane from unknown orientations [C]//International Conference on Computer Vision(1CCV).Proceedings of Seventh International Conference on Computer Vision. Liege, Belgium: Elsevier Science Publishers, 1999: 666?674.

[3] BRADSKI Gary, KAEHLER Adrian. Learning OpenCV: computer vision with the OpenCV library [M]. [S.l.]: O’Reilly Media,2008.

[4] 毛剑飞,邹细勇,诸静.改进的平面模板两步法标定摄像机[J]. 中国图象图形学报,2004,9(7):846?853.

[5] 陈胜勇,刘胜.基于OpenCV的计算机视觉技术实现[M].北京:科学出版社,2008.

[6] 高伟.相机与成像模型[EB/OL]. [2010?10?09].http://.

[7] BOUGUET Jean?Yves. Camera calibration toolbox for Matlab [EB/OL]. [2010?07?09]. http://www.vision.caltech.edu/Bouguetj/calib_doc.

[8] FORSYTH David A, PONCE Jean. Computer vision : a modern approach [M]. [S.l.]: Person Education, Inc., 2004.

[9] 尹文生,罗瑜林,李世其.基于OpenCV的摄像机标定[J].计算机工程与设计,2007,28(1):197?199.

[10] 伍尤富.基于平面模板的摄像机两步标定方法[J].电子科技,2007(9):71?74.

[11] 陶旺林,卢选民,刘李娟,等.基于OpenCV的非线性图像畸变校正研究[J].现代电子技术,2011,34(12):117?120.

[12] 梁华,李兴福.OpenCVVS架构、算法及应用[J].现代电子技术,2012,35(6):134?137.

[13] 黄振峰,陈海平,邓培,等.基于OpenCV与USB工业相机零件检测系统的图像处理研究[J].现代电子技术,2012,35(18):128?132.

上一篇:LED电源老化测试用的缓启动恒流电子负载 下一篇:艺术院校贫困生资助工作新变化与思考