失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 相机成像模型 相机内参 外参 以及相机标定

相机成像模型 相机内参 外参 以及相机标定

时间:2019-12-09 15:31:34

相关推荐

相机成像模型 相机内参 外参 以及相机标定

看了一圈各个平台讲解相机模型、相机标定的文章,很多只是简单罗列几个公式,其中的细节都没说明,本着学习的出发点写下这篇文章,希望能给初学者解惑。本文主要讲解相机模型,一步步推导从世界坐标系到图像坐标系的变换,并详细解释其中的每个参数的意义。

相机投影成像可视化展示:

http://ksimek.github.io/perspective_camera_toy.html

相机成像建模

相机拍摄照片成像过程就是三维世界中物体发出的光线投影到成像平面形成二维的图片的过程。根据中学知识我们就能画出光线通过凸透镜的光路图,这不就是相机成像原理吗?那为什么还要对相机成像进行建模?看下面的光路图就明白,中学时把物体、透镜、成像平面都放在了一个二维坐标系中,物体只有两个自由度(上下移动,左右移动),而现实中的物体所在的空间是三维的,物体具有六个自由度(三个方向旋转,三个方向移动)。因此这种凸透镜成象原理不能表示实际的成像过程。

根据前面所说,一个二维坐标系不能表示整个成像过程,为了表示空间位置关系,我们需要分别对三维空间中物体,通过相机的成像光线,以及最终在传感器得到的像平面建立坐标系。三维空间中物体的坐标系就叫做世界坐标系(world coordinate system),这个坐标系是三维坐标系,可以任意指定;通过相机的成像光线所在的坐标系叫相机坐标系(camera coordinate system),这个坐标系也是三维的,一般选取z轴与光轴重合,原点在透镜中心;传感器平面也就是像平面所在的坐标系就叫图像坐标系(image coordinate system),这个坐标系是二维的。三个坐标系在下图中表示,请注意图像坐标系实际是在相机坐标系后面的,由于成像光路是对称的,因此把这个坐标系画在了世界坐标系和相机坐标系中间,便于理解。

我们设置了三个参考坐标系,那么成象的过程就是世界坐标系到图像坐标系的变换,三维空间中的物体经过相机在二维平面成像过程分两个阶段建模,第一个阶段是世界坐标系到相机坐标系的变换,三维到三维的变换,第二个阶段是相机坐标系到图像坐标系的变换。

世界坐标系到相机坐标系

这一步要把世界坐标系中点的坐标转换到相机坐标系中,物体的点的坐标在两个坐标系中的值是不同的,可以把世界坐标系经过旋转平移,使得与相机坐标系重合,世界坐标系中的点经过对应的旋转和平移就得到了其在相机坐标系中的坐标。在三维空间中,旋转可以用3×33×33×3的旋转矩阵表示,平移可以用3×13×13×1的平移矩阵表示,关于旋转矩阵是怎么根据旋转角度推导的,这里就不展开说了,可以参考以下内容:

/p/102814853

/p/183973440

/p/144032401

[XcYcZc1]=[r11r12r13txr21r22r23tyr31r32r33tz0001][XwYwZw1]\begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix} = \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix}⎣⎢⎢⎡​Xc​Yc​Zc​1​⎦⎥⎥⎤​=⎣⎢⎢⎡​r11​r21​r31​0​r12​r22​r32​0​r13​r23​r33​0​tx​ty​tz​1​⎦⎥⎥⎤​⎣⎢⎢⎡​Xw​Yw​Zw​1​⎦⎥⎥⎤​

也就是

Pc=[Rt01]PwP_c = \begin{bmatrix} R & t \\ 0 & 1 \end{bmatrix} P_wPc​=[R0​t1​]Pw​

在上面的式子中,我们在一个三维向量的末尾添加了数字1,使得左边变成了四维向量,称为齐次坐标。通过添加最后一维,我们用四个实数来描述了一个三维向量,这显然多了一个自由度,但是这样允许我们把变换写成线性的形式,这就叫齐次坐标表示,齐次可以简单理解为行列数相同。引入齐次坐标的目的主要是合并矩阵运算中的乘法和加法,表示为x=P×Xx=P×Xx=P×X的形式,这样,连续的旋转平移缩放变换就可以写成多个齐次变换矩阵相乘的形式,即它提供了用矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法。关于变换矩阵齐次坐标可以参考这个。

旋转矩阵和平移矩阵共同组成了相机外参

相机坐标系到图像坐标系

根据相似三角形关系可以得到点在成像平面坐标与点在相机坐标系坐标的关系:

u=fx⋅XcZcu = {f_x} \cdot \frac{{{X_c}}}{{{Z_c}}}u=fx​⋅Zc​Xc​​ v=fy⋅YcZcv = {f_y} \cdot \frac{{{Y_c}}}{{{Z_c}}}v=fy​⋅Zc​Yc​​考虑传感器中心点的偏移,再写成矩阵的形式:[uv]=[fxXc/Zc+cxfyYc/Zc+cy]\begin{bmatrix} u \\ v \end{bmatrix} = \begin{bmatrix} f_x X_c/Z_c + c_x \\ f_y Y_c/Z_c + c_y \end{bmatrix}[uv​]=[fx​Xc​/Zc​+cx​fy​Yc​/Zc​+cy​​]

