本笔记从几何角度来理解相机的成像过程,我们生活在三维世界中,相机所捕捉到的画面是2D的,3D空间中的点是如何投影到2D平面的过程是本笔记关注的。
预设场景
本笔记讨论的东西基于以下场景:
在一个房间内放了一台相机,在相机视野范围内有一个点P(3D空间坐标)。我们来看这个3D空间坐标下的P点是如何变成相机成像平面上的像素2D坐标的。
图1:世界坐标系、相机坐标系。两者通过旋转变换和平移变换联系起来。
世界坐标系(World Coordinate System)
我们不考虑房间具体在外部世界中的位置,而是把房间当成是一个世界。在这个房间里,为了能够表示出物体的位置信息,我们首先要为这个房间定义一个坐标系,这个坐标系包含两个最重要的东西:
1. 原点:可以将原点放在房间正中心,也可以放在某个角落作为原点(本笔记使用这种方式),原点坐标(0,0,0)
2. XYZ轴:本例中X和Y轴表示沿着房间地面的两个维度,Z轴是沿着墙的垂直方向的维度。
定义好了坐标系后,房间中的任意一个点的位置,用3D坐标都能够被表示出来,坐标形式为(x,y,z),三个值分别代表了这个点距离X、Y和Z轴的距离。在本例中,这个坐标系就是世界坐标系。
图中加粗的字体(Xw,Yw,Zw)表示世界坐标系的X,Y,Z轴,对于某个点的坐标用普通字体表示比如案例的P点坐标我们记为(Xw,Yw,Zw)。
相机坐标系(Camera Coordinate System)
接下来我们在房间里摆放一台相机。如果相机被放置到了房间的原点位置,并且让相机的X.Y.Z轴对齐到Xw,Yw,Zw轴,那么这两个坐标系就完全一样了。
当然,相机的位置是可以随意摆放的,这种情况下,我们需要找到世界坐标和相机坐标之间的关系。
假设相机在世界坐标系中的位置为(Tx,Ty,Tz),这个坐标其实可以看成在世界坐标系下,相机从原点位置平移到了(Tx,Ty,Tz)。
相机本身也可以看向任意方向,也就是说在世界坐标系下,相机进行了旋转。3D旋转本身可以用三个参数表达,yaw,pitch,roll,这三个参数表示了沿着三个轴的旋转,如下图所示:
通常为了数学计算的方便,旋转是通过一个3x3的矩阵来表示的,虽然这个矩阵有9个元素,但只有三个元素用于旋转参数。
关于旋转矩阵的细节和推导,可以参考这里:
旋转矩阵(Rotation Matrix)的推导及其应用 - meteoric_cry - 博客园向量的平移,比较简单。 Xnew = Xold + Tx Ynew = Yold + Ty 缩放也较为简单 矩阵如何进行计算呢?之前的文章中有简介一种方法,把行旋转一下,然后与右侧对应相乘。在谷歌图片https://www.cnblogs.com/meteoric_cry/p/7987548.html 综上,世界坐标系和相机坐标系通过一个旋转矩阵R和一个3个元素的平移向量t产生联系。
这也意味着,对于世界坐标系下的点P(Xw,Yw,Zw),在相机坐标系中会有不同的位置坐标值(Xc,Yc,Zc),见图1中使用红色表示的相机坐标系。
这两个坐标系的值的关系通过下面的等式表示:
从上面这个等式可以看到,如果要将世界坐标转为相机坐标,需要做一次矩阵相乘和一次矩阵相加。这种方式虽然可行,但如果能用一个矩阵相乘完成旋转和平移操作的话岂不是更加方便吗。但从上面的等式可以看出,对于一个只有三个维度的向量而言,是无法做到旋转和平移写成一个3X3矩阵的。为了能够统一旋转和平移到一个矩阵里,需要对三维向量增加一个维度w,此时这个四维的点坐标就叫做齐次坐标,增加了一个维度后就能用一个4x4矩阵来统一旋转和平移操作了。
关于齐次坐标的更详细的参考资料,可以看这里:
齐次坐标 - 简书H.C.(Homogeneous Coordinates) are a system of coordiantes used in projective geometry--...https://www.jianshu.com/p/eb85abbdc0ad 使用齐次坐标后,旋转和平移操作就可以放到一个统一的4X4矩阵里了,这个矩阵P称为相机的外参矩阵(Extrinisic Matrix)。
空间某个点p,其在世界坐标系下表示为[xw,yw,zw,1],在相机坐标系下表示为[xc,yc,zc,1]:
图像坐标系(Image Coordinate System)
图2:点P透视投影到图像平面示意
前面我们使用外参矩阵将世界坐标系的P点坐标转换到了相机坐标系里的值,拿到这个值之后,就可以在相机坐标系下做投影得到该点在图像平面上的位置了。
关于图2,需要做一点说明。图2是以一个简单的小孔成像的相机模型为基础来说明的,真实情况下,图像平面是在光心Oc后面,所产生的图像是一个颠倒的画面。为了讨论方便,这里是将图像平面放到了Oc前面。图像平面离光心Oc的距离为f(焦距)。
下图来自于CSDN的某个博主的图,非常直观地说明了图像坐标系上的点是如何得到的。原文链接如下:
世界坐标系,相机坐标系和图像坐标系的转换(Python)_AI吃大瓜的博客-CSDN博客世界坐标系,相机坐标系和图像坐标系的转换(Python)相机内参外参说明:https://panjinquan.blog.csdn.net/article/details/102502213计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换:https://blog.csdn.net/chentravelling/article/details/535580...https://blog.csdn.net/guyuealian/article/details/104184551
具体推导很简单,利用两个相似三角形的边长比例关系就可以得到图像平面的x,y。用齐次坐标形式写出的矩阵相乘等式为:
像素坐标系(Pixel Coordinate System)
像素坐标系和图像坐标系都以图像平面为基础,但是两者的原点位置和轴的单位是不同的。图像坐标系的原点是是相机光轴和图像平面的交点,通常为图像平面的中心点(principal point),单位是毫米mm。而像素坐标系的原点在图像平面左上角,单位是像素pixel。这两者的转换如上图所示。转换关系相对简单,需要注意图中的dx,dy分别表示一个像素(看成矩形)的横向长度和纵向长度(简单理解就是宽和高),dx,dy单位是mm。
总结
综合前面所有步骤,一个世界坐标系中的点P先从世界坐标系转换到相机坐标系,然后再转到图像坐标系,最后转换到像素坐标系。这些变换过程写成完整的矩阵相乘的式子如下:
其中为外参矩阵,为内参矩阵。相机标定就是为了得到这两个矩阵的值。