一种基于OpenCV的摄像机标定算法的与实现

点赞:4187 浏览:9767 近期更新时间:2024-04-10 作者:网友分享原创网站原创

【摘 要 】摄像机标定是计算机视觉中的一个重要问题.本文介绍了标定的基本原理,详尽阐述了使用二维模板的标定算法,重点分析了如何借助开源软件OpenCV实现该算法.实验结果显示,使用OpenCV中的相关函数,可以方便地进行数学计算,简单有效地完成摄像机标定.

一种基于OpenCV的摄像机标定算法的与实现参考属性评定
有关论文范文主题研究: 关于计算机的论文范例 大学生适用: 自考毕业论文、硕士学位论文
相关参考文献下载数量: 76 写作解决问题: 怎么撰写
毕业论文开题报告: 标准论文格式、论文选题 职称论文适用: 职称评定、职称评副高
所属大学生专业类别: 怎么撰写 论文题目推荐度: 优秀选题

【关 键 词 】摄像机标定;内部参数;单应性矩阵;OpenCV

1.引言

计算机视觉的基本任务之一是从摄像机获取的图像信息出发计算三维空间中物体的几何信息,并由此重建和识别物体.而空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系是由摄像机成像的几何模型决定的,这些几何模型参数就是摄像机参数.

摄像机标定是确定摄像机内外参数的一个过程,其中内参数的标定是指确定摄像机固有的、与位置参数无关的内部几何与光学参数,包括图像中心坐标(也称主点坐标)、图像纵横比、相机的有效焦距和透镜的畸变失真系数等;外参数的标定是确定摄像机坐标系相对某一世界坐标系的三维位置和方向关系.

目前,摄像机标定技术主要有两种实现方法:

(1)基于标定物的方法:需要尺寸已知的标定参照物,通过建立标定物上三维坐标已知点与其图像点之间的对应,利用一定的算法获得摄像机的内外参数.标定物可以是三维的,也可以是二维共面的.三维标定物条件下,只需一幅图像就可以求出摄像机的全部内外参数.但三维标定物的加工和维护比较困难.二维共面标定物加工维护简单,但一幅图像不足以标出所有的摄像机参数,因此需要简化摄像机模型,或者从不同角度获取多幅图像来同时标出所有的参数.当应用场合要求的精度很高而且摄像机的参数不经常变化时,这种标定法应为首选.

(2)自标定法:不需要标定物,仅依靠多幅图像对应点之间的关系直接进行标定.利用了摄像机内部参数自身的约束,而与场景和摄像机运动无关.该方法非常灵活,但不是很成熟,由于未知参数太多,很难得到稳定的结果.主要用于精度要求不高的场合.本文首先介绍摄像机模型及标定的基本原理,接下来研究使用简单的二维模板的标定算

法,最后分析如何借助开源软件OpenCV实现算法.

2.摄像机模型

本文使用的摄像机模型为经典的针孔模型,通过变换将三维空间中的点投影到图像平面.投影公式如下:

等于 A[R t]M  (1)

等价于:

(2)

其中,(X,Y,Z)是点的世界坐标,(u,v)是点投影在图像平面的坐标,s是一个任意的尺度因子.A为摄像机内参数矩阵,(,)是主点坐标,(,)是图像坐标系中u轴和v轴的尺度因子.旋转平移矩阵[R|t]被称为外参数矩阵,用来描述相机相对于某一个固定场景的运动,或者相反,物体围绕相机的刚性运动.也就是[R|t]将点(X,Y,Z)的坐标变换到某个坐标系,这个坐标系相对于摄像机来说是固定不变的.

3.基于平面模板的标定算法

这里借鉴张正友[4]的平面标定方法,检测设平面模板位于世界坐标系Z等于0的平面上,旋转矩阵R的第i列以标识.从公式(2)我们可以得到下面的关系:


(3)

令,那么平面模板上的点M与它的像点m之间的对应可以表示为等于HM.我们称H为单应性矩阵.在相差一个非零常数因子的前提下,H是唯一的,它实现了平面模板在两个坐标系下图像点之间的一一对应关系.

