三维重建代码实现(一)

2020-03-24  本文已影响0人  风之旅人c

写在开头

最近在学习三维重建的相关知识,打算将三维重建SFM的整个过程用代码的形式梳理一下,本章节主要实现相机标定的基础知识。
这里我们假定你有一定的三维重建相关的基本知识,作者在这里推荐高翔博士的《视觉SLAM十四讲:从理论到实践》,在B站上有高翔博士的讲解视频。

相机模型

针孔相机模型

针孔相机模型

如图所示,这是一个针孔相机模型。图中的字母解释如下:

坐标系

三维重建中涉及到四个坐标系:分别是世界坐标系、相机坐标系、图像坐标系、像素坐标系。

坐标系之间的转换

世界坐标系转换为相机坐标系

设某点在世界坐标系中的坐标为(X_w,Y_w,Z_w),在相机坐标系中的矩阵为(X_c,Y_c,Z_c)
则两个坐标系之间的关系为:
\left[ \begin{matrix} X_C\\Y_c\\Z_c \end{matrix} \right] = R\left[ \begin{matrix} X_w\\Y_w\\Z_w \end{matrix} \right] t
转化为其次形式:
\left[ \begin{matrix} X_C\\Y_c\\Z_c\\1 \end{matrix} \right] = \left[ \begin{matrix} R & t \\ 0 & 1 \end{matrix} \right] \left[ \begin{matrix} X_w\\Y_w\\Z_w\\1 \end{matrix} \right]
Rt统称为外部参数。

相机坐标系转换为图像坐标系

以O点为原点建立相机坐标系,点Q(x_c,y_c,z_c)为相机坐标系空间中的任意一点,假设该点被光线投影到平面上的q(x_pic,y_pic)点上。
由小孔模型中的相似三角形关系,我们可以得到:
\frac {f} {z_c} = \frac {x_{pic}} {x_c} = \frac {y_{pic}} {y_c}
转换为矩阵形式:
z_c \left[ \begin{matrix} x_{pic}\\y_{pic}\\1 \end{matrix} \right] = \left[ \begin{matrix} f & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0 & 1 & 0 \end{matrix} \right] · \left[ \begin{matrix} x_c\\y_c\\z_c\\1 \end{matrix} \right]

图像坐标系转换为像素坐标系

先设每个像素的物理尺寸为 dx×dy(mm^2)
那么对于点在像素坐标系中的坐标(u,v)
\left\{\begin{array}{l} u=u_{0}+\frac{x_{p i c}}{d x} \\ v=v_{0}+\frac{y_{p i c}}{d y} \end{array}\right.

改写为矩阵形式:
\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{lll} \frac{1}{d x} & 0 & u_{0} \\ 0 & \frac{1}{d_{y}} & v_{0} \\ 0 & 0 & 1 \end{array}\right]\left[ \begin{array}{c} x_{p i c} \\ y_{p i c} \\ 1 \end{array}\right]

世界坐标系转换为像素坐标系

将以上几个变换综合起来,我们就可以写作:
z_{c}\left[\begin{array}{c} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{ccc} \frac{1}{d_{x}} & 0 & u_{0} \\ 0 & \frac{1}{d_{y}} & v_{0} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{cccc} f & 0 & 0 & 0 \\ 0 & f & 0 & 0 \\ 0 & 0 & 1 & 0 \end{array}\right] \cdot\left[\begin{array}{cc} R & t \\ 0 & 1 \end{array}\right]\left[\begin{array}{c} x_{w} \\ y_{w} \\ z_{w} \\ 1 \end{array}\right]

继续计算一下可得:

z_{c}\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[ \begin{array}{llll} f_{x} & 0 & u_{0} & 0 \\ 0 & f_{y} & v_{0} & 0 \\ 0 & 0 & 1 & 0 \end{array}\right] \cdot\left[ \begin{array}{ll} R & t \\ 0 & 1 \end{array}\right]\left[\begin{array}{l} x_{w} \\ y_{w} \\ z_{w} \\ 1 \end{array}\right]

其中,f_{x}=\frac{f}{d_{x}}, f_{y}=\frac{f}{d_{y}}

透镜畸变

到前面为止的内容都是有关针孔相机模型的,但是针孔可以透过的光线太少,成像慢且不清晰,所以往往都会加上凸透镜以汇聚更多的光线。但是加上凸透镜之后,不可避免地,就会产生透镜畸变。透镜畸变有两种:径向畸变、切向畸变。

径向畸变

对于某些透镜,光线在远离透镜中心的地方比靠近中心的地方弯曲更厉害,产生“筒形”或“鱼眼”现象。
一般来讲,成像中兴点的径向畸变为0,越向边缘移动,畸变越严重。通常,径向畸变通过下面的公式来校正,常用偶次幂的泰勒公式描述径向畸变:

\left\{\begin{array}{l} x_{ \text {corrected}}=x\left(1+k_{1} r^{2}+k_{2} r^{4}+k 3 r^{6}\right) \\ y_{ \text {corrected}}=y\left(1+k_{1} r^{2}+k_{2} r^{4}+k 3 r^{6}\right) \end{array}\right.
上式中:(x,y)是畸变点在图像中的原始位置,r为该点到成像面中心的距离,(x_{corrected},y_{corrected})为校正后的新位置。

切向畸变

切向畸变是由于摄像机制造上的缺陷使得透镜本身与图像平面不平行而产生的,可定量描述为:

\left\{ \begin{array}{l} x_{\text {corrected}}=x+\left[2 p_{1} y+p_{2}\left(r^{2}+2 x^{2}\right)\right] \\ y_{\text {corrected}}=y+\left[p_{1}\left(r^{2}+2 y^{2}\right)+2 p_{2} x\right] \end{array}\right.
上式中:(x,y)是畸变点在图像中的原始位置,r为该点到成像面中心的距离,(x_{corrected},y_{corrected})为校正后的新位置。

透镜畸变校正

我们进行透镜畸变校正,就是要确定k_1、k_2、k_3、p_1、p_2这5个参数。

参考文件

博客

http://blog.csdn.net/aptx704610875/article/details/48914043
http://blog.csdn.net/xuelabizp/article/details/50314633
https://www.cnblogs.com/Jessica-jie/p/6596450.html
https://blog.csdn.net/hongbin_xu/article/details/78934897

书籍

《视觉SLAM十四讲:从理论到实践》

上一篇下一篇

猜你喜欢

热点阅读