有一天,蟹老板找底下的员工川建国同学:
等蟹老板走后,然后转头问旁边的学霸李雷同学:
李雷同学整理了下情绪:
有人反映哦,有时候我们发出来的技术贴太硬了,不方便去理解,于是,就有了上面这个尝试,在开始正课之前,我们先讲一段故事。如果大家觉得OK,后面我们将继续用这种方式来讲课,如果不OK,请大家在我们评论区提供您宝贵的意见。
这次单目相机标定教程,预计有三期,第一期讲单目相机成像过程,第二期讲MATALAB和OpenCV的单目相机标定实践,第三期则讲张正友标定法的原理。这里是3D视觉工坊嘉宾,Atlas博士生计算机视觉大讲堂,致力于把计算机视觉知识讲得不那么无趣!
01 什么是相机标定?
说到相机标定,就要先说什么是传感器的标定。我们知道,任何传感器,它都是存在有误差的,那么狭义上说,标定就是去校正这部分误差,让传感器尽量准确一点。我们来看相机标定前后输出图像的差别:
图1 相机标定前后输出图像的差别
有人说了,那为什么相机出厂前,它不提前做好标定呢?
李雷同学又鄙夷了一次建国同学:
出厂前相机标定,厂家想做(谁不想自己的传感器准一点呢),但这个真还不是厂家懒,它真做不了。因为相机要标定的参数,跟相机实际的光圈、焦距大小有关,而这两个参数,在一般的工业相机中都是可调节的,所以只能你自己来标定。
常见单目相机标定方法是张正友标定法,这在很多软件,比如说MATLAB、或者库OpenCV中都有相应的实现。至于相机标定,要标定哪些参数,先让我来和你说一下单目相机的成像模型。
哦,对了,要补充一点,我们常说的标定可不光光指纠正传感器的误差,当涉及到两个或者多个传感器的标定的时候,往往还包括计算出这些传感器间的相互位置关系。比如说在机器人系统里,我们经常需要在不同坐标系下转换位置关系,那么我们所说的一些标定还包括标定出这些关节、传感器之间的相互位置关系。再比如说我们双目相机的标定,就包括左相机、右相机的传感器误差标定,还包括它们之间相互位置关系的这么一个标定。
概括一下,常说的标定包括两部分内容:传感器误差的校正、传感器相互之间的位置关系。
而单目相机的标定主要指前者,传感器误差的校正,常用的方法是张正友标定法。
02 理想单目相机成像模型
实际上,小孔成像的模型其实可以看作是针孔相机模型的基础:
图2 小孔成像模型
进一步地,针孔相机模型可以简化为下面这个模型:
图3 针孔相机模型(未翻转)
图中,P是物点, 是前者在CCD上成像的像点,而是相机的光心,则为成像平面到光心的距离,我们称之为焦距。
实际上,焦距的定义会更复杂,是所有平行光透过透镜汇聚一点,那一点到透镜光心的距离,它就涉及到摄影里非常专业的概念最小弥散圆了,我们之后会讲一期相机光圈、焦距、景深、视场大小、最佳成像距离的专栏。
这里先把模型简化一下吧,下面我们来讲整个成像过程,在相机成像模型中,主要有四大坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。
图4 四大坐标系
其中:
世界坐标系(3D):世界坐标系就是以外界某个参考点建立的坐标系,单位为mm,或者m。
相机坐标系(3D):以光心建立相机坐标系,其中轴指向相机的正前方。
图像坐标系(2D):光心在成像平面的投影,也就是点建立另一坐标系,称为图像坐标系,单位为mm。
像素坐标系(2D):像素坐标系是我们最终用户所看到的,也就是坐标系的原点在图像左上角,单位为像素。
那么这中间,我们怎么建立实际物理点(世界坐标系)到图像上点(像素坐标系)的一一映射呢?需要三步转换,也就是:
世界-> 相机 -> 图像 -> 像素
这中间,这些坐标系有什么差别,它们是怎么转换的?请看下面的文章。
2.1世界坐标系 -> 相机坐标系
我们知道,世界坐标系就是以外界某个参考点建立的坐标系,而相机坐标系则是以相机的光心作为坐标原点,光轴的正方向作为Z轴建立的坐标系,两者属于刚体变换,只需要进行旋转和平移,如下所示:
图5 世界坐标系到相机坐标系的转换
为了统一旋转和平移,我们将其写为齐次形式,至于为什么要用齐次,我们之后的栏目里也会说,总而言之是这样的。
2.2 相机坐标系 -> 图像坐标系
在完成了世界坐标系 -> 相机坐标系的转换后,我们再从相机坐标系 -> 图像坐标系。为了方便描述,我们将针孔相机模型对称翻转过来,如下图所示,从数学的角度,它们是等价的:
想不明白没关系,这里就算是不等价的,我们就假设相机的电子设备已经帮我们做好了这样一个翻转
图6 针孔相机模型(翻转)
先回顾一下前面所说的,如我们之前所说:P是物点、P’是像点,现在我们将它翻转过来了,记作小写的p。其中:
跟之前的公式统一一下,写为齐次形式:
2.3 图像坐标系 -> 像素坐标系
在图像坐标系中,坐标的原点在图像中间,而我们平时处理图像时用的坐标系,称为像素坐标系,坐标系的原点在图像的左上角,此外它们的度量单位也不同,前者的单位是mm,而后者的单位是像素。如下图所示,两个坐标系之间的差别:
图7 图像坐标系和像素坐标系的差别
CCD并不是一个正方形,dx、dy的大小是有所差别的
将其进行移项,并写为齐次的形式,有:
2.4 汇总
总结一下之前所说的四大坐标系的关系:
图8 四大坐标系间关系
它们的公式如下:
1.世界坐标系->相机坐标系
2.相机坐标系->图像坐标系
3.图像坐标系->像素坐标系
那么将这些式子联立,最终得(你可以尝试自己去推导一下,就是几个式子代换一下):
进一步化简:
这个公式就是整个单目相机在理想情况下的成像公式,可以建立世界坐标系到像素坐标系的一一映射。
再补充一个知识点,归一化平面:
归一化平面,其实际是图像坐标系的等比缩放,也就是当f=1的情况,主要是便于公式推导,它与图像坐标系是等比缩放关系,只需要乘以f即可完成相互转换。
图9 图像坐标系与归一化平面关系
03 相机畸变
以上是理想情况下世界坐标系到像素坐标系的转换。而由于相机制造工艺的原因,其成像过程中难免存在着畸变,在后续构建精确的三维重建算法前,我们要对相机的畸变进行矫正,以提高算法重建的精度,这一步骤才称为相机标定。
3.1径向畸变
径向畸变原因:在相机制造过程中,很难保证镜头的厚度完全均匀,由于制造工艺的原因,通常为这种情况为中间厚、边缘薄,因而光线在远离透镜中心的地方,会发生更大程度的扭曲,这种现象在鱼眼相机(桶形畸变)中尤为明显。
径向畸变主要有两种类型:枕型畸变和桶型畸变,示意图如下:
图10 相机径向畸变
需要注意的是,这里校正,并不是用的系数越多,整个矫正结果越精确,我们应该考虑相机的实际情况,选择合适的参数数量。
3.2切向畸变
切向畸变原因:切向畸变产生的原因在于相机在制造过程中,成像平面与透镜平面不平行,产生了透视变换。
图11 切向畸变
这种畸变可以由以下公式描述,它也与距离图像中心的距离半径有关:
3.3合并考虑
将径向畸变和切向畸变合并,只需要将两个畸变矫正直接加起来即可,公式如下:
合并考虑畸变原因:其实也很简单,两种畸变是同时发生在成像过程中的,发生的原因也是相互独立的,而且也都是关于距离的表达式,你似乎也找不到更好的方式来综合考虑这两种误差,实践证明,这种合并考虑畸变的情况效果还不错。
04 成像过程总结
我已经把所有需要记住的知识点汇聚在一张图片上了,请大家对照着前面的文章去理解:
05 思考问题
当看完这次推文之后,请大家在脑海里梳理以下几个概念:
- 世界坐标系、相机坐标系、图像坐标系、像素坐标系、归一化坐标系,它们之间的差别是什么,怎么进行相互转换?
- 径向畸变、切向畸变、它们的主要因素、以及如何去校正?
- 最好的话,你自己去画这个图,去推导一遍公式。虽然你后面公式会忘,但相信我,3D视觉领域好多公式,我不需要你记住它,但你要有个直觉印象,去推导一遍有助于你真正理解这个公式。
当明白了这些以后,下节课我们讲,怎么通过张正友标定法去获得要标定的参数,标定得来的参数怎么用,用MATALAB跟OpenCV分别去实践,不过在此之前,你要自己思考以下这些问题:
- 相机标定,我们究竟要标定那些参数?
- 相机畸变发生在四大坐标系转换的哪一过程?
- 假设我们拿到了这些参数怎么用?
- 对于每个物点,在像素坐标系下都有唯一像点与之对应,那么反过来是否成立?
- 怎么去评判标定的好不好?
大家还想要我们讲什么呢?请踊跃留言!高能预警,下节课我们将以视频的形式来讲解。不过,如果你没有好好看这个相机成像过程的文章,下节课我讲的再有趣也是白扯~这里是3D视觉工坊嘉宾,Atlas博士计算机视觉大讲堂,致力于把计算机视觉知识讲得不那么无趣!
准确说,Atlas今年博一,应该讲博士生~
当然啊,之后包括多个传感器的时间戳同步、怎么去做融合,这些在我们后续的教程中都会讲,请关注我们的公众号《3D视觉工坊》。我相信,未来视觉领域,一定是3D视觉的世界,如果你可以从头到尾完整地跟完我们整个课程,并且掌握的话,在硕士期间,再尽量去找一些实习,如果你打算从事3D视觉领域,我相信一定会收到一份不错的offer的。
本文仅做学术分享,如有侵权,请联系删文。