关于双目视觉(三维重建),相机标定是最基础的部分,这里简单分享下自己的理解。
1.相机模型
小孔成像原理图
首先,在光心和成像平面之间假想一个球面,物体在球面上成像,再从球面上投影到成像平面上。透镜的光学性质都是中心对称的(即球面假设很合理), 穿过光心的光线是直线传播的,不同模型的角度差异的来源在于球面向平面投影的不同方法。从球面向平面的投影,最常见的用处是绘制世界地图
(如墨卡托投影,圆锥投影等),球面向平面的投影有很多种方法,相机在制造时,镜头由很多片透镜组成,这些透镜的左右就是逼近某一种投影方法,
使得透过镜头的光线直接透射在传感器平面上的情况等效于先投影在成像球面,再向成像平面投影,物体与光轴的夹角θ变化时,像点与图像中心的
距离R也随之变化,按照变化关系的不同。
不同投影模型示意图
投影模型计算公式
2.镜头介绍
由于无法制造出满足理想情况的镜头,所以设计镜头时采用一个多项式逼近理想情况,其中K称为径向畸变系数,径向畸变是最主要的畸变来源。
此外,相机还有其他畸变,例如切向畸变,薄棱镜畸变,传感器倾斜畸变
小tips:
3.坐标系转换
图像处理、立体视觉等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图:
构建世界坐标系只是为了更好的描述相机的位置在哪里,在双目视觉中一般将世界坐标系原点定在左相机或者右相机或者二者X轴方向的中点,
一般我们用的是左相机为原点。接下来的重点,就是关于这几个坐标系的转换。也就是说,一个现实中的物体是如何在图像中成像的。
于是,从世界坐标系到相机坐标系,涉及到旋转和平移(其实所有的运动也可以用旋转矩阵和平移向量来描述)。
绕着不同的坐标轴旋转不同的角度,得到相应的旋转矩阵,如下图所示:
那么从世界坐标系到相机坐标系的转换关系如下所示:
3.2相机坐标系与图像坐标系
从相机坐标系到图像坐标系,属于透视投影关系,从3D转换到2D。
此时投影点p的单位还是mm,并不是pixel,需要进一步转换到像素坐标系。
3.3图像坐标系与像素坐标系
像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,
通常情况下是成像平面的中点或者叫principal point(主点)。图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,
我们平常描述一个像素点都是几行几列。二者之间的转换如下:其中dx和dy表示每一列和每一行分别代表多少mm,即1pixel=dx mm。
那么通过上面四个坐标系的转换就可以得到一个点从世界坐标系如何转换到像素坐标系的。
其中相机的内参和外参可以通过张正友标定获取。通过最终的转换关系来看,一个三维中的坐标点可以在图像中找到一个对应的像素点,
但反过来,通过图像中的一个点找到它在三维中对应的点就很成了一个问题,因为我们并不知道等式左边的Zc的值。
4.标定原理
(1)标定方法分类:
1.传统相机标定方法:
*在一定的相机模型下,基于特定的实验条件,如形状,储存已知参照物,进行图像处理,数学变换,技术方法,求取内外参数。
*经常调整相机的需求,设置已知参照物不现实。
*包括利用最优化算法的标定方法、利用相机变换矩阵的标定方法、进一步考虑畸变补偿的两步法、张正友标定方法。
2.自标定法:
*不依赖参照物。
*利用相机本身参数之间的约束关系。
*利用周围图像与图像之间的对应关系。
*与场景和相机运动无关。
*基于Krupa方程、分层逐步标定法、基于二次曲面自标定。
(2)张正友标定法
MATLAB使用的是张正友标定法,假设标定棋盘格位于世界坐标系中的Zw = 0的平面,则
简化为:
这里引入一个概念:单应性(Homography)变换,来描述物体在世界坐标系和像素坐标系之间的位置映射关系,对应的变换矩阵称为单应性矩阵。
单应性矩阵可以用于图像校正,图像拼接,相机位姿估计,视觉SLAM等。
so,如何估计单应性矩阵?
(1)假设两张图中的对应点对齐次坐标为(x’,y’,1)和(x, y, 1),单应性矩阵定义为:
H矩阵有9个参数,对应有9个自由度。这里使用的是齐次坐标系,也就是说可以进行任意尺度的缩放,
比如我们把hij乘以任意一个非零常数k,并不改变等式结果。
尺度变化因子α,从单应性矩阵中提出放到x中,把常数项h33设置为1,其实是8个自由度。
需要9个参数才可以确定这个矩阵H,加一个约束条件调成α使得9个参数的模为1。化简:
由于单应性矩阵H包含了||H|| = 1约束,因此根据上图线性方程图,8自由度的H至少需要4对对应的点才能计算出单应性矩阵。
由于真是场景中,我们计算的点对中都会包含噪声,所以需要4对以上的点对。另外上述方程组采用直接线性解,
通常很难得到最优解,所以实际使用中一般会用其他优化方法,如奇异值分解、Levenberg-Marquardt(算法)。
单应性矩阵H是内参矩阵和外参矩阵的混合体。
先把内参求出来(因为更容易),得到内参后,外参也就随之解出来了。
先不考虑镜头畸变
求解思路是利用旋转向量的约束关系。先将单应性矩阵H化为3个列向量,H=[h1,h2,h3]。
旋转向量在构造中是相互正交的(相互垂直,模相等)
r1和r2相互正交,由此我们可以得出每个单应性矩阵提供两个约束条件:
(1)旋转向量点积为0,即:
(2)旋转向量长度相等(旋转不改变尺度),即:
如何利用这两个约束条件求解内参和外参?
B为对称矩阵,真正有用的元素为6个。
将
B代入前面两个约束条件后可化为:
定义3×3的单应性矩阵H=[h1 h2 h3]的第i列列向量:
代入到两个约束条件中:
n张图片,每张图片我们都可以得到一组(2)个上述的等式,其中v12,v11,v22可以通过前面已经计算好的单应性矩阵得到,
B中的6个元素是待求的未知数,因此图片数>=3,才可以解出b(带有一个比例因子)。
B中包含一个尺度因子λ,即:,根据已知矩阵B可求得内参:
在实际标定过程中,会有各种噪声的影响,一般使用最大似然估计进行优化。
n张标定图片,每张
m个棋盘格角点,三维空间点
x在图片上对应的二维坐标
xij(实际二维坐标),三维空间点
x经过
M,R,T得到二维像素坐标x’,假设噪声是独立分布的。
距离值越小越好。
考虑镜头畸变影响:
上述非线性优化问题 通常用Levenberg-Marquqrdt(LM)算法进行迭代求解,一般将K1,K2的初值设为0。
5.标定操作
(1)标定步骤(以matlab内置的标定为例):
1.打印一张棋盘格,把它贴在一个平面上,作为标定物。
2.通过调整标定物或摄像机的方向,为标定物拍摄一些不同方向的照片。
3.从照片中提取棋盘格角点。
4.估算理想无畸变的情况下,五个内参和六个外参。
5.应用最小二乘法估算实际存在径向畸变下的畸变系数。
6.极大似然法,优化估计,提升估计精度。
(2)具体操作:
打开MATLAB在APP中选择Stereo Camera Calibrator(双目相机标定)。
进入到如下界面,选择Add Images添加图片。
选择路径,上面的路径选择放左图的文件夹,下面的路径选择放右图的文件。25mm是我所用的棋盘格的一小格的边长。
点击确定,MATLAB开始进行检测角点。
如下图,绿色的圆圈代表,MATLAB检测的角点,黄色的是检测起点,在这里我们可以看到左右图的起点不一致,我们可以认为的把所有不一致的图组剔除掉,
使留下来的图都有统一的起点(一般是左下角的点),不然会出现标定误差很大的情况,但最少应保留12图左右。
另外,在上方参数栏的选择那里,Radial Distortion(径向畸变)可选择2参数,3参数两种,径向畸变通常只考虑两个参数k1,k2即可(增加更多的参数会使模型变的复杂且不稳定)。
勾选上Skew是倾斜度,Tangential Distortion(切向畸变),点击Calibrate,开始标定。
标定完后,出现下图,红色的十字点是重投影得到的角点,左下角的柱状图,反应了重投影误差,重投影误差是指投影的点(理论值)与图像上的测量点的误差。
通常,我们把标定板上的物理点看作理论值,它经过投影变换后会得到理论的像素点x,而测量的点经过畸变校正后的像素点为x',它的欧氏距离||x-x'||2(2范数)
即为重投影误差。一般这个误差越小代表越精确,同时我们可以在这里点击误差很大的柱状图,会对应到左侧的那组图片,点击右键会出现移除并重新进行标定。
右下角的图可以反应拍摄的图片距离相机的距离与位姿。
在标定结果这里,左上角的Show Rectified 可以显示极线,Export Camera Parameters 输出相机的参数。
Rotation of Camera2 是相机2(右相机)相对于相机1(左相机)的旋转矩阵R(3*3),Translation of Camera2 是相机2(右相机)相对于相机1(左相机)的平移向量T(3*1),
Camera Parameters 1 是相机1的参数,Camera Parameters 2是相机2的参数,
我们主要关注Intrinsic Matrix (相机内参) Radial Distortion (径向畸变) Tangential Distortion(切向畸变),其中相机内参:
结完(散花),如有错误,麻烦各位大佬指正🤣
#计算机视觉岗#