![0d5ad01fbfaae40be2daa873b5da56c6.png](https://i-blog.csdnimg.cn/blog_migrate/c61487da384433f3951bade04cd1a2f9.jpeg)
前言
最近在做相机标定方面的工作,虽然以前多次进行相机标定,但是多数时候是调用opencv的函数,过程相对简单。虽然对标定过程有一定的了解,但是掌握的不是很扎实,所以趁这次机会,对相机标定过程做了一下深入的了解,并且用c++重新实现了下整个标定过程(opencv 中有源码,但是有点乱我没太看懂,有可能我比较渣渣),所以这是篇学习笔记。其中有些自己的理解,所以难免有错误的地方,还望指正,抱拳。
小学时候大家都做过小孔成像实验,当孔足够小的时候,在小孔的另一端我们能看到物体的倒立成像,但是当小孔变大的时候图像的不同部分发出的光线会在孔另一端的屏幕上重叠成像就不清晰了。现代相机正是依据小孔成像原理制作的,由于亮度等其他原因,使用镜头代替了小孔。同时镜头又给成像带来了其他问题,比如说畸变。
标定的目的
相机的作用是把看到的3D世界转换成2D图像,相当于我的输入是三维数据经过一个函数把他变成二维数据。我们想找到这个理想的函数,那么从数学角度先对这个问题进行建模,也就是相机的成像模型+畸变模型,而标定的目的就是通过观察到的数据,去无线逼近这个函数,也就是逼近这个理想模型的参数。
相机模型(透视投影模型,成像过程)
在看相机模型前先明确几个坐标系
世界坐标系: 单位m,三维世界的坐标系,用户在描述真实世界位置而引入的坐标系,后面我们把棋盘板坐标系看作世界坐标系。
相机坐标系: 单位m,通常原点在光心,z轴与光轴平行,为了描述物体和相机的相对位置而引入。
图像坐标系: 单位m,原点位于sensor中心,比如ccd相机的sensor中心,xy轴分别平行于sensor的两个边。
像素坐标系: 单位像素,这个是我们最常见的用于描述图片的,比如从相机读取出来的图片,原点在图片左上角。
![c5cde51d6f62d01a54e9ebf0be0fa429.png](https://i-blog.csdnimg.cn/blog_migrate/73c2d2c9de073c27ab3f433d3940815a.png)
图1 source:mathworks
上图是各坐标系间的关系,
世界坐标系 -> 相机坐标系
世界坐标系到相机坐标系是一个刚体变换过程,刚体变换可以用一个旋转矩阵(也可以为旋转向量、欧拉角、四元数,程序中对外参进行优化时就是利用旋转向量这种紧凑的表示方法进行优化,后文会提到)和平移向量来表示。
<