12

一文图解单目相机标定算法

 4 years ago
source link: https://mp.weixin.qq.com/s/0qULaYamP4J2pG2wQuum7g
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一文图解单目相机标定算法

Original Atlas 3D视觉工坊 8/31
收录于话题
#相机标定

点击上方“3D视觉工坊”,选择“星标”干货第一时间送达Image

有一天,蟹老板找底下的员工川建国同学:

Image
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
等蟹老板走后,然后转头问旁边的学霸李雷同学:
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=jpeg
李雷同学整理了下情绪:
640?wx_fmt=png
有人反映哦,有时候我们发出来的技术贴太硬了,不方便去理解,于是,就有了上面这个尝试,在开始正课之前,我们先讲一段故事。如果大家觉得OK,后面我们将继续用这种方式来讲课,如果不OK,请大家在我们评论区提供您宝贵的意见。这次单目相机标定教程,预计有三期,第一期讲单目相机成像过程,第二期讲MATALAB和OpenCV的单目相机标定实践,第三期则讲张正友标定法的原理。这里是3D视觉工坊嘉宾,Atlas博士生计算机视觉大讲堂,致力于把计算机视觉知识讲得不那么无趣!01 什么是相机标定?640?wx_fmt=png说到相机标定,就要先说什么是传感器的标定。我们知道,任何传感器,它都是存在有误差的,那么狭义上说,标定就是去校正这部分误差,让传感器尽量准确一点。我们来看相机标定前后输出图像的差别:
640?wx_fmt=png
图1 相机标定前后输出图像的差别有人说了,那为什么相机出厂前,它不提前做好标定呢?
640?wx_fmt=png
李雷同学又鄙夷了一次建国同学:
640?wx_fmt=png
640?wx_fmt=png
出厂前相机标定,厂家想做(谁不想自己的传感器准一点呢),但这个真还不是厂家懒,它真做不了。因为相机要标定的参数,跟相机实际的光圈、焦距大小有关,而这两个参数,在一般的工业相机中都是可调节的,所以只能你自己来标定。
640?wx_fmt=png
常见单目相机标定方法是张正友标定法,这在很多软件,比如说MATLAB、或者库OpenCV中都有相应的实现。至于相机标定,要标定哪些参数,先让我来和你说一下单目相机的成像模型。
640?wx_fmt=png
哦,对了,要补充一点,我们常说的标定可不光光指纠正传感器的误差,当涉及到两个或者多个传感器的标定的时候,往往还包括计算出这些传感器间的相互位置关系。比如说在机器人系统里,我们经常需要在不同坐标系下转换位置关系,那么我们所说的一些标定还包括标定出这些关节、传感器之间的相互位置关系。再比如说我们双目相机的标定,就包括左相机、右相机的传感器误差标定,还包括它们之间相互位置关系的这么一个标定。概括一下,常说的标定包括两部分内容:传感器误差的校正、传感器相互之间的位置关系。
640?wx_fmt=png
而单目相机的标定主要指前者,传感器误差的校正,常用的方法是张正友标定法
640?wx_fmt=png
640?wx_fmt=png
02 理想单目相机成像模型640?wx_fmt=png

640?wx_fmt=png
实际上,小孔成像的模型其实可以看作是针孔相机模型的基础:
640?wx_fmt=png
图2 小孔成像模型进一步地,针孔相机模型可以简化为下面这个模型:
640?wx_fmt=png
图3 针孔相机模型(未翻转)图中,P是物点, 是前者在CCD上成像的像点,而是相机的光心,则为成像平面到光心的距离,我们称之为焦距。实际上,焦距的定义会更复杂,是所有平行光透过透镜汇聚一点,那一点到透镜光心的距离,它就涉及到摄影里非常专业的概念最小弥散圆了,我们之后会讲一期相机光圈、焦距、景深、视场大小、最佳成像距离的专栏。这里先把模型简化一下吧,下面我们来讲整个成像过程,在相机成像模型中,主要有四大坐标系:世界坐标系相机坐标系图像坐标系像素坐标系。
640?wx_fmt=png
图4 四大坐标系世界坐标系(3D)世界坐标系就是以外界某个参考点建立的坐标系,单位为mm,或者m。相机坐标系(3D):以光心建立相机坐标系,其中轴指向相机的正前方。图像坐标系(2D):光心在成像平面的投影,也就是点建立另一坐标系,称为图像坐标系,单位为mm像素坐标系(2D):像素坐标系是我们最终用户所看到的,也就是坐标系的原点在图像左上角,单位为像素。那么这中间,我们怎么建立实际物理点(世界坐标系)到图像上点(像素坐标系)的一一映射呢?需要三步转换,也就是:世界-> 相机 -> 图像 -> 像素这中间,这些坐标系有什么差别,它们是怎么转换的?请看下面的文章。