这里cxc_xcx​,cyc_ycy​是像CMOS传感器主点相对于光轴的偏移量,单位是像素,产生的原因是相机的传感器中心点不可能完全与成像中心点重合,相机内部是机械结构组装的,肯定是有偏差,达不到理想情况。而fxf_xfx​和fyf_yfy​准确来说并不是焦距,而是主距fff乘一个常数mmm,见下面公式。mmm代表在CMOS上每毫米有多少个像素点,mmm的单位是像素/毫米,所以fxf_xfx​和fyf_yfy​单位也是像素。fxf_xfx​和fyf_yfy​存在差异是因为光电传感器CMOS的感光点的长宽有一些小差别,不是完全的一比一,也就是mxm_xmx​和mym_ymy​不同,理想情况CMOS的每个感光点是个正方形,长宽相等,但是现实制作工艺总会有偏差,但是fxf_xfx​和fyf_yfy​相差很小,一些情况下可以忽略,只计算一个。

fx=fmxf_x=fm_xfx​=fmx​ fy=fmyf_y=fm_yfy​=fmy​

这时肯定有好奇的观众要问主距是是什么,主距就是物镜后节点到相平面的垂直距离,可以理解为中学物理中说的像距,根据中学知识来看主距似乎应该比焦距更大一点,实际中主距和焦距是没有严格区分的(但在测量摄影学中主距和焦距分得很清楚),现实中一个凸透镜并不只有一个焦点,而是有无数个(是不是感觉中学课本上的光学知识是假的),经过凸透镜的平行光线并不是严格汇聚在一点,肯定又有好奇的观众要问相机成像到底是成在哪个平面的,关于相机成像在焦平面还是像平面可以看这篇。

关于主距:/html//0926/7121064000001151.shtm

将上式写成齐次表达:

[uvw]=[fx0cx0fycy001][XYZ]\left [ \begin{matrix} u \\ v \\ w \end{matrix} \right ] = \left [ \begin{matrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{matrix} \right ] \left [ \begin{matrix} X \\ Y \\ Z \end{matrix} \right ]⎣⎡​uvw​⎦⎤​=⎣⎡​fx​00​0fy​0​cx​cy​1​⎦⎤​⎣⎡​XYZ​⎦⎤​

注意这里的www表示损失的深度信息,是世界坐标系的点到成像平面的距离,而不是到相机那一点的距离.

那么最终得到的世界坐标系到图像坐标系变换为:

s[uv1]=[fx0cx00fycy00010][r11r12r13t1r21r22r23t2r31r32r33t30001][XYZ1]s\ \left [ \begin{matrix} u \\ v \\ 1 \end{matrix} \right ] = \left [ \begin{matrix} f_x & 0 & c_x & 0\\ 0 & f_y & c_y & 0\\ 0 & 0 & 1 & 0\end{matrix} \right ] \left [ \begin{matrix} r_{11} & r_{12} & r_{13} & t_1 \\ r_{21} & r_{22} & r_{23} & t_2 \\ r_{31} & r_{32} & r_{33} & t_3 \\ 0 & 0 & 0 &1 \end{matrix} \right ] \left [ \begin{matrix} X \\ Y \\ Z\\ 1 \end{matrix} \right ]s⎣⎡​uv1​⎦⎤​=⎣⎡​fx​00​0fy​0​cx​cy​1​000​⎦⎤​⎣⎢⎢⎡​r11​r21​r31​0​r12​r22​r32​0​r13​r23​r33​0​t1​t2​t3​1​⎦⎥⎥⎤​⎣⎢⎢⎡​XYZ1​⎦⎥⎥⎤​

相机标定就是要计算上面的参数,包括两个fff以及像主点两个偏移。当然,这是在不考虑相机径向畸变和切向畸变情况下的,相机内参应该包括相机矩阵参数和畸变系数,相机标定就是要计算出相机内参。关于相机畸变等有空再写写了,可以参考:

/post/610167078@/%E7%9B%B8%E6%9C%BA%E6%88%90%E5%83%8F%E5%8E%9F%E7%90%86%E5%8F%8A%E7%9B%B8%E5%85%B3%E7%90%86%E8%AE%BA

/learning_tortosie/article/details/79901255

/Sandy_WYM_/article/details/82888725

相机外参的作用

既然相机内参可以用于相机标定,校正图像,那么相机外参有什么用?(未完待续)

真实场景的双目立体匹配(Stereo Matching)获取深度图详解

/riddick/p/8486223.html

利用视差图合成新视点

/riddick/p/7355353.html

立体匹配生成cost volume

匹配代价 Cost Volume:将两幅图的相关关系进行比较,比较两个特征图并将两个特征图的差异作为基础得到 cost volume。

神经网络中从输入左右图到得到cost volume这个过程就可以看作-传统立体匹配中的代价计算

立体视觉(stereo)和光流(flow)中经常出现的cost volume,用来表示匹配代价的一个量,Correlation可被用作该Cost Volume。

/slide/3533254/

单应矩阵、本质矩阵和基本矩阵

/article/62801806893/

/p/138266214

plane sweep和cost volume

/p/363830541

/question/366970399

/slide/3533254/

https://www.uio.no/studier/emner/matnat/its/nedlagte-emner/UNIK4690/v16/forelesninger/

KITTI双目生成视差图和点云

/qq_42585108/article/details/106555403

参考:

/Mr____Cheng/article/details/105270124?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-1&spm=1001.2101.3001.4242

/weixin_43843780/article/details/89294131

/learning_tortosie/article/details/79901255

/master/d9/d0c/group__calib3d.html

如果觉得《相机成像模型 相机内参 外参 以及相机标定》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。