三维重建代码实现(二)

写在开头

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

相机标定

我们首先做一个约定:
二维坐标点:,三维点坐标。
则他们的坐标对应的齐次形式是:,三维点坐标。
两者之间的关系是:

其中

是一个比例参数,是相机外参,是旋转矩阵,是平移。是相机内参,是坐标的主点,和是图像在轴和轴的比例因子,是描述两个坐标轴亲倾斜角的参数(注:如果两个坐标轴相互垂直,则=0,即默认情况下这个都是为0的)。

模型平面与图像之间的单应性关系

在计算机视觉中,平面的单应性被定义为一个平面到另外一个平面的投影映射。因此一个二维平面上的点映射到摄像机成像仪上的映射就是平面单应性的例子。
设的第列旋转矩阵为,那么可以表示为:

带入到原方程中:

假设模型平面在世界坐标系中坐标为0,那么坐标的值都为0:

乘出来都还是0,省略掉这一部分:

则此时的二维点坐标为,三维点坐标为
因此点和它在图像上的映射点之间的关系可以使用单应矩阵来表示:
其中:

很显然,是一个的矩阵。对应着内参,对应着外参。

内参的约束条件

令,都是的矩阵,那么则有:

式中是任意的标量。
因为在旋转矩阵中,任意两列两两正交,则有:

再根据得到方程组:

推出:

代入前面的条件:

