关键词:针孔模型, 畸变模型,内参矩阵,外参矩阵
针孔模型:相似三角形模型
Z/f = X/X’ = Y/Y’
这里我们将成像平面固定在相机焦点处,在外界物体距离相机较远比如十倍焦距以上的,根据理想状态下相机模型:
1/u + 1/v = 1/f
相距将在f很近的位置,因此将胶片放置在f处具有科学道理。
以透镜的光心为原点,以光轴所在直线为X轴,以胶片的网格方向为XY轴方向,我们可以建立相机坐标系;与此同时,以图片的左上角为顶点,网格方向为XY方向,可以和相机形成一个没有旋转,只有平移和缩放的变换矩阵,平移取决于两个原点之间的距离,缩放依赖于相片像素大小和单位m的笔直,一般情况下,无论是世界坐标系还是相机坐标系,我们都设单位向量为模长为1m的向量,这样的话极大方便我们的运算。
推导过程略去
内参矩阵为:
K = [ fx 0 cx; 0 fx cy; 0 0 1 ]
其中 fx = af, fy = bf, a,b分别为两坐标系之间的量度比值,f为焦距,当透镜确定的时候,f一般无法改变了。cx, cy为两个原点之间的平移。所以内参矩阵是在相机造好的时候就确定了,无法更改。
Pxy = K P/Z , P/Z = K-1 Pxy
由于相片上的点只有两个自由度x,y,所以其无法通过内参矩阵确定三维空间中的原物点的XYZ,只能确定在Z = 1的归一化平面上的一个点,但该点与光心O连线上的所有点都有可能,所以单目相机无法确定物体的深度。
所以就有了双目相机,RGB-D相机,用于准确确定物体的三维位置。
畸变:分为径向畸变(桶形畸变 + 枕形畸变)+ 切向畸变
径向畸变是由于透镜的形状不够标准,用高次多项式来矫正
x’ = x(1+k1r^2 + k2r^4 + k3r^6)
y’ = y(1+k1r^2 + k2r^4 + k3r^6)
切向畸变是由于成像平面位置摆放不与透镜焦平面平行,使用两个参数来进行矫正
x’ = x + 2p1xy + p2(r^2 + 2x^2)
y’ = y + 2p2xy + p1(r^2 + 2y^2)
视觉SLAM 中一般使用普通的摄像头,所以这些较为简单的模型已经足够。
双目视觉:
z = fb/d = f(d + PlPr)/d
d 为视差,即同一个点在左右两个相机成像系统下,所成的像的坐标差异。 PlPr为两个相机光心之间的距离,f为焦距,即成像平面与光心间距。所以双目相机要求左右两个相机平行,并且其成像平面相同才可以,否则无法进行相似形运算。当然,视差d的计算比较困难,因为我们难以精确地知道左右两幅图之间点的对应关系,这就还是回到了我们的老问题:求匹配点上了,匹配点的不准确,会导致深度求解的不准,而且这里f和PlPr是固定的,对于单个点,只有一组d,z,难以变成一个优化问题,因为任意两组点之间的视差都是不一样的。
由于视差最小为一个像素,所以当d = 1时,我们得到双目相机可以观测的最大深度,此时相机间的距离越大,我们得到的观测范围就越大。
RGB-D相机模型:通过二维相机获取彩色信息,然后深度相机获取Z,从而依据内外参矩阵,得到XYZ的精确取值,从而可以构造出一系列六通道点云,每个点都带有XYZRGB六个信息。
RGB-D相机主要有两类:
- 红外结构光原理,结构光的形变(日光干扰)
- 脉冲时间差原理,计算距离(投射材质物体)
处理方法: OpenCV
外参矩阵:
相机坐标系与世界坐标系之间的转换矩阵(在第一章节里面有详细讲解),以及在相机运动的过程中,两个相机之间会有一个变换矩阵,通过此,我们就能依据图片将多张图片对应的点云放置到一个三维坐标系下,也能因此实现点云的拼接。如果单纯拼接图片的话,RGB如何融合是个问题,不太有意义,而点云就是表示存在的点,直接叠加就好了,可以形成三维场景。(虽然也可以将不同张照片融合在一起,先计算每一张照片的三维点云,然后将三维点云成像变换到一个相机的像素坐标系去,或者点云也不需要,先将其投影到归一化平面,然后将其投影回二维,也能实现简单的场景融合)
处理方法:Point Cloud Library(PCL)
下一章节:非线性优化