程建璞 项辉宇 于修洪
(北京工商大学 机械工程学院, 北京 100048)
视觉测量技术[1]是一种图像检测技术,其基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体,而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数. 在大多数条件下,这些参数必须通过实验与计算才能得到,这个过程被称为摄像机标定[2]或称为定标. 摄像机标定问题大致分为两类:标定物标定和摄像机自标定[3]. 本文提出的标定方法[4]只需要摄像机从不同方向拍摄一个平面模板(作为标定物)的多幅图像,对于每个视点获得图像,提取图像上的网格角点;平面模板与图像间的网格角点对应关系,确定了单应性矩阵;那么对每幅图像,就可确定一个单应性矩阵,这样就能够进行摄像机标定;同时该方法也考虑了镜头畸变的影响.
OpenCV(open source computer vision library)是Intel公司开发的开源计算机视觉库,由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法,具备强大的图像和矩阵运算能力,其中计算机视觉函175数库包含图像处理、结构分析、运动分析、对象跟踪、模式识别、摄像机定标和三维重建等算法. OpenCV中摄像机标定模块为用户提供了良好的接口,同时支持Windows、Linux平台,极大地提高了开发效率,执行速度快,具有良好的移植性,可以很好地应用于工程实际中.
本系统可分为3个模块,即测量旋转工作台、图像采集模块和分析处理模块. 图1为以车体覆盖件视觉测量系统为例的结构框图. 视觉测量的成功与否很大程度上取决于摄像机标定是否成功.
图1 视觉测量系统示意Fig.1 Figure of vision measurement system
在视觉测量中常用到3个坐标系:世界坐标系(Xw,Yw,Zw)、摄像机坐标系(Xc,Yc,Zc)及图像像素坐标系(u,v)和图像物理坐标系(x,y),如图2.
图2 坐标转换示意Fig.2 Diagram of converted coordinate
图像坐标系的两种形式间的关系:
(1)
其中,像素点的大小为k×l.
这样,就可以在真实的物理尺寸和图像像素值之间进行坐标转换.
摄像机坐标系与图像像素坐标系转换关系:
(2)
矩阵A包含了摄像机全部的6个内参(k,l,u0,v0,f,θ),所以A称为摄像机的内参数矩阵,在不考虑摄像机坐标系偏斜度的情况,θ可认为是90°.
摄像机坐标系和世界坐标系的关系为:
(3)
其中,R3×3=(rxryrz)为旋转矩阵,t3×1=(tx,ty,tz)T为平移向量,(Rt)称为摄像机的外参数矩阵. 综合式(2)和(3)可以得出世界坐标系到图像坐标系的一个线性变换:
(4)
其中,(Rt)为摄像机的外参数矩阵,为图像点的齐次坐标,M=(XYZ1)T为三维空间点的齐次坐标. 这样就得到一个图像点和空间点之间的映射关系.
令H=λA(Rt),其中λ为比例系数,H称为透视投影矩阵,则有(h1h21h3)=λA(r1r2t).
透视投影矩阵H中包含了所有的摄像机参数(内参、外参),可从中分解出各个摄像机参数.
R为正交单位矩阵,可知r1和r2之间的关系,于是可得到最基本的内参约束关系:
(5)
(6)
这样,如果取得3幅以上两两摄像机光轴不平行的图像,就可以解得b的值,接着可以得到矩阵A的值,从而分解出所有的摄像机内参数.
在获取内参数矩阵中的所有参数后,就可以根据矩阵A来确定每幅图像的各个外参数,及旋转矩阵R和平移向量t.
由于透镜的结构特点,使透镜在成像过程中或多或少会产生一些畸变,而其中又以径向畸变最为明显,因而对畸变的校正就主要针对径向畸变.
径向畸变的畸变方程:
(7)
其中k1、k2为径向畸变系数,(x,y)为校正前的图像坐标,(,)为校正后的图像坐标. 由于透镜的中心对称性,所以可以认为x和y方向上的径向畸变率是相同的,于是有:
(8)
其中(u,v)为校正前的像素坐标,(,)为校正后的像素坐标. 通过给定n幅图像的m个点,用最小二乘法,可解得方程组的解,求得k1、k2.
在OpenCV函数库里已经提供了可以直接调用的利用黑白格标定板进行标定的一系列函数,因而本文采用OpenCV函数库进行摄像机标定研究,进而提出以下摄像机标定算法:
1)读取一组标定用图像数据,为了达到较为精确的效果,选用7幅光轴不平行的图像(如图3).
2)用cvCreatMat()函数,分别为摄像机的内外参数、角点在世界坐标系的坐标值以及在图像坐标系的坐标值分配矩阵存储空间.
图3 平面标定板Fig.3 Plane camera calibration plates
3)用cvFindChessboardCorners()函数,提取黑白棋盘格角点位置,将每一幅图像数据分别代入该函数,如果该幅图像上提取的角点数目和设定的相同,则返回非零值,角点提取成功,角点像素坐标用链表形式存储;否则返回0,角点提取失败(如图4).
图4 标定板角点提取Fig.4 Corners extraction of calibration plates
4)将cvFindChessboardCorners()函数提取出的图像像素坐标系中坐标值代入cvFindCornerSubPix()函数,进一步精确得到角点亚像素级的坐标值.
5)用cvDrawChessboardCorners()函数,将提取出的角点用红色圆圈标记,如果棋盘为完整的,则用直线连接所有的角点(如图5).
6)将角点在世界坐标系的坐标值以及在图像坐标系的坐标值代入cvCalibrateCamera2()函数,求出摄像机的内外参数.
7)根据计算得到的摄像机各内外参数,计算已知角点三维坐标在图像上的投影坐标,将其与通过角点提取得到的投影坐标比较,得到一个误差值.
图5 软件界面Fig.5 interface of software
实验采用DH-HV1303UM-T CCD相机,最高分辨率1 280×1 024,像素尺寸为5.2 μm×5.2 μm,清晰度为750线,帧率为15帧/秒. 使用Visual C++开发了摄像机标定的操作界面,可以快速调用OpenCV函数库,提高了系统的响应速度和适应性.
通过提取的黑白格标定板角点像素坐标可以得出三维坐标,利用OpenCV提供的摄像机标定函数可得摄像机的内外参数矩阵,部分数据见表1.
畸变系数:(0.120 589-1.952 58-0.002 829 60.008 346)
表1 多幅图像实验数据Tab.1 Experimental data of multiple pictures
在汽车覆盖件的视觉检测系统中,利用OpenCV开发的摄像机标定程序具有标定原理清晰、标定过程简便、标定结果准确、应用方便、执行速度快、可移植性强等优点,能够达到汽车覆盖件应力应变分析需要的检测精度. 同时可以在机器人操作系统和计算机视觉检测等领域广泛推广.