2.1世界坐标系 -> 相机坐标系

我们知道,世界坐标系就是以外界某个参考点建立的坐标系,而相机坐标系则是以相机的光心作为坐标原点,光轴的正方向作为Z轴建立的坐标系,两者属于刚体变换,只需要进行旋转和平移,如下所示:
640?wx_fmt=png
图5 世界坐标系到相机坐标系的转换
640?wx_fmt=png
为了统一旋转和平移,我们将其写为齐次形式,至于为什么要用齐次,我们之后的栏目里也会说,总而言之是这样的。
640?wx_fmt=png

2.2 相机坐标系 -> 图像坐标系

在完成了世界坐标系 -> 相机坐标系的转换后,我们再从相机坐标系 -> 图像坐标系。为了方便描述,我们将针孔相机模型对称翻转过来,如下图所示,从数学的角度,它们是等价的:想不明白没关系,这里就算是不等价的,我们就假设相机的电子设备已经帮我们做好了这样一个翻转
640?wx_fmt=png
图6 针孔相机模型(翻转)

先回顾一下前面所说的,如我们之前所说:P是物点、P’是像点,现在我们将它翻转过来了,记作小写的p。其中:

640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png跟之前的公式统一一下,写为齐次形式:
640?wx_fmt=png
  2.3 图像坐标系 -> 像素坐标系图像坐标系中,坐标的原点在图像中间,而我们平时处理图像时用的坐标系,称为像素坐标系,坐标系的原点在图像的左上角,此外它们的度量单位也不同,前者的单位是mm,而后者的单位是像素。如下图所示,两个坐标系之间的差别:
640?wx_fmt=png
640?wx_fmt=png
图7 图像坐标系和像素坐标系的差别
640?wx_fmt=png
CCD并不是一个正方形,dx、dy的大小是有所差别的

640?wx_fmt=png

将其进行移项,并写为齐次的形式,有:

640?wx_fmt=png
2.4 汇总总结一下之前所说的四大坐标系的关系:
640?wx_fmt=png
图8 四大坐标系间关系它们的公式如下:1.世界坐标系->相机坐标系
640?wx_fmt=png
2.相机坐标系->图像坐标系
640?wx_fmt=png
3.图像坐标系->像素坐标系
640?wx_fmt=png
那么将这些式子联立,最终得(你可以尝试自己去推导一下,就是几个式子代换一下):
640?wx_fmt=png
进一步化简:
640?wx_fmt=png

这个公式就是整个单目相机在理想情况下的成像公式,可以建立世界坐标系到像素坐标系的一一映射。

再补充一个知识点,归一化平面:

归一化平面,其实际是图像坐标系的等比缩放,也就是当f=1的情况,主要是便于公式推导,它与图像坐标系是等比缩放关系,只需要乘以f即可完成相互转换。
640?wx_fmt=png
图9 图像坐标系与归一化平面关系03 相机畸变640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=jpeg
640?wx_fmt=png
以上是理想情况下世界坐标系到像素坐标系的转换。而由于相机制造工艺的原因,其成像过程中难免存在着畸变,在后续构建精确的三维重建算法前,我们要对相机的畸变进行矫正,以提高算法重建的精度,这一步骤才称为相机标定。
640?wx_fmt=png
640?wx_fmt=png

3.1径向畸变

径向畸变原因:在相机制造过程中,很难保证镜头的厚度完全均匀,由于制造工艺的原因,通常为这种情况为中间厚、边缘薄,因而光线在远离透镜中心的地方,会发生更大程度的扭曲,这种现象在鱼眼相机(桶形畸变)中尤为明显。径向畸变主要有两种类型:枕型畸变桶型畸变,示意图如下:
640?wx_fmt=png
图10 相机径向畸变
640?wx_fmt=png
640?wx_fmt=png

