第二更,相机参数标定基础:从小孔成像开始到单双目标定
目录第一章 相机模型第二章 各个坐标系的定义和相互关系(1)相机坐标系与图像坐标系的关系(2)相机坐标系及图像坐标系与像素坐标系的关系(3)世界坐标系与其他坐标系的关系(4)关于齐次坐标系(5)畸变模型(5.1)径向畸变(5.2)切向畸变第三章 单目相机标定(1)张氏标定法(1.1)计算单应性矩阵(1.2)计算计算二次曲线映射矩阵(2)ope...
目录
本文是前一篇博客《相机参数标定(camera calibration)及标定结果如何使用》的第二更。
关于实践部分,请关注后续博客
所有这些东西,重在理解,关键是实际应用。对于工程而言,也没有必要把公式死记硬背,搞得滚瓜烂熟。
为什么要二次更新?
有很多同学通过留言,或者私下沟通反映了很多问题。而且对于单目标定和双目标定的理论基础没有分开讲清楚。所以博主强烈建议您先把第一篇博客看完,尤其是坐标系那一节。
为什么不在原来的基础上更新?
前一篇博客的整体架构已经确定了,没有打乱从来的必要,更像是一个知识点的普及。同时,这一更会把上一篇的有些内容也再次概括进来,在此基础上增加单目,双目,透视变换,单应性的一些知识。这样,基本上就把标定的理论基础说明白了。
本文尽量少用公式,免得看起来乱糟糟的,不明所以。尽量告诉大家,这些公式是怎么来的,帮助您理解标定的一般性原理。我再次强烈建议您把两篇博客结合起来看,并且先看第一篇,即,阅读顺序为:
先读《相机参数标定(camera calibration)及标定结果如何使用》
再读《第二更,相机参数标定基础:从小孔成像开始到单双目标定》
内容量有点大,但是里面需要思考的逻辑内容,博主都给你写出来了。您不需要动太多脑筋,博主的目的也就达到了。尽量不搞一些难懂的数学推导,阻挡继续读下去的信心。
本文已同步至公众号。如果您觉得本文对您帮助很大,可以扫描赞赏码支持作者,关注公众号,推荐给其他人。您的支持,是博主持续创作的动力。博主已经将本文所有内容的文档版本分享到了公众号,供下载,欢迎关注下载。
相机标定离不开特征点检测,关于特征点检测方法,可以查看我的另外几篇博客
另外,笔者也在公众号中分享了很多干货,关注公众号即可获取。先睹为快。
老鼠集,请回复:1
无参考图像质量评价,请回复:2
局部拉普拉斯滤波,请回复:3
可编辑的《Harris特征提取》PPT,请回复:4
完整可编辑的《透视变换》PPT,请回复:5
SIFT完整可编辑PPT及代码,请回复: 6
20款HDR图像生成工具下载地址,请回复:7
HDR视频色调映射算法综述翻译,请回复:8
HDR视频色调映射算法文章下载,请回复:9
LogMap色调映射代码,请回复:a
安卓端人工智能应用tensorflow lite 安装包下载,请回复:b
用CNN实现单幅图像生成HDR图像代码及论文,请回复:c
单目相机和双目相机标定通用代码和使用说明(机器人用的ROS):请回复:d
本文是原创内容,未经允许不接受任何形式的转载抄袭!
话不多说,进入正题。
第一章 相机模型
相机模型可以用小孔成像模型来近似代替,可以用如下的图来表示。千万不要对这个图有误解,为什么焦距是像平面到小孔的距离,下面会说明。
问: 孔是不是越小越好呢?
当然不是。我们借用其他以发表文章的中描述来看。
可以明显的看到,孔越大,成的像成发散。孔越小,就会出现衍射现象。
问:为什么小孔到像平面的距离是焦距,为什么要搞一个虚拟像平面?
第一篇博客中已经说过,像平面就是成像的位置,这个是用户自己设定的,就是CCD传感器的位置,而焦平面就是镜头的焦距所在平面。当像平面刚好和焦平面重合时,此时所成的像是最清晰的。也就是我们经常说的“刚好对焦上了”。我们用一个图来说明。
实际上,由于物理条件的限制,像平面和焦平面是不可能完全重合的。如果改变了镜头的形状和尺寸,那么焦平面的位置也会发生变化。对焦的时候就需要重新调整CCD的位置,使其与焦平面重合。这解释了为什么是焦距。
我们还是用上面的小孔成像简化图来说明。因为真正的像平面所成的像是倒立的,而我们实际中,更习惯于正立的看待问题,所以就用虚拟的像平面代替真正的像平面。如果不做特殊说明,我们在下面的描述中,就用像平面代替虚拟像平面。相应的,成像简化图就变为如下所示。
我们把虚拟像平面的线条变成实线。这个图是不是似曾相识,就跟我们在第一篇博客中看到的坐标点图是一样的。不急,我们在下面慢慢说。请记住这个图。
问题又来了,三维中的点是如何投影到像平面?如果我知道三维中的一个点,能计算到它投影到像平面的哪个像素吗?
为了解决这个问题,我们就必须定义坐标系。一个坐标系是不够的,需要多个坐标系同时使用。
第二章 各个坐标系的定义和相互关系
在前一篇博客中,我们实际上已经对各个坐标系的定义做了详细的说明。但是,结合本文所画的图,再重新换一种描述方式。我们先上一个图。
相机坐标系,原点在相机的中心C,也是镜头的光学中心。Z轴是光轴,与像平面正交。Z轴穿过像平面,有个交点P,就是主点。相机坐标系定义了物体的三维坐标。例如,Q点。
图像坐标系,图像坐标系位于像平面,原点就是主点P。其坐标轴与相机坐标系的坐标轴是平行的。
像素坐标系,坐标原点在图像的一个角(为了区分左上角,我们称为一个角,这样放坐标系是为了好看)。
图中,CP之间的距离就是焦距f。
(1)相机坐标系与图像坐标系的关系
回到我们在第一章结尾提出的问题,如果我们知道Q点的坐标Q(X,Y,Z),我们想知道图像中这个点投影到了那个像素。也就是上图中q点的坐标是什么。我们再来推导一遍。先上图。
显然,根据相似三角形原理,q在相机坐标系中的坐标为:
q在图像坐标系中的坐标为:
对q加上一个齐次坐标,就可以写为:
(2)相机坐标系及图像坐标系与像素坐标系的关系
因为图像坐标系和像素坐标系之间有平移变换,所以,考虑到这些因素,从图像坐标系到像素坐标系就有如下关系(相机中感光器件每个像素的物力尺寸是dx * dy,udx及vdy就是实际的物理距离):
那么进一步的,
所以,fx和fy是这么来的。以上也是大多数博客讲解的内容,博主之前的博客也是这样写的。但是,还有另外一个问题需要考虑,实际的像素排列方式并不是矩形,有可能存在一个倾斜角。如下图所示。
这种情况下,像素坐标系和图像坐标系的关系就变得复杂了,用一个简单的示意图来说明。
我们真正想要的坐标就是那两个红蓝的叉叉处的坐标。所以,通过简单的三角函数计算,就有如下的公式:
最终,
最后,我们令
那么K就是最终的相机内参。这一点,很多博客,包括一些论文都没有提到。
(3)世界坐标系与其他坐标系的关系
世界坐标系是图像与真实物体之间的一个映射关系。我们还是以蜡烛作为例子,虽然我们已经构建了相机坐标系,图像坐标系和像素坐标系,但是,如果我想知道真实中这个蜡烛有多高,拍摄时,蜡烛离相机有多远。仅仅依靠这三个坐标系是不够的。这个时候我们就引入了世界坐标系。
在下图中,世界坐标系的原点是Ow,而Xw,Yw,Zw轴并不是与其他坐标系平行的,而是有一定的角度,并且有一定的平移。(详细的推导可以参考博主的第一篇博客)
将旋转,平移都考虑进去,则
进一步
R和T请参考我的第一篇博客。
上面的公式中,K(~)是内参矩阵,而R,T是外参参数。至此,我们就通过坐标系关系的推导,将相机的内参和外参讲明白了。
有了世界坐标系后,事情就好办多了。假设事先已经知道了内参和外参,那么相机随便拍摄一张图片,我就知道土拍你中目标物的位置和尺寸大小。至于怎么得到内参和外参,我们会在下面的内容做详细说明。
(4)关于齐次坐标系
很显然,在上面图像坐标系中,关于q的这样一个变换不是线性变换,那是因为坐标中有除法运算。此时,就引入了齐次坐标系。在第一篇博客中,我们大致说了为什么用齐次坐标系。我们只是说类似于透视变换,用于区分点和线。这一节我们进行推导。还记得那个图吗?
引入齐次坐标后,实际上就是对坐标加了尺度算子,只是表达方式发生了变化。例如,对于像平面上的q点,引入齐次坐标后,就有(我们用简单的形式,认为像素是矩形,且像素坐标系的坐标轴是垂直的)
怎么理解呢,我们用一个图来解释。
也就是说,在Q点投影线上的所有点,都会投影到像平面上的q点。
我们再看个图
如果两条铁轨之外,还有其他与之平行的线,那么这些平行线也会相交于相同的点。这就是透视效果。那为什么实际中的平行线,在像平面是相交的呢?我们来简单证明。
V0,V1,V2是平行线,D是向量方向。这些平行线的起点不一样,但是方向是一样的。对于任何通过向量V,且方向是D的直线,可以表示为
然后通过内参矩阵K做投影,
当t趋近于无穷时,
也就是说,真实的平行线,当平行线趋近于无穷时,在像平面上的投影,其投影相交于一点。
一个简单的理解就是,把D平移到相机中心,D与像平面的交点就是平行线在像平面的交点。
为什么呢?可以这样理解,因为D本身就是在相机坐标系中,而且是向量表示方法,可以看作是平行线的基向量,故D可以看作从相机坐标系原点出发的向量。又因为,像平面的平面方程在相机坐标系中的表示为Z=f,D向量与像平面的交点坐标为(D向量的终点不是交点,请注意那个箭头)
这个结果跟我们上面用投影矩阵推导的结果是一样的。所以,如果知道了平行线的方向向量,很容易就求得像平面上的交点。如果有人再提起为什么两条平行线会相交,你可以理直气壮的大声喊了。
(5)畸变模型
造成图像畸变的原因有很多,总结起来可以分为两类:径向畸变和切向畸变。一般情况下,我们会同时考虑径向畸变和切向畸变。那么,如果相机镜头是完美的,则真实世界的点坐标映射到像平面的点,其关系就应该是我们在前面所描述的那样。但是,实际上镜头并不是完美的,这就导致了实际上像平面的点,偏离了完美的那个像点。所以我们要去校正。用一个图来说明这种偏离。
图中dr是径向畸变的大小,而dt是切向畸变的大小。假设完美的映射点坐标是(x,y),畸变后的点的坐标是(x’,y’)。那么,满足如下的坐标变换关系
下面,我们来分别求解每一个畸变值。
(5.1)径向畸变
上图
模型推导:
径向畸变是由有缺陷的透镜的径向曲率引起的。根据众多的光学理论研究结果,径向畸变的变换值满足偶次多项式变换关系。也就是说
这一部分,如果读者有兴趣,可以参考文末的参考文献,里面有说明。
(5.2)切向畸变
切向畸变的示意图如下所示。
模型推导:
根据Brown-Conrady模型(请参考文末参考文献),切向畸变的畸变公式为
第三章 单目相机标定
在前面的章节中,我们已经构建了各个坐标系,并且也知道了各个坐标系之间的变换关系,同时,通过关系推导,得到了相机内参和外参矩阵。有了这些知识积累,对于单目相机的标定来说,已经足够了。但是,如何求解这个内外参矩阵呢?
本节主要参考张正友相机标定的一些知识。
https://www-users.cs.umn.edu/~hspark/CSci5980/zhang.pdf
另外还有各种各样的标定安装包,笔者认为第二章的内容是你用这些安装包的关键。而第三章只是一个大概的介绍,具体的推导过程就不说了。为什么?模型的构建过程是精髓,而模型的求解是工具。虽然两者缺一不可,但是本文专注于模型的构建过程,至于如何求解模型,直接用即可。同时我也相信,大部分同学真正关心的是第二章。(鄙人之见)
(1)张氏标定法
古老的做法是在相机的前面放上一个三维的标定板,执行如下的操作:
第一,在相机的前面放一个3D的标定板,测量三维标定板的各个参数,距离等
第二,相机拍照,提取图像关键点,根据坐标变换关系求解参数。
但是用3D标定板,其成本还是比较高的,而且可操作性不强。所以就有了后来的张正友标定法。方法思想是对同一个平面标靶,从两个以上的不同角度进行拍摄,对摄像机和标靶的移动方位不做限制,不需要得出移动参数;在标定过程中,假设摄像机的内部参数为常数,只有外部参数发生变化。
用张氏标定法求解摄像机参数时,大致可以分为两个步骤,第一是计算出标定板与像平面之间的单应性矩阵;第二是计算二次曲线映射矩阵。完成前两步后,就可以用前两步的结果,求得参数矩阵。
(1.1)计算单应性矩阵
关于单应性矩阵,可以参考我的另外一篇博客《都在这里了,从仿射变换到透视变换》。在第四章,我们还会再做一个深入的理解。
在齐次坐标系下,世界坐标系中的点M(Xw,Yw,Zw,1),都对应一个像平面的点m(u,v,1)。其映射关系为:
做进一步的参数替换简化
不失一般性,令2D平面参照物中每点Zw=0,则
H就是3*3的单应性矩阵。Hi是单应性矩阵 H 的第i列;R1、R2分别是旋转矩阵R的前两列,T与平移矩阵T相同。利用直接线性变换(DLT)算法计算单应性矩阵的初始值,然后用迭代方法优化最小化代价函数,计算出结果。
(1.2)计算计算二次曲线映射矩阵
首先,我们令
利用最小二乘方法求解可以求解到矩阵B的值。
当B矩阵和单应矩阵求解出以后,摄像机的内参数便可以由计算得出(参考文献二):
那么外参就可以由单应性矩阵和内参矩阵求得
知道这些东西就行了,没必要记住。
(2)opencv中的标定过程
在第一篇博客中,我们只是给了一个例子,这一节,我们大致给出opencv中标定的一个流程图。
是不是应该补一个实际操作实验?(博主手里正好有两个不同型号的某康网络摄像头,其中一个有畸变,将新开两篇博客,手把手教你标定单目和双目相机。同时也会把所有用到的图片,代码等都分享出来。关注公众号即可获得下载链接。)
第四章 再谈单应性
我们知道,单应性是从一个平面到另外一个平面的映射。假设我们有两间密室,两个不同的相机,两个一模一样的物体,两个不同的拍摄者。
假设两个像平面的基向量分别是a1,b1和a2,b2。相机中心到像平面上一个参考点(请注意是参考点,不是原点)的向量分别为d1和d2。(请自行对应第二章的图,加深理解)
现在的问题是,对于上面的情况,我们如何把第一幅图中的蜡烛通过一种什么样的变换关系转换为第二幅图中的蜡烛呢?
结合上图,对于像平面上的任何一个点,都可以用如下的向量公式来表示(X是空间点在相机坐标系坐标)
对于两幅图中蜡烛上的点,则可以分别用向量表示为
通过α和β,我们就知道了相对于每个像平面来说,X1和X2指向的是同一个点。
我们把公式用齐次方程表示
A和B是3*3的矩阵。在三维空间中(可以把两个房间合起来看),X1和X2之间的变换关系为
我们再来看像平面,由于相机的内参不同K1和K2,则在像平面,两个点的像平面坐标分别为(从相机坐标系变换为像素坐标系或图像坐标系)
w1和w2只是齐次坐标的尺度因子。(请参考第二章的内容)
那么将X2=TX1带如到上式中,得到
上面的式中,H就是单应性矩阵。单应的好处是,一旦我们有了它,我们就可以计算从一个投影平面到第二个投影平面的任何点的映射位置,我们不需要知道那个点的三维位置,我们甚至不需要知道相机的参数。
这就为我们下一章双目相机的标定提供了基础。请先记住这一点,可能现在看不出来有什么用。别急,往下看。
第五章 双目标定基本理论
还记得我们在第二章中的那个图吗?
在Q点投影线上的所有点,都会投影到像平面上的q点。也就是说单凭拍张图片,我们很难知道物体离我们有多远,尺寸是多少。
虽然现在有很多基于单幅图像的3维尺寸估计,但是这并不精确。比如说,朋友圈一直很流行的夸张图。
在用双相机做物体距离检测时,我们大致可以分为两种情况。两个相机平行放置,两个相机任意放置。
(1)相机平行放置
平行放置是指两个光轴是平行的,但是相互之间有一定的间距,这个间距的长度是已知的。两个相机的内参和外参也是知道,焦距相同。(右边的相机是左边相机平移一段距离后形成的新相机)下面这个图实际上是个三维的图,只是没有画坐标轴而已。请结合第二章的内容查看。
因为两个相机的焦距都是f,所以,直线C1C2和qq1之间是平行的。因为两个像平面在同一个平面内。又因为C1和C2在Y轴上的坐标是相等的,那么像平面内q点和q1点的y轴坐标也是相等的,即y=y1。而且,在投影线C1Q上的所有点都会投影到右边的像平面,而且不存在点的重叠。
既然这样,我们不妨调转视角,从上往下看。就是说朝着y轴的负方向看,此时就得到如下的示意图。
现在想求Q点离C1C2连线的垂直距离,也就是求解Q坐标中Z的值。
根据相似三角形原理,通过简单的推导,得到
(2)相机任意放置
相机平行的情况太特殊了,实际中,相机的参数不一样,摆放位置也不一样。但是如果按照实际的情况来计算,那将非常复杂。如果可以把任意的这种摆放位置,转换为我们熟悉那种平行模式,不就行了吗?我想看了前面这么多,大胆的想法就是找到左右两个坐标系之间的关系,把其中一个坐标系映射到跟另一个一致就可以了(这也是处理这种问题的一般思路)。现在,我们的目标就是找到这种转换关系。先上图。
这样一个双目系统,两个相机中心的连线C1C2穿过像平面,这条线与两个像平面的交点构成了两个外极点e1,e2。投影线C1Q上的所有点,都会投影到极点e2和投影点q2的连线上。同理的,投影线C2Q上的所有点,都会投影到极点e1和投影点q1的连线上。
那为什么会出现这种情况呢?因为,点C1、C2、Q共处于同一个平面内,那么投影必然会在一条线上。这个平面就是极平面。极平面与两个像平面有交线,就是上面两个图中的那个红色的线,这两条红线就是极线。
通过上图可以很明显的看到,当Q点的位置发生变化时,极平面和极线都会发生变化。但是有一点可以确定,极线一定是穿过极点的,而极点的位置是不会发生变化的。
在平行相机系统中,我们知道两个投影点的y轴坐标是一样的,而且两个相机之间距离也是知道的。这样我们才利用如此简单的公式做Q点距离的计算。
我们还是用上图来说明。假设已经知道了左边像平面上的一个投影点q1,那么根据我们前面所说的一些特性,在右边的像平面上与其匹配的投影点,肯定位于右边像平面的极线上。也就是,我只需要在这条线上找匹配点,而无需搜索整个图。既然在右边这条极线上寻找匹配的点,然后进行计算,那么就需要把右边这条极线按照一定的转换关系转换成根左边的极线平行,这样的话,不就可以进行测距了吗?
(2.1)F矩阵推导
假设我们已经知道了如下的投影关系,
特别的,当两个像平面平行时,极点在无穷远处。而且每个像平面的极线跟像平面的水平轴时平行的。(想象以下,把上图的两个平面使劲的往外掰,那么外极点也就越来越往无穷远处跑)
郑重说明:在写极线几何这一部分的时候,参考了很多博客、论文、教案。我发现大部分的博客都是按照本质矩阵和基本矩阵的模式来的。直到我看到了【参考三】的知识(可自行下载阅读),让我眼前一亮,而且容易懂,只是有个小地方需要注意(很多博客只是照搬,没有说明白,看的云里雾里),但博主已经给你打通了,不用担心。
右边像平面上的极线L2(穿过e2和q2的线)可以表示为
需要注意的地方就是这里,为什么是叉乘?叉乘的结果不就是垂直于叉乘的两个向量所在平面吗?我们来分析。
e2和q2均为3维齐次坐标,实际上就是点的向量。因为q2是齐次坐标,也就是说,对于每一个尺度因子w2,就对应C1Q线上的点,其在右边像平面上的投影都落在L2这条极线上,那么也就是说,每一个w2的值,就对应一个叉乘的结果,也就对应一个垂直的向量。所有垂直的向量就组成一个面,这个面刚好跟右边像平面垂直,两个面的交线就是极线L2。所以,L2表示为e2和齐次坐标的q2的叉乘是合理的。我们用一个示意图来表示。
理解的关键就是要知道,q2不是指一个点,而是一系列的投影点的表示。
在第四章中,我们已经知道,空间的点在两个像平面上的投影是可以通过单应性矩阵来联系的。即
那么就可以得到
F就是3*3基础矩阵。对于左边像平面上任何q1,都是通过这个基础矩阵进行映射成右边的极线。进一步的在上面等式两边乘以相同的项,得到
又因为q2在极线L2上,那么左边的项就是0,
通过这个等式,假设我们已经有了很多这样匹配的投影点对(q1,q2),那么我们就可以求解F矩阵了。
现在又回到了我们在上一节留下的问题,怎么找到这样的匹配点。
因为对于一个确定的双目系统来说,F矩阵就定了,我们只需要找到匹配的点对即可。找关键点的方法有很多,比如用SIFT特征来找(可参考博主另外的博客《完整理解SIFT算法》),我们只需要在左右两边的像平面找到特征点,然后做特征点匹配即可。假设我们已经找到了这样的匹配点对
那么就可以求解下式来取得F矩阵。我们把如下所有这样的公式展开,得到
因为F矩阵有9个未知量,有一个是尺度量(其他值除以F33),是8个量,所以最少需要8对匹配点才行。当然越多越好。
F矩阵有了,我们就可以找到左边像平面上点q1对应的右边像平面上的极线
极线有了,但我们还是不能用两个平行相机模型来计算距离。怎么办呢?也就是说,我们有了F之后,怎么把两个像平面搞成平行的呢?很多博客到这里就没有了,很不舒畅。
现有的一些研究成果(参考四)已经证明(原谅我这样说,因为这样非常有助于理解),当经过矫正后,左右两个像平面的极线在同一条水平线上的充分必要条件是矫正后的基础矩阵变为
那么,最终矫正过程就变成了,找到这样的一个3*3投影矩阵H1和H2,分别对左右两个像平面I1和I2做转换后,满足
求解出H1和H2后,就可以把任意的像平面做转换,转为极线在同一条水平线的情况,也就是两个相机平行的情况,然后求得距离。
怎么求解呢?我们把上面这个公式,和
结合,得到
也就是说,我们只要找到这些匹配点对(q1,q2),就可以求解了。
(2.2)E矩阵推导
关于大家所熟知的E矩阵,本文给出一个通俗理解。
在(2.1)节中,我们看到
而e2点是不同的极线L2在像平面上的交点,通过(2.1)节中的公式是可以知道的。而中间的转换关系T则可能包含平移和旋转。也就是说,两个相机之间,除了内参不一样外,还有空间上的平移和旋转关系(相机坐标系之间)。假设内参已经知道了,那么T就成为经常所说的E矩阵了。只不过,现在这个T把平移和旋转都考虑进去了。而E矩阵实际上也就是F矩阵的一个特殊形式。在历史上,也是先有E矩阵后有F矩阵,只不过本文所讲的叙事方向不一样而已。
这样的推导可能跟网上很多的推导不一样,但是,却对于理解双目标定是十分方便的。
写到这里,我的心情舒畅了很多。
参考一:Michael D. Grossberg, Shree K. Nayar. The Raxel Imaging Model and Ray-Based Calibration[J]. International Journal of Computer Vision, 2005, 61(2):119-137.
参考二:Zhang Z. A flexible new technique for camera calibration[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 2000, 22(11):1330-1334.
参考三:https://www.robots.ox.ac.uk/~vgg/hzbook/hzbook1/HZepipolar.pdf
参考四:Seitz S M,Dyer C R.ViewMorphing[C].New Orleans, Louisiana:Proceedings of the SIGGRAPHICS' 96,1996:24-33.
希望通过本文的讲解,你已经理解了单目,双目相机的标定。
正好博主手上有两个某康的家庭用网络摄像头,其中一个存在明显的畸变,笔者打算把他们利用起来。将会另外开辟两个新博客,讲解实际的应用,并分享所有代码和图片,欢迎您的关注。如果您觉得本文对您理解单双目标定很有帮助,您可以关注博主的公众号分享给其他人,或者打赏。
更多推荐
所有评论(0)