针孔相机投影模型以及畸变模型

[TOC]

世界坐标系 到 像素坐标系

世界坐标系中三维点 $M=[X,Y,Z]^T$ 和 像素坐标系中二维点 $m=[u,v]^T$ 的关系为: \(s\tilde{m} = A [R \quad t] \tilde{M}\) 即(针孔相机模型)

\[\begin{aligned} s\left[\begin{array}{c}u\\v\\1\end{array}\right] = \left[\begin{array}{ccc} f_x&0&c_x\\0&f_y&c_y\\0&0&1 \end{array}\right] \left[\begin{array}{cccc} r_{11}&r_{12}&r_{13}&t_1\\r_{21}&r_{22}&r_{23}&t_2\\r_{31}&r_{32}&r_{33}&t_3 \end{array}\right] \left[\begin{array}{c}X_w\\Y_w\\Z_w\\1\end{array}\right] \end{aligned}\]

其中,$s$ 为缩放因子,$A$ 为相机的内参矩阵,$[R \quad t]$ 为相机的外参矩阵,$\tilde{m}$ 和 $\tilde{M}$ 分别为 $m$ 和 $M$ 对应的齐次坐标。

针孔相机模型

相机将三维世界中的坐标点(单位:米)映射到二维图像平面(单位:像素)的过程能够用一个几何模型来描述,其中最简单的称为 针孔相机模型 (pinhole camera model) ,其框架如下图所示。

世界坐标系 到 相机坐标系

\[\begin{aligned} \left[\begin{array}{c}X_c\\Y_c\\Z_c\end{array}\right] = R \left[\begin{array}{c}X_w\\Y_w\\Z_w\end{array}\right] + t = [R \quad t] \left[\begin{array}{c}X_w\\Y_w\\Z_w\\1\end{array}\right] \end{aligned}\]

相机坐标系 到 像素坐标系

根据三角形相似关系,有

\[\frac{Z_c}{f} = \frac{X_c}{x} = \frac{Y_c}{y}\]

整理,得

\[\begin{cases} x = f \cdot \frac{X_c}{Z_c} \\[2ex] y = f \cdot \frac{Y_c}{Z_c} \end{cases}\]

像素坐标系成像平面坐标系 之间,相差一个缩放和平移,联合上式整理得

\[\begin{cases} u = \alpha \cdot x + c_x \\[2ex] v = \beta \cdot y + c_y \end{cases} \quad \Longrightarrow \quad \begin{cases} u = \alpha f \cdot \frac{X_c}{Z_c} + c_x \\[2ex] v = \beta f \cdot \frac{Y_c }{Z_c} + c_y \end{cases}\]

\[\begin{cases} u = \frac{1}{dx} \cdot x + c_x \\[2ex] v = \frac{1}{dy} \cdot y + c_y \end{cases} \quad \Longrightarrow \quad \begin{cases} u = \frac{f}{dx} \cdot \frac{X_c}{Z_c} + c_x \\[2ex] v = \frac{f}{dy} \cdot \frac{Y_c }{Z_c} + c_y \end{cases}\]

其中,

\[\begin{cases} dx = \frac{W_{sensor}}{W_{image}}\\[2ex] dy = \frac{H_{sensor}}{H_{image}} \end{cases}\]

\[\begin{cases} f_x = \frac{f}{dx}\\[2ex] f_y = \frac{f}{dy} \end{cases} \quad \Longrightarrow \quad \begin{cases} u = f_x \frac{X_c}{Z_c} + c_x \\[2ex] v = f_y \frac{Y_c }{Z_c} + c_y \end{cases}\]

\[\begin{cases} f_{nx} = \frac{f}{W_{sensor}}\\[2ex] f_{ny} = \frac{f}{H_{sensor}} \end{cases} \quad \Longrightarrow \quad \begin{cases} u = f_{nx} W_{image} \frac{X_c}{Z_c} + c_x \\[2ex] v = f_{ny} H_{image} \frac{Y_c }{Z_c} + c_y \end{cases}\]

其中,

  • $f$ 为镜头焦距,单位为米;
  • $\alpha$、$\beta$ 的单位为像素/米;
  • $dx$、$dy$ 为传感器x轴和y轴上单位像素的尺寸大小,单位为米/像素;
  • $f_x$、$f_y$ 为x、y方向的焦距,单位为像素;
  • $f_{nx}$、$f_{ny}$ 为x、y方向的归一化焦距;
  • $(c_x,c_y)$ 为主点,图像的中心,单位为像素。

最终,写成矩阵的形式为:

\[\begin{aligned} \left[\begin{array}{c}u\\v\\1\end{array}\right] = \frac{1}{Z_c} \left[\begin{array}{ccc} f_x&0&c_x\\0&f_y&c_y\\0&0&1 \end{array}\right] \left[\begin{array}{c}X_c\\Y_c\\Z_c\end{array}\right] \end{aligned}\]

\[\begin{aligned} Z_c\left[\begin{array}{c}u\\v\\1\end{array}\right] = \left[\begin{array}{ccc} f_x&0&c_x\\0&f_y&c_y\\0&0&1 \end{array}\right] \left[\begin{array}{c}X_c\\Y_c\\Z_c\end{array}\right] \end{aligned}\]

畸变模型

多项式畸变模型 (radial-tangential)

透镜的畸变主要分为径向畸变和切向畸变。

径向畸变 是由于透镜形状的制造工艺导致,且越向透镜边缘移动径向畸变越严重,实际情况中我们常用r=0处的泰勒级数展开的前几项来近似描述径向畸变,径向畸变后的归一化坐标为:

\[\begin{cases} x_{distorted} = x (1+k_1r^2+k_2r^4+k_3r^6)\\[2ex] y_{distorted} = y (1+k_1r^2+k_2r^4+k_3r^6) \end{cases}\]

切向畸变 是由于透镜和CMOS或者CCD的安装位置误差导致,切向畸变需要两个额外的畸变参数来描述,切向畸变后的归一化坐标为:

\[\begin{cases} x_{distorted} = x + 2p_1xy + p_2(r^2+2x^2)\\[2ex] y_{distorted} = y + 2p_2xy + p_1(r^2+2y^2) \end{cases}\]

联合上式,整理得

\[\begin{cases} x_{distorted} = x (1+k_1r^2+k_2r^4+k_3r^6) + 2p_1xy + p_2(r^2+2x^2)\\[2ex] y_{distorted} = y (1+k_1r^2+k_2r^4+k_3r^6) + 2p_2xy + p_1(r^2+2y^2) \end{cases}\]

其中,$r^2 = x^2 + y^2$

综上,我们一共需要5个畸变参数 $(k_1, k_2, k_3, p_1, p_2)$ 来描述透镜畸变。

畸变矫正

  • [图像]畸变校正详解
  • 核心示例代码 (from here)

    for (int v = 0; v < height; v++) {
      for (int u = 0; u < width; u++) {
    
        double u_distorted = 0, v_distorted = 0;
    
        double x = (u-cx)/fx;
        double y = (v-cy)/fy;
    
        double x2 = x*x, y2 = y*y, xy = x*y, r2 = x2 + y2;
        double x_radial = x * (1 + k1*r2 + k2*r2*r2);
        double y_radial = y * (1 + k1*r2 + k2*r2*r2);
        double x_tangential = 2*p1*xy + p2*(r2 + 2*x2);
        double y_tangential = 2*p2*xy + p1*(r2 + 2*y2);
        double xd = x_radial + x_tangential;
        double yd = y_radial + y_tangential;
    
        u_distorted = xd*fx + cx;
        v_distorted = yd*fy + cy;
    
        // 最近邻插值
        if (u_distorted >= 0 && v_distorted >= 0 && u_distorted < width && v_distorted < height)
            img_dst(v, u) = (*this)((int) v_distorted, (int) u_distorted);
        else
            img_dst(v, u) = 0;
      }
    }
    
Read More

基于数字光栅投影的结构光三维测量技术

[TOC]

概述

本文是在读了论文《基于数字光栅投影的结构光三维测量技术与系统研究》[1]之后做的学习总结,方便自己学习,同时与博友共享,共同提高!

三维重建 & 三维测量

三维重建

三维重建(3D Reconstruction)是指利用二维投影恢复物体三维信息的数学过程和计算机技术,包括数据获取、预处理、点云拼接和特征分析等步骤。

三维重建过程:图像获取、摄像机标定、特征提取、立体匹配和三维重建。

三维测量

三维数据测量即对物体的三维数据进行测量,根据三维数据测量采用的原理或媒介的不同可以将其分为两大类:接触式测量和非接触式测量。接触式测量是在测量时与被测物体相接触的测量方法;非接触式测量则指在测量时与被测物体不接触的测量方法。

光学三维测量

光学三维测量主要分为被动三维测量(无结构光)和主动三维测量(有结构光)两种:

被动三维测量

主要过程:多幅二维图像 –> 计算出特征点 –> 重建三维特征点 –> 特征点滤波 –> 得到三维模型。

主动三维测量

  • 结构光的作用:增加三维物体的纹理信息;
  • 双目视觉系统:将投影仪当作一个逆向的相机,通过建立投影仪图像和相机图像的对应关系,将投影仪标定转换为成熟的相机标定,从而将单相机结构光三维测量系统转换为经典的双目视觉系统;
  • 主要测量方法
    • 激光扫描法(LS)
    • 傅立叶变换轮廓术(FTP)
    • 相位测量轮廓术(PMP)
    • 彩色编码条纹投影法(CFP)

基于PMP的结构光三维测量技术

本文所讲的三维测量方法用的是主动三维测量中的 相位测量轮廓术(PMP)

测量时,投影仪将一幅或一组正弦光栅条纹投影到空间中,形成投影条纹,摄像机拍摄到被测物体表面,得到条纹图像,根据图像获得相位分布情况进行三维重建。

整体架构参见附录《结构光三维测量原理图》。

结构光生成与投射

  • 水平方向光栅条纹图像12幅:不同频率3组,每组不同相移的4幅图像
  • 竖直方向光栅条纹图像12幅:不同频率3组,每组不同相移的4幅图像

结构光生成

由计算机生成并发送到投影仪的光栅图像的灰度分布为:

\[I(u,v) = a + bcos(\theta(u,v)), \theta(u,v) = \phi(u,v)+ \alpha\]

其中,$(u,v)$ 表示投影面投影像素单元的坐标,$I(u,v)$ 为 $(u,v)$ 点的灰度值,a和b分别为正弦光栅的直流基波分量(光强背景值)和振幅(调制光强),$\theta(u,v)$ 为 $I(u,v)$ 对应的光栅相位,$\phi$ 为待求相位主值,$\alpha$ 为相位位移。

光栅非正弦性

由于环境光的影响,投影光栅在波峰和波谷处出现平台现象[2]。

相位计算

相位主值计算

相位主值即相对相位值,本文采用标准的 四步相移法 计算光栅图像的相位主值。

利用 频率相同 四幅光栅图像计算出一幅相位主值图像,四幅光栅图像的光强表达式为:

\[I_i(u,v) = a + bcos(\theta_i(u,v)), \\ \theta_i(u,v) = \phi(u,v) + \frac{\pi}{2}i, i \in \{0,1,2,3\}\]

则光栅图像的相位主值为:

\[\phi(u,v) = arctan( \frac{I_3-I_1}{I_0-I_2} )\]

编程中,一般使用atan2方法:

\[\phi(u,v) = atan2(I_3-I_1, I_0-I_2 )\]

最终,12幅水平条纹光栅图像计算出3幅水平相位主值图像,12幅竖直条纹光栅图像计算出3幅竖直相位主值图像。

相位展开

