查看原文
其他

【强基固本】《CV中的多视图几何》——相机模型与标定

“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理、神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。

作者:知乎—Kissrabbit

地址:https://www.zhihu.com/people/yang-jian-hua-63-91

今天总结一下相机模型这一块的内容,主要内容是讲解针孔相机模型,对于仿射相机模型、无穷远相机模型不多说,用得较少,然后再说完相机模型后,会详细讲一下目前最最常用的张正友标定法。总的来说,本文主要内容如下:
1. 相机模型,主要讲解针孔相机模型;
2. 详解针对针孔相机模型的张正友标定法;
做计算机视觉,必然离不开相机,对相机不了解,如同上了战场不知道怎么放枪。所以,在一切工作的开始之前,先谈谈相机模型是必不可少的工作,我们先从最具体和最简单的相机模型即针孔相机模型开始。

01

基本的针孔相机模型
考虑空间中的一个点  ,到一张平面上的中心投影,令投影中心位于一个欧式坐标系中,投影平面处在  的位置,称之为图像平面或者聚焦平面。如图一所示,其中相机中心也成为光心,相机中心到图像平面的垂线称为相机的主轴或主射线,而主轴与图像平面的交点称为主点,过相机中心平行于图像平面的平面称为相机的主平面。
图一 针孔相机模型
由简单的相似三角形关系,就能得出来图像平面上的投影点坐标  与空间点坐标的关系:
(1) 
将上式写成矩阵的形式:
(2) 
其中的  很容易想到就是空间点在相机坐标系中的深度,不过,更一般的写法是可以把等式左边的  换成一个“尺度因子”  ,不过,在实际情况中,我们还是常常把这个尺度因子取成深度值  ,所以这里的就不采用教材中的公司符号来写了。
由于相机都是采用像素来表示图像信息的,因此需要对图像平面进行量化,即用“像素”这种量化单位来表征图像平面的信息,因此,从图像平面到像素平面之间还有一个尺度伸缩(取决于单位像素的尺寸)和平面的变换(取决于像素平面的坐标原点设定,通常采用图像的左上角作为),我们设像素坐标为  ,则具体像素坐标与图像坐标之间的关系为:
(3)
将(2)式带进去,然后再写成矩阵形式,我们就可以得到:
(4)
设  , 这里,  ,称之为相机的标定矩阵或内参矩阵 ,则上式可以更简洁地写成:
(5) 
其中, 
这里,补充个小概念:归一化坐标。回到(4)式,可以很容易地处理得到:
记  ,其实就是前面提到的图像平面坐标,这里我们从相机坐标系来考虑,这就相当于相机坐标系  平面上的点,因此,称之为归一化坐标。因此,整个过程大概可以描述为:空间点  →归一化坐标  →像素坐标  。
设定由于相机坐标系通常总是运动的,所以我们更关心的是世界坐标系(固定坐标系)的空间点,而上式是从相机坐标系开始研究的,即  ,所以这中间必不可少地要涉及到从世界坐标系到相机坐标系的一个坐标系,不妨设相机坐标系在世界坐标系中的位姿矩阵  如下:
(6) 
其中,  表示相机在世界坐标系中的姿态矩阵,  表示为相机光心在世界坐标系中的坐标,即光心相对于世界坐标系的平移量。而  下角标的含义如下:
对于(6)的位姿矩阵,我们称之为相机的外参矩阵。
则世界坐标系中的空间点  变换到相机坐标系中的点  的变换公式如下:
(7) 
很容易知道表示世界坐标系在相机坐标系中的姿态矩阵,为了形式上的方便、好看,我们就用新的 代替,  ,因此,上式可以更简洁的写成:
(8)
带入到(5)式中,我们便得到了 针孔相机模型的一般表达式:
(9)
另外,对于内参矩阵  补充一点,通常,由于相机的知道误差,图像平面很难保证XY轴是互相垂直的,因此,需要对  增加一个系数  ,称之为扭曲参数,于是,一般的相机内参矩阵形式如下:
不过大多数时候,  也足够用了。


02

张正友标定法
讲完了相机的针孔模型,下面就说说如何去确定相机的内参矩阵。通常,相机在出厂的时候,都会得到已经标定好的内参,但是我们在使用过程中,内参不可避免地会发生些变化,并且,使用久了的相机的内参也会与刚出厂时候有些差别了,因此,对相机的标定是计算机视觉中十分重要的一步。对于摄像机标定,有很多方法,包括传统的标定方法(需要事先做一个精确的互相垂直的3个平面)、和自标定法,这里我们详细介绍一下最常用的张正友标定法,相关方法都已经在OpenCV中、MatLAB中写好了,实际标定的时候可以直接调用相关的库函数。
同时,这里也推荐一遍博客,详解了如何使用OpenCV进行张正友相机标定,写得非常好
https://blog.csdn.net/dcrmg/article/details/52939318
下面,来详细讲一下张正友标定法的原理。
张正友标定法是基于针孔相机模型的,相关公式我们再写一遍:
(1)
原文的公式形式如下:
记像素坐标为  ,3D点坐标为  ,则上式可写为:
其中的  是尺度因子,这在上面说过,之前我们直接就取了深度  ,这在实际中通常是这么做的,不过这里采用更为一般的形式来研究问题,毕竟标定过程中,我们并不知道这些点的深度是多少。姿态矩阵  按列向量的形式来书写  ,  与上文提到的  是一样的;  即相机的内参矩阵,形式如下:
其中的  即为上文给出的  中的  。
张正友标定法中拍摄的图像是一个平面(比如棋盘图),为了方便,不失一般性的将世界坐标系建在了这个平面中,所以所有的空间的坐标的  值都为0。因此,可以更简单地写为:
改记  ,  ,称之为单应矩阵(homography),整理可有:
事实上,由于尺度因子  的存在,导致单应矩阵 存在一个尺度性,即  只有8个自由度,不妨记  ,我们有:
很显然,  (即把  拿到了  中,形式上有  )。于是,可以得到下面两个关系式:
形式上,我们记:
我们将  展成一个向量(目的是为了后面构造一个便于求解的线性方程组):
于是就可以将上面关于  的两个方程改写为如下形式:
其中,
最终我们有了关于向量  的一个方程:
对于这个方程的求解,就很容易了,无论是  还是最小二乘法。我们观察一下上面的过程,不难发现,只要求出了  ,我们就能计算出相机内参和尺度因子  (而  ),具体公式如下:]
同时,有了,对应图像的相机外参也能计算出了:
然而,到这里,就会有一个问题,想求出  ,得先知道  ,而想知道  ,就得先知道  ,对于解这个  ,原文的附录A给出了解决办法:
即做一个图中的优化问题来估计  ,其中,  是从图像中获得的像素坐标(如棋盘图的角点),另一个  上三角(打不出来这个符号,,,)是由  来获得的,  是角点的空间坐标。因此,我们会发现,想解决这个优化问题,我们必须获得像素点坐标和对应的空间点坐标,因此,在使用张正友标定法时,需要量一下棋盘图格的长宽、棋盘格有多少行、多少列,为的就是能够获得角点的空间点坐标(这里就需要我们保证提取棋盘图角点时能够获得棋盘图上的所有角点,便于我们写个简单的算法就获得这些点的空间坐标,否则的话,这张图像就作废,换下一个),这个需要手动去量实际中所使用的棋盘图格的长宽,算是该算法的一个局限性吧。
不过,从上面获得相机内参外(重点在内参,我们对于在标定过程中计算出的相机外参并不是很关注),往往会受到噪声的影响,因此,需要做一个优化问题,来优化一下结果。
对于这个优化,没有什么可说的,比如使用 Levenberg-Marquardt算法。
除了内参,还需要标定相机的畸变系数,张正友标定法中只考虑了影响较大的径向畸变,对于切向畸变没有考虑。我们记  为理想情况下(即不存在畸变)的像素点坐标,  为实际中存在畸变的像素点坐标,类似地,再记  为理想情况下(即不存在畸变)的归一化坐标,  为实际中存在畸变的归一化坐标。径向畸变的公式如下: 
而由针孔相机模型我们又有归一化坐标和像素坐标之间的关系:
 ,
, 
代入上式得到:
做一下形式上的处理,就可以得到下面的线性方程组:
对于这个方程组的求解,也没什么好说的。不过,有个细节要说一下,就是如何获取  ,毕竟必须知道这几个数才能解上面的方程。
1.对于  :直接用3D空间点(上面在说计算  的时候已经提到了这个3D点的获取的事情)计算出归一化坐标即可;
2.对于  :使用针孔相机模型公式(4)计算即可;
3.对于:直接从图像中获得(如棋盘格的角点坐标)。
于是,畸变矫正的事情也说完了,在具体操作中,可以先在不考虑畸变的情况下,估计出相机内参,然后再用这个估计出的内参代入畸变的公式中去估计畸变系数,然后轮流优化畸变系数和内参,不过作者发现这样收敛很慢,而同时优化他们效果会更好:
至此,张正友标定法说完了,在实际过程中只要采集(至少)3张图即可完成标定(注意,不要有彼此平行的图像,这样会造成退化,对于此问题很好解决,拍照的时候转转相机就完事了),当然,多拍几张有助于提高标定的精度。
最后说一嘴,由于张正友标定法已经在OpenCV、MatLAB中都有相关的库函数了,所以,不需要我们自己再去造轮子了,我们只需要对这一方面的基本原理有个清晰的认识即可,没必要去亲自实现一遍,造别人已经造好的轮子,何况自己造的那轮子效果未必就能比人家的轮子好。
最后祝每一个阅读此文的小伙伴都能发顶刊、顶会呦~~

本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。


“强基固本”历史文章




分享、点赞、在看,给个三连击呗!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存