需要注意的是,这里校正,并不是用的系数越多,整个矫正结果越精确,我们应该考虑相机的实际情况,选择合适的参数数量。

3.2切向畸变

切向畸变原因:切向畸变产生的原因在于相机在制造过程中,成像平面与透镜平面不平行,产生了透视变换。

640?wx_fmt=png
图11 切向畸变这种畸变可以由以下公式描述,它也与距离图像中心的距离半径有关:

640?wx_fmt=png

640?wx_fmt=png

3.3合并考虑

将径向畸变和切向畸变合并,只需要将两个畸变矫正直接加起来即可,公式如下:
640?wx_fmt=png
640?wx_fmt=png
合并考虑畸变原因:其实也很简单,两种畸变是同时发生在成像过程中的,发生的原因也是相互独立的,而且也都是关于距离的表达式,你似乎也找不到更好的方式来综合考虑这两种误差,实践证明,这种合并考虑畸变的情况效果还不错。04 成像过程总结640?wx_fmt=png我已经把所有需要记住的知识点汇聚在一张图片上了,请大家对照着前面的文章去理解:
640?wx_fmt=png
640?wx_fmt=png
640?wx_fmt=png
05 思考问题640?wx_fmt=png

当看完这次推文之后,请大家在脑海里梳理以下几个概念:

  1. 世界坐标系、相机坐标系、图像坐标系、像素坐标系、归一化坐标系,它们之间的差别是什么,怎么进行相互转换?
  2. 径向畸变、切向畸变、它们的主要因素、以及如何去校正?
  3. 最好的话,你自己去画这个图,去推导一遍公式。虽然你后面公式会忘,但相信我,3D视觉领域好多公式,我不需要你记住它,但你要有个直觉印象,去推导一遍有助于你真正理解这个公式。
当明白了这些以后,下节课我们讲,怎么通过张正友标定法去获得要标定的参数,标定得来的参数怎么用,用MATALAB跟OpenCV分别去实践,不过在此之前,你要自己思考以下这些问题:
  1. 相机标定,我们究竟要标定那些参数?
  2. 相机畸变发生在四大坐标系转换的哪一过程?
  3. 假设我们拿到了这些参数怎么用?
  4. 对于每个物点,在像素坐标系下都有唯一像点与之对应,那么反过来是否成立?
  5. 怎么去评判标定的好不好?
大家还想要我们讲什么呢?请踊跃留言!高能预警,下节课我们将以视频的形式来讲解。不过,如果你没有好好看这个相机成像过程的文章,下节课我讲的再有趣也是白扯~这里是3D视觉工坊嘉宾,Atlas博士计算机视觉大讲堂,致力于把计算机视觉知识讲得不那么无趣!准确说,Atlas今年博一,应该讲博士生~当然啊,之后包括多个传感器的时间戳同步、怎么去做融合,这些在我们后续的教程中都会讲,请关注我们的公众号《3D视觉工坊》。我相信,未来视觉领域,一定是3D视觉的世界,如果你可以从头到尾完整地跟完我们整个课程,并且掌握的话,在硕士期间,再尽量去找一些实习,如果你打算从事3D视觉领域,我相信一定会收到一份不错的offer的。本文仅做学术分享,如有侵权,请联系删文。下载1在「3D视觉工坊」公众号后台回复:3D视觉即可下载 3D视觉相关资料干货,涉及相机标定、三维重建、立体视觉、SLAM、深度学习、点云后处理、多视图几何等方向。下载2在「3D视觉工坊」公众号后台回复:3D视觉github资源汇总即可下载包括结构光、标定源码、缺陷检测源码、深度估计与深度补全源码、点云处理相关源码、立体匹配源码、单目、双目3D检测、基于点云的3D检测、6D姿态估计汇总等。下载3在「3D视觉工坊」公众号后台回复:相机标定即可下载独家相机标定学习课件与视频网址;后台回复:立体匹配即可下载独家立体匹配学习课件与视频网址。

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

640?wx_fmt=jpeg▲长按加微信群或投稿

640?wx_fmt=jpeg

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的知识点汇总、入门进阶学习路线、最新paper分享、疑问解答四个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近2000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款640?wx_fmt=jpeg 圈里有高质量教程资料、可答疑解惑、助你高效解决问题觉得有用,麻烦给个赞和在看~640?wx_fmt=gif


Recommend

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK