单目相机成像过程

单目相机成像过程

01 理想状况下相机成像模型

在理想状况下,相机成像模型能够看做是小孔成像模型:算法

图片名称
相机成像模型

为了便于计算,咱们将像平面进行翻转,它们在数学上是等价的,而且相机硬件会自动帮咱们处理,咱们假设成像平面翻转到了相机光心的正前方。相机模型以下,其主要包含4个坐标系:优化

图片名称
图1 相机程序系统中的四大坐标系

此外,还有一个归一化平面,其实际是图像坐标系的等比缩放,也就是当 \(f=1\)的状况,主要是便于公式推导,它与图像坐标系是等比缩放关系,只须要乘以 \(f\) 便可完成相互转换。spa

图片名称
图2 归一化平面(坐标系)与图像坐标系关系

1)世界坐标系 -> 相机坐标系

图片名称
图3 世界坐标系 -> 相机坐标系(刚体变换)

假设该点世界坐标系为 \([X_W,Y_W,Z_W]^T\),世界坐标系到相机坐标系的变换是一个刚体变换,那么一样的该点,在相机坐标系下的坐标 \([X_C,Y_C,Z_C]^T\) 以下:3d

\[\left[ {\begin{array}{*{20}{c}} {{X_c}}\\ {{Y_c}}\\ {{Z_c}} \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {{r_{11}}}&{{r_{12}}}&{{r_{13}}}\\ {{r_{21}}}&{{r_{22}}}&{{r_{23}}}\\ {{r_{31}}}&{{r_{32}}}&{{r_{33}}} \end{array}} \right]\left[ {\begin{array}{*{20}{c}} {{X_W}}\\ {{Y_W}}\\ {{Z_W}} \end{array}} \right] + \left[ {\begin{array}{*{20}{c}} {{T_x}}\\ {{T_y}}\\ {{T_z}} \end{array}} \right] \]

为了将旋转矩阵平移矩阵两个矩阵形式统一,须要引入齐次坐标表示形式:blog

\[\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_C}}\\ {{Y_C}}\\ {{Z_C}}\\ 1 \end{array}} \right]}_{相机坐标系} = \underbrace {\left[ {\begin{array}{*{20}{c}} {{R_{3 \times 3}}}&{{T_{3 \times 1}}}\\ 0&1 \end{array}} \right]}_{刚体变换}\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_W}}\\ {{Y_W}}\\ {{Z_W}}\\ 1 \end{array}} \right]}_{世界坐标系} \]

2)相机坐标系 -> 图像坐标系

相机坐标系 \([X_C,Y_C, Z_C,1]^T\)图像坐标系 \([x,y]^T\)(成像平面) 的变换是个类似三角形变换,推导以下:图片

图片名称
图4 相机坐标系 -> 图像坐标系(类似三角形)

总结:数学

\[{Z_c}\underbrace {\left[ {\begin{array}{*{20}{c}} x\\ y\\ 1 \end{array}} \right]}_{\rm{图像坐标系}} = \underbrace {\left[ {\begin{array}{*{20}{c}} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{array}} \right]}_{类似三角}\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_C}}\\ {{Y_C}}\\ {{Z_C}}\\ 1 \end{array}} \right]}_{相机坐标系} \]

3)图像坐标系 -> 像素坐标系

图像坐标系像素坐标系处在同一平面,可是有两点不一样:table

  • 坐标原点不一样:图像坐标系,成像平面的中心;像素坐标系,成像平面左上角
  • 单位不一样:图像坐标系,单位mm,属于物理单位;像素坐标系,单位pixel(\(1 \ pixel= dx \ or \ dy \ mm\)),日常描述一个像素点都是几行几列;

它们之间的转换关系以下,包含平移与缩放两个变换:class

图片名称

总结:基础

\[\underbrace {\left[ {\begin{array}{*{20}{c}} u\\ v\\ 1 \end{array}} \right]}_{像素坐标系} = \underbrace {\left[ {\begin{array}{*{20}{c}} {\frac{1}{{dx}}}&0&{{u_0}}\\ 0&{\frac{1}{{dy}}}&{{v_0}}\\ 0&0&1 \end{array}} \right]}_{平移+缩放}\underbrace {\left[ {\begin{array}{*{20}{c}} x\\ y\\ 1 \end{array}} \right]}_{图像坐标系} \]

