三维重建代码实现(一)

写在开头

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

相机模型

针孔相机模型

针孔相机模型

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

  • 是相机中心,代表相机镜头。
  • 是相机的主轴,相机坐标系就是由XYZO构成。
  • f是相机模型的焦距。
  • 是三维点,是三维点在图像平面上的投影。

坐标系

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

  • 世界坐标系:,代表物体在三维世界的真实坐标。
  • 相机坐标系:,以相机中心为坐标系原点,Z轴为相机的光轴。
  • 图像坐标系:,在图像平面上,是二维坐标系。
  • 像素坐标系:,也是二维坐标系,只不过原点在左上角,单位是像素。

坐标系之间的转换

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

设某点在世界坐标系中的坐标为,在相机坐标系中的矩阵为。
则两个坐标系之间的关系为:

转化为其次形式:

和统称为外部参数。

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

以O点为原点建立相机坐标系,点为相机坐标系空间中的任意一点,假设该点被光线投影到平面上的点上。
由小孔模型中的相似三角形关系,我们可以得到:

转换为矩阵形式:
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]

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

先设每个像素的物理尺寸为 。
那么对于点在像素坐标系中的坐标:

改写为矩阵形式:
\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]

其中,。

  • 上式中的参数只和相机有关,与相机所拍摄的照片无关,所以称之为相机的内部参数,下一节我们就是要求解这个参数,成为相机标定。
  • 上式中的称为相机的外部参数,与相机拍摄的图像有关,它反映的是世界坐标系和相机坐标系之间的关系。

透镜畸变

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

径向畸变

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


上式中:是畸变点在图像中的原始位置,为该点到成像面中心的距离,为校正后的新位置。

切向畸变

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


上式中:是畸变点在图像中的原始位置,为该点到成像面中心的距离,为校正后的新位置。

透镜畸变校正

我们进行透镜畸变校正,就是要确定这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十四讲:从理论到实践》

你可能感兴趣的:(三维重建代码实现(一))