得到:
\begin{array}{c} r_{1}^{T} r_{2}=\lambda^{-T} h_{1}^{T} A^{-T} A^{-1} h_{2} \lambda^{-1}=\lambda^{-2} h_{1}^{T} A^{-T} A^{-1} h_{2}=0 \\ \quad\left\{\begin{array}{c} \left\|r_{1}\right\|^{2}=\lambda^{-2} h_{1}^{T} A^{-T} A^{-1} h_{1}=1 \\ \left\|r_{2}\right\|^{2}=\lambda^{-2} h_{2}^{T} A^{-T} A^{-1} h_{2}=1 \\ \Rightarrow \lambda^{-2} h_{1}^{T} A^{-T} A^{-1} h_{1}=\lambda^{-2} h_{2}^{T} A^{-T} A^{-1} h_{2} \end{array}\right. \end{array}
综上所述,对于一个单应矩阵,对于内参有2个基本的约束条件:

对于矩阵来说,它是一个的矩阵,有9个参数,那么就有8个自由度。对应的外参有6个(注:旋转矩阵R有3个,平移向量t有3个)。到这一步,我们只能得到内参的约束条件,却没法解出来。

相机标定过程

利用约束条件求出内参矩阵

令,而A=\left[\begin{array}{lll}\alpha & c & u_{0} \\ 0 & \beta & v_{0} \\ 0 & 0 & 1\end{array}\right]=\left[\begin{array}{ccc}\frac{1}{\alpha} & -\frac{c}{\alpha \beta} & \frac{v_{0} c-u_{0} \beta}{\alpha \beta} \\ 0 & \frac{1}{\beta} & -\frac{v_{0}}{\beta} \\ 0 & 0 & 1\end{array}\right],计算得到:
B=\left[\begin{array}{ccc} \frac{1}{\alpha} & 0 & 0 \\ -\frac{c}{\alpha \beta} & \frac{1}{\beta} & 0 \\ \frac{v_{0} c-u_{0} \beta}{\alpha \beta} & -\frac{v_{0}}{\beta} & 1 \end{array}\right] \cdot\left[\begin{array}{ccc} \frac{1}{\alpha} & -\frac{c}{\alpha \beta} & \frac{v_{0} c-u_{0} \beta}{\alpha \beta} \\ 0 & \frac{1}{\beta} & -\frac{v_{0}}{\beta} \\ 0 & 0 & 1 \end{array}\right]
=\left[\begin{array}{ccc} \frac{1}{\alpha^{2}} & -\frac{c}{\alpha^{2} \beta} & \frac{v_{0} c-u_{0} \beta}{\alpha^{2} \beta} \\ -\frac{c}{\alpha^{2} \beta} & \frac{c^{2}}{\alpha^{2} \beta}+\frac{1}{\beta^{2}} & -\frac{c\left(v_{0} c-u_{0} \beta\right)}{\alpha^{2} \beta^{2}}-\frac{v_{0}}{\beta^{2}} \\ \frac{v_{0} c-u_{0} \beta}{\alpha^{2} \beta} & -\frac{c\left(v_{0} c-u_{0} \beta\right)}{\alpha^{2} \beta^{2}}-\frac{v_{0}}{\beta^{2}} & \frac{\left(v_{0} c-u_{0} \beta\right)^{2}}{\alpha^{2} \beta^{2}}+\frac{v_{0}^{2}}{\beta^{2}}+1 \end{array}\right]

我们可以发现是一个对称向量,我们设:

则有:

又有,对于:
\begin{aligned} h_{i}^{T} B h_{j} &=\left[\begin{array}{lllll} h_{i 1} & h_{i_{2}} & h_{13} \end{array}\right] \cdot\left[\begin{array}{ccc} B_{11} & B_{12} & B_{13} \\ B_{12} & B_{22} & B_{23} \\ B_{13} & B_{23} & B_{33} \end{array}\right] \cdot\left[\begin{array}{c} h_{j 1} \\ h_{32} \\ h_{33} \end{array}\right] \\ &=\left(h_{11} B_{11}+h_{12} B_{12}+h_{13} B_{13}\right) h_{j 1}+\left(h_{11} B_{12}+h_{22} B_{22}+h_{13} B_{23}\right) h_{12}+\left(h_{13} B_{13}+h_{12} B_{23}+h_{13} B_{33}\right) h_{33} \\ &=h_{11} h_{j 1} B_{11}+\left(h_{12} h_{11}+h_{11} h_{12}\right) B_{12}+h_{12} h_{32} B_{22}+\left(h_{13} h_{j 1}+h_{11} h_{33}\right) B_{13}+\left(h_{13} h_{32}+h_{12} h_{33}\right) B_{23}+h_{33} h_{33} B_{33} \end{aligned}
则有:

其中:
v_{i j}=\left[\begin{array}{c} h_{i 1} h_{j 1} \\ \left(h_{i 2} h_{j 1}+h_{i 1} h_{j 2}\right) \\ h_{i 2} h_{j 2} \\ \left(h_{i 3} h_{j 1}+h_{i 1} h_{j 3}\right) \\ \left(h_{i 3} h_{j 2}+h_{i 2} h_{j 3}\right) \\ h_{i 3} h_{j 3} \end{array}\right]
我们有约束条件:

这两个约束条件可以改写为齐次形式:

我们用一个新的矩阵来表示这两个式子:

这里的是一个的矩阵。约束条件变为:。
如果观察了张图片,那么可以得到n个方程。我们想要解出,是一个6维向量,要求出唯一解,则至少需要6个方程。一个有2个约束条件,那么要求出唯一解,至少需要3个,即至少需要3张图片(n≥3)。
如果我们求出了唯一解b,那么就可以得到B,那就也可以求出相机内参A。
\left\{\begin{array}{l} v_{0}=\left(B_{12} B_{13}-B_{11} B_{23}\right) /\left(B_{11} B_{22}-B_{12}^{2}\right) \\ \lambda=B_{33}-\left[B_{13}^{2}+v_{0}\left(B_{12} B_{13}-B_{11} B_{23}\right)\right] / B_{11} \\ \alpha=\sqrt{ \lambda / B_{11}} \\ \beta=\sqrt{ \lambda B_{11} /\left(B_{11} B_{22}-B_{12}^{2}\right)} \\ c=-B_{12} \alpha^{2} \beta / \lambda \\ u_{0}=c v_{0} / \alpha-B_{13} \alpha^{2} / \lambda \end{array}\right.

利用内参矩阵求解外参

通过前面的方法,假设我们已经求到了内参矩阵A。
我们使用下面的式子表示点M和它在图像上的映射点m之间的关系:

如果我们已知图片中的点m的坐标,以及点M在三维空间中的坐标,s又只是个常数,那么我们可以求出单应性矩阵H。

求解外参:

又有:

得:
\begin{array}{c} \left\{\begin{array}{l} r_{1}=\lambda^{-1} A^{-1} h_{1} \\ r_{2}=\lambda^{-1} A^{-1} h_{2} \\ r_{3}=r_{1} \times r_{2} \\ t=\lambda^{-1} A^{-1} h_{3} \end{array}\right. \\ \left\|\lambda^{-1} A^{-1} h_{1}\right\|=\left\|\lambda^{-1} A^{-1} h_{2}\right\|=1 \\ \Rightarrow \lambda=\left\|A^{-1} h_{1}\right\|=\left\|A^{-1} h_{2}\right\| \end{array}
这样就求出了外参的各项参数。

极大似然估计

假设我们得到了模型平面的n幅图片,模型平面上有m个点,假设图像上像素点的噪声服从独立的同一分布,下面给出极大似然优化问题:

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