相位展开,又称解包裹,计算其绝对相位值。本文利用 三频外差原理 计算其绝对相位值。

最终,根据上步计算出的3幅水平相位主值图像计算出1幅水平绝对相位值图像,根据上步计算出的3幅竖直相位主值图像计算出1幅竖直绝对相位值图像。

DMD图像坐标计算

根据一个方向的绝对相位值,可以确定DMD图像中的一条垂直线或水平线;则根据水平和垂直两个方向的绝对相位值,可以确定DMD图像中的一个点。

通过竖直和水平光栅条纹的CCD图像(相机图像)中的点 $(u_c,v_c)$,可以确定DMD图像(投影仪图像)中对应的一个点 $(u_p,v_p)$,该点坐标可用如下公式计算。

\[\begin{cases} u_p = \frac{\Phi_v(u_c,v_c)}{N_v \cdot 2\pi} \cdot W \\ v_p = \frac{\Phi_h(u_c,v_c)}{N_h \cdot 2\pi} \cdot H \end{cases}\]

其中,$\Phi_v$和$\Phi_h$分别为CCD光栅图像中$(u_c,v_c)$点处竖直和水平方向的绝对相位值,$N_v$和$N_h$分别为竖直和水平CCD光栅图像中光栅条纹数,H和W分别为CCD光栅图像竖直和水平方向分辨率。

图像矫正

对 $(u_c,v_c)$ 和 $(u_p,v_p)$ 使用预先标定出的 系统畸变参数 进行矫正,二阶径向畸变 矫正公式如下。 \(\left\{ \begin{aligned} \bar u = u + (u-u_0)[k_1(x^2+y^2) + k_2(x^2+y^2)^2] \\ \bar v = v + (v-v_0)[k_1(x^2+y^2) + k_2(x^2+y^2)^2] \end{aligned} \right.\)

重建三维坐标

投影测量和计算机视觉中总是利用两张或两张以上的图像恢复物体的三维坐标。

本文根据矫正后的CCD图像和DMD图像坐标 $(u_c,v_c)$ 和 $(u_p,v_p)$,以及预先 相机标定 出的系统内参和外参,计算出对应的三维坐标(世界坐标)。

\[\left\{ \begin{aligned} s_c \left[\begin{array}{c}u_c\\v_c\\1\end{array}\right] = A_c[R_c \quad t_c] \left[\begin{array}{c}X_w\\Y_w\\Z_w\\1\end{array}\right] \text{确定相机光心与像点的一条线} \\ s_p \left[\begin{array}{c}u_p\\v_p\\1\end{array}\right] = A_p[R_p \quad t_p] \left[\begin{array}{c}X_w\\Y_w\\Z_w\\1\end{array}\right] \text{确定光机光心与像点的一条线} \end{aligned} \right\}\text{得到三维坐标}\]

其中,$s_c$ 和 $s_p$ 分别为相机和光机的尺度因子,$(u_c,v_c)$ 和 $(u_p,v_p)$ 分别为矫正后的CCD图像和DMD图像坐标,$A_c$ 和 $A_p$ 为内部参数矩阵,$[R_c \quad t_c]$ 和 $[R_p \quad t_p]$ 为外部参数矩阵。

添加彩色纹理

利用预先计算出的 白平衡参数 和R、G、B灰度图像,根据三原色加法原理,得到彩色图像,再使用该彩色图像渲染三维点云。

三维点云处理

利用PCL(Point Cloud Library)库对三维点云进行处理。

系统精度评估

标定精度评估

使用标定出的参数计算出所有标定点的三维坐标,然后计算其与实际坐标的距离。

测量精度评估

  • 平面测量误差
  • 球体空间误差:球心距、单个球的球面误差

参考文献

[1]李中伟. 基于数字光栅投影的结构光三维测量技术与系统研究[D].华中科技大学,2009. [2]达飞鹏,盖绍彦. 光栅投影三维精密测量[M]. 北京:科学出版社,2011.

附录

Read More

^