根据旋转矩阵的特点,和是正交向量,即满足和,可以推出关于内参数的两个约束关系:

(4)

(5)

令,推导后发现B是对称矩阵,可以由下面的6维矢量来定义

如果以标记H的第i列,则有.对一个给定的H,内参数约束关系(4)和(5)就可以用下面的关系表示:

(6)

如果我们有n副平面模板的图像,则可以得到

(7)

V是的矩阵,当时就可以得到b的唯一解,并根据b来求解摄像机的内参数矩阵A.内部参数确定后,外部参数可以很容易得到.

4.基于OpenCV的算法实现

4.1 OpenCV简介

OpenCV(Open Source Computer Vision Library)是Intel公司开发的开源计算机视觉库,由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法.其中,针对摄像机标定功能,OpenCV实现了发现与跟踪定标模式、定标、基本矩阵估计、齐次矩阵估计等算法.通过调用这些接口函数,用户可以方便地实现所需功能,而不用进行复杂的数学计算.

4.2 OpenCV实现算法用到的主要函数

参考第3节阐述的算法,我们在利用OpenCV进行单摄像机标定时,采用平面棋盘模板作为标定物(如图1所示).使用棋盘格做标定物的优点在于角点多,且便于计算位置.

在进行标定前,需要获知棋盘模板上内角点的数量以及各个角点的坐标值.在标定过程中,主要用到了cvCalibrateCamera2这个接口函数.这里对函数做简单介绍.

void cvCalibrateCamera2(const CvMat* object_points,

const CvMat* image_points,

const CvMat* point_counts,

CvSize image_size,

CvMat* intrinsic_matrix,

CvMat* distortion_coeffs,

CvMat* rotation_vectors等于NULL,

CvMat* translation_vectors等于NULL,

int flags等于0);

函数cvCalibrateCamera2从每个视图中估计相机的内参数和外参数.参数object_points表示定标点的世界坐标,为3xN或者Nx3的矩阵,这里N是所有视图中点的总数;image_points为定标点的图像坐标,为2xN或者Nx2的矩阵;point_counts向量指定不同视图里点的数目,为1xM或者Mx1向量,M是视图数目;image_size表示图像大小,只用在初始化内参数时.intrinsic_matrix即为3x3的内参数矩阵,OpenCV中检测设图像坐标系中两坐标轴夹角为90度,故此矩阵中只含,,,四个变量,这四个变量使用前必须部分或者全部初始化.distortion_coeffs表示形变系数,为4x1或者1x4的向量,里面为形变参数[k1,k2,p1,p2].rotation_vectors为3xM或者Mx3的矩阵,里面为旋转向量.translation_vectors为3xM或Mx3的矩阵,里面为平移向量. 4.3 流程分析

借助OpenCV提供的函数,我们按照下面的流程来进行实现标定算法.

Step1打印一副棋盘图贴到一个平板上,转动该模板,用摄像机拍摄20张(一般多于6张即可,多了结果可以更精确)图片.

Step2对于每一张图片都用cvFindChess-boardCorners提取角点坐标,这个函数提取的仅是一个粗略坐标,然后调用cvFindCornerSubPix()来获取精确角点坐标.提出来后可以用cvDrawChessboardCor-ners画到图片上.有几张图片,这个过程就重复多少遍.最终提取的20张图片角点坐标全存到N*2维矩阵指针image_points中.

Step3初始化待标定点的三维坐标,也是20张图片上的角点坐标全赋值.角点的三维坐标都存到N*3维矩阵指针object_points中.

Step4调用cvCalibrateCamera2求摄像机的内外参数矩阵.对于外参数,该函数实际得到的是N*3维的旋转矢量和N*3维的平移矢量,而不是矩阵.N行的矢量,第i行就对应着第i张图片的外参数.如果想得到3*3的矩阵形式,需要先把第i行的值取出来,再调用函数cvRodrigues2进行转换.

5.结论

本文采用了一种简单而有效的共面标定物,利用OpenCV提供的函数进行算法的实现.实验结果显示,使用OpenCV中的相关函数,可以方便地进行数学计算,简单有效地完成摄像机标定,由该算法获取的摄像机参数具备相当的精度.