4)总结

世界坐标系像素坐标系的转换关系以下:

图片名称
  1. 世界坐标系到相机坐标系

    \[\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_C}}\\ {{Y_C}}\\ {{Z_C}}\\ 1 \end{array}} \right]}_{相机坐标系} = \underbrace {\left[ {\begin{array}{*{20}{c}} {{R_{3 \times 3}}}&{{T_{3 \times 1}}}\\ 0&1 \end{array}} \right]}_{刚体变换}\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_W}}\\ {{Y_W}}\\ {{Z_W}}\\ 1 \end{array}} \right]}_{世界坐标系} \]

  2. 相机坐标系到图像坐标系

    \[{Z_c}\underbrace {\left[ {\begin{array}{*{20}{c}} x\\ y\\ 1 \end{array}} \right]}_{\rm{图像坐标系}} = \underbrace {\left[ {\begin{array}{*{20}{c}} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{array}} \right]}_{类似三角}\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_C}}\\ {{Y_C}}\\ {{Z_C}}\\ 1 \end{array}} \right]}_{相机坐标系} \]

  3. 图像坐标系到像素坐标系

    \[\underbrace {\left[ {\begin{array}{*{20}{c}} u\\ v\\ 1 \end{array}} \right]}_{像素坐标系} = \underbrace {\left[ {\begin{array}{*{20}{c}} {\frac{1}{{dx}}}&0&{{u_0}}\\ 0&{\frac{1}{{dy}}}&{{v_0}}\\ 0&0&1 \end{array}} \right]}_{平移+缩放}\underbrace {\left[ {\begin{array}{*{20}{c}} x\\ y\\ 1 \end{array}} \right]}_{图像坐标系} \]

将以前全部的变换合并,能够获得:

\[{Z_c}\underbrace {\left[ {\begin{array}{*{20}{c}} u\\ v\\ 1 \end{array}} \right]}_{像素坐标系} = \underbrace {\left[ {\begin{array}{*{20}{c}} {\frac{1}{{dx}}}&0&{{u_0}}\\ 0&{\frac{1}{{dy}}}&{{v_0}}\\ 0&0&1 \end{array}} \right]}_{03 \ 平移+缩放}\underbrace {\left[ {\begin{array}{*{20}{c}} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{array}} \right]}_{02\ 类似三角形}\underbrace {\left[ {\begin{array}{*{20}{c}} {{R_{3 \times 3}}}&{{T_{3 \times 1}}}\\ 0&1 \end{array}} \right]}_{01 \ 刚体变换}\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_W}}\\ {{Y_W}}\\ {{Z_W}}\\ 1 \end{array}} \right]}_{世界坐标系} \]

将它们相乘后化简:

\[{Z_c}\underbrace {\left[ {\begin{array}{*{20}{c}} u \\ v \\ 1 \end{array}} \right]}_{像素坐标系} = \underbrace {\left[ {\begin{array}{*{20}{c}} {{f_x}}&0&{{u_0}} \\ 0&{{f_y}}&{{v_0}} \\ 0&0&1 \end{array}} \right]}_{M1:内参}\underbrace {\left[ {\begin{array}{*{20}{c}} {{R_{3 \times 3}}}&{{T_{3 \times 1}}} \end{array}} \right]}_{M2:外参}\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_W}} \\ {{Y_W}} \\ {{Z_W}} \\ 1 \end{array}} \right]}_{世界坐标系} \]

以上是理想状况下世界坐标系到像素坐标系的转换,而因为相机制造工艺的缘由,其成像过程当中不免存在着畸变,在后续构建精确的三维重建算法前,咱们要对相机的畸变进行矫正,以提升算法重建的精度,这一步骤也称为相机标定

02 考虑畸变状况下相机成像模型

相机畸变主要有两种类型:径向畸变切向畸变,咱们分别介绍这两种状况。

1)径向畸变

缘由:在相机制造过程当中,很难保证镜头的厚度彻底均匀,因为制造工艺的缘由,一般为这种状况为中间厚、边缘薄,于是光线在远离透镜中心的地方,会发生更大程度的扭曲,这种现象在鱼眼相机(桶形畸变)中尤其明显。

径向畸变主要有两种类型:枕型畸变桶型畸变,示意图以下:

图片名称 图片名称
图片名称 图片名称
桶型畸变 枕形畸变

它们能够由 \(k_1,k_2\) 构成的下列数学公式描述:

\[\left[ {\begin{array}{*{20}{c}} {x'}\\ {y'} \end{array}} \right] = (1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6})\left[ {\begin{array}{*{20}{c}} x\\ y \end{array}} \right] \]

其中:

  • \(r\) 为曲率半径,有:\(r^2 =x^2 + y^2\)
  • \(k_1,k_2,k_3\) 为径向畸变系数;
  • \(x, y\) 为发生畸变后角点的坐标,也就是咱们实际看到的;
  • \(x',y'\) 为畸变矫正,也就是去除畸变后的正确坐标;

注:这里不管是 \(x, y,x',y'\),其均为归一化平面上角点的坐标。

一般:咱们只用 \(k_1,k_2\) 来矫正相机,对于畸变较小的图像中心区域,主要是 \(k_1\) 在起做用,对于畸变较大的图像边缘区域,主要是 \(k_2\) 在起做用,而对于鱼眼相机这类广角相机,咱们才会用 \(k_3\)。须要注意的是,这里并非用的系数越多,整个矫正结果越精确,咱们应该考虑相机的实际状况。

2)切向畸变

缘由:切向畸变产生的缘由在于相机在制造过程当中,成像平面与透镜平面不平行,产生了透视变换。

img 图片名称

这种畸变能够由如下公式描述,它也与距离图像中心的距离半径有关:

\[\left[ {\begin{array}{*{20}{c}} x'\\ y' \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {2{p_1}xy + {p_2}\left( {{r^2} + 2{x^2}} \right)}\\ {2{p_2}xy + {p_1}\left( {{r^2} + 2{y^2}} \right)} \end{array}} \right] \]

其中:\(p_1,p_2\) 称为切向畸变矫正系数,其它的含义与径向畸变中公式相同。

3)合并考虑畸变

缘由:其实也很简单,两种畸变是同时发生在成像过程当中的,发生的缘由也是相互独立的,并且也都是关于距离的表达式,你彷佛也找不到更好的方式来综合考虑这两种偏差,实践证实,这种合并考虑畸变的状况效果还不错。

将径向畸变和切向畸变合并,只须要将两个畸变矫正直接加起来便可,公式以下:

\[\left[ {\begin{array}{*{20}{c}} {x'}\\ {y'} \end{array}} \right] = \underbrace {\left( {1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6}} \right)\left[ {\begin{array}{*{20}{c}} x\\ y \end{array}} \right]}_{径向畸变} + \underbrace {\left[ {\begin{array}{*{20}{c}} {2{p_1}xy + {p_2}\left( {{r^2} + 2{x^2}} \right)}\\ {2{p_2}xy + p1\left( {{r^2} + 2{y^2}} \right)} \end{array}} \right]}_{切向畸变} \]

其中:

  • \(k_1,k_2,k_3\) 为径向畸变系数;
  • \(p_1,p_2\) 为切向畸变系数;

不过在此以前,咱们特别注意一点,相机畸变现象发生的位置:

  • 世界坐标系 -> 相机坐标系,刚体变换,不存在畸变现象;
  • 相机坐标系 -> 图像坐标系,也就是成像过程,理想状况下是类似三角形,但实际因为相机制造、装配的缘由,成像过程存在畸变现象;
  • 图像坐标系 -> 像素坐标系,坐标原点、单位不一样,仅仅平移与缩放,不存在畸变现象;

03 成像过程总结

如今,咱们将这些公式进行整理,假设:

  • 某点世界坐标系为\(P(X_W,Y_W,Z_W)\)
  • 对应的实际获得的像素坐标系为 \(P(u,v)\)(未矫正的);
  • 正确的像素坐标为 \(P(u',v')\)
  • 假设咱们已知畸变系数 \(k_1,k_2,k_3,p_1,p_2\)

那么从世界坐标系 \(P(X_W,Y_W,Z_W)\) 到正确的像素坐标系 \(P(u',v')\) 的推导以下,对于像素坐标系下某点 \(P(u,v)\),有:

  1. 像素坐标系 -> 归一化坐标系

    这个变换仅仅是平移与缩放,不存在畸变,于是只须要一个逆变换,归一化坐标 \(P=(x,y)^T\) 推导以下:

    \[\begin{array}{c} \underbrace {\left[ {\begin{array}{*{20}{c}} u\\ v\\ 1 \end{array}} \right]}_{像素坐标} = \underbrace {\left[ {\begin{array}{*{20}{c}} {\frac{1}{{dx}}}&0&{{u_0}}\\ 0&{\frac{1}{{dy}}}&{{v_0}}\\ 0&0&1 \end{array}} \right]}_{平移+缩放}\underbrace {\left( {\underbrace {\left[ {\begin{array}{*{20}{c}} x\\ y\\ {1/f} \end{array}} \right]}_{归一化坐标} \times f} \right)}_{图像坐标} \\ \Downarrow \\ \underbrace {\left[ {\begin{array}{*{20}{c}} x\\ y\\ {1/f} \end{array}} \right]}_{归一化坐标} = \underbrace {\left( {{{\left[ {\begin{array}{*{20}{c}} {\frac{1}{{dx}}}&0&{{u_0}}\\ 0&{\frac{1}{{dy}}}&{{v_0}}\\ 0&0&1 \end{array}} \right]}^{ - 1}}\underbrace {\left[ {\begin{array}{*{20}{c}} u\\ v\\ 1 \end{array}} \right]}_{像素坐标}} \right)}_{图像坐标}/f \end{array} \]

  2. 归一化坐标系(带畸变的) -> 归一化坐标系(畸变矫正后)

    在前一成像过程,也就是相机坐标系到归一化平面透射中,相机发生了畸变,于是咱们须要将实际的归一化坐标 \(P=(x,y)^T\) 纠正到理想的无畸变归一化坐标 \(P=(x',y')^T\)

    \[\left[ {\begin{array}{*{20}{c}} {x'}\\ {y'}\\ {1/f} \end{array}} \right] = \left[ {\begin{array}{*{20}{c}} {\left( {1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6}} \right)x + 2{p_1}xy + {p_2}\left( {{r^2} + 2{x^2}} \right)}\\ {\left( {1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6}} \right)y + 2{p_2}xy + {p_1}\left( {{r^2} + 2{y^2}} \right)}\\ {1/f} \end{array}} \right] \]

  3. 归一化坐标系(理想)-> 相机坐标系

    理想的无畸变归一化坐标 \(P=(x',y')\) 到相机坐标系,它们是类似三角形关系:

    \[{Z_c}\underbrace {\left( {\underbrace {\left[ {\begin{array}{*{20}{c}} {x'}\\ {y'}\\ 1/f \end{array}} \right]}_{归一化坐标系(准确)} \cdot f} \right)}_{图像坐标} = \underbrace {\left[ {\begin{array}{*{20}{c}} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{array}} \right]}_{类似三角形}\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_C}}\\ {{Y_C}}\\ {{Z_C}}\\ 1 \end{array}} \right]}_{相机坐标} \\ \Downarrow \\ \left[ {\begin{array}{*{20}{c}} {{X_c}}\\ {{Y_c}}\\ {{Z_c}}\\ 1 \end{array}} \right] = f \cdot {Z_c} \cdot {\left[ {\begin{array}{*{20}{c}} f&0&0&0\\ 0&f&0&0\\ 0&0&1&0 \end{array}} \right]^{ - 1}}\left[ {\begin{array}{*{20}{c}} {x'}\\ {y'}\\ {1/f} \end{array}} \right] \]

    注:这里 \(3 \times 4\) 矩阵的逆是伪逆。

  4. 相机坐标系 -> 世界坐标系

    相机坐标系到世界坐标系,仅仅是以前刚体变换的反变换:

    \[\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_C}}\\ {{Y_C}}\\ {{Z_C}}\\ 1 \end{array}} \right]}_{相机坐标系} = \underbrace {\left[ {\begin{array}{*{20}{c}} {{R_{3 \times 3}}}&{{T_{3 \times 1}}}\\ 0&1 \end{array}} \right]}_{刚体变换}\underbrace {\left[ {\begin{array}{*{20}{c}} {{X_W}}\\ {{Y_W}}\\ {{Z_W}}\\ 1 \end{array}} \right]}_{世界坐标系} \\ \Downarrow \\ \left[ {\begin{array}{*{20}{c}} {{X_W}}\\ {{Y_W}}\\ {{Z_W}}\\ 1 \end{array}} \right] = {\left[ {\begin{array}{*{20}{c}} {{R_{3 \times 3}}}&{{T_{3 \times 1}}}\\ 0&1 \end{array}} \right]^{ - 1}}\left[ {\begin{array}{*{20}{c}} {{X_C}}\\ {{Y_c}}\\ {{Z_c}}\\ 1 \end{array}} \right] \]

因此,咱们只须要将上述的四个公式合并起来便可,像素坐标系\(P=(u,v)\)转换到世界坐标系 \(P=(X_W,Y_W,Z_W)\)

04 思考问题

如今的问题是,咱们如何求得这些畸变系数 \(k_1,k_2,k_3,p_1,p_2\)?获得这些系数以后,咱们就能创建像素坐标系与世界坐标系的映射。这个问题能够由张正友标定法来实现。

对于张正友标定法的原理,略微有些复杂,在下一节推送中,咱们从它的实现开始讲起,而后若是大家有兴趣,能够看咱们的拓展阅读《张正友标定法数学基础及原理推导》。

先回过头来看前面的式子,咱们能够看到,即便考虑了畸变,从像素坐标系到世界坐标系的转换,其实仍是一些乘法运算,可是这里有两个问题须要你们思考:

1)问题一

对于考虑了畸变的相机模型,世界坐标系与像素坐标系之间的转换公式,实际上是存在一个问题的:不能写成彻底矩阵\(x,y\) 的乘法形式。由于相机模型的切向畸变部分包含非线性项 \(xy,x^2,y^2\)

\[\left[ {\begin{array}{*{20}{c}} {x'}\\ {y'} \end{array}} \right] = \underbrace {\left( {1 + {k_1}{r^2} + {k_2}{r^4} + {k_3}{r^6}} \right)\left[ {\begin{array}{*{20}{c}} x\\ y \end{array}} \right]}_{径向畸变} + \underbrace {\left[ {\begin{array}{*{20}{c}} {2{p_1}xy + {p_2}\left( {{r^2} + 2{x^2}} \right)}\\ {2{p_2}xy + p1\left( {{r^2} + 2{y^2}} \right)} \end{array}} \right]}_{切向畸变} \]

有人说,这样彷佛也没什么问题嘛,无非是计算速度慢一点而已,但事情不是这样的,矩阵方程里存在着非线性项,并且还有一个加法,咱们那些关于方程组解、求特征值、正定、半正定、正交这些理论武器,所有都失去做用了。

事实上,一些质量较好的工业相机,切向畸变都是很小的(话说,相机都不许,你拿它作什么精确的三维重建…),张正友标定法在初始的时候即假设相机不存在径向畸变(以后会求),也就是 \(p_1,p_2\) 都等于零,另外一样\(k3=0\)。这样的好处在于,考虑畸变的相机模型,在初期跟理想模型的差异在于乘以一个常数项,整个式子就能够写为一个单应性矩阵的形式,方便咱们对方程组进行优化:

\[s\tilde m = A\left[ {\begin{array}{*{20}{c}} {{R_{3 \times 3}}}&{{T_{3 \times 1}}} \end{array}} \right]\tilde M \]

其中:

  • \(s\) 称为尺度因子;
  • $\tilde m $ 为像素坐标系,$\tilde M $ 为世界坐标系;
  • \(A\) 为单应性矩阵;
  • \([R_{3 \times 3} \ T_{3\times1}]\) 是外参矩阵;

2)问题二

还有个问题,假设咱们获得了这些畸变系数,可否由像素坐标系推导到世界坐标系?事实上是不能的,好比下面这种图:

图片名称 图片名称
图a 单目相机失真 图2 单目相机模型

光心 \(O_c\)\(P(X_C,Y_C,Z_C)\) 的整条连线上的三维点,在成像平面的像点均在点 \(p(x,y)\) 上。因此在单目相机的标定方法中,甚至不须要知道棋盘格的实际大小也能完成相机的标定。

相关文章
相关标签/搜索