使用 OpenCV 进行相机标定

  • 在计算机的世界中对一帧图像进行分析前,我们需要将图像中的像素坐标转换为实际世界中的物理坐标,这就需要知道相机的内参和外参。
  • 内参和外参是描述相机成像过程的重要参数,它描述了很多关键信息,比如我们使用相机拍摄了一个木棍的图像,并将其传输到了计算机中。
    • 这个木棍在图像中有60个像素长,那么它在实际世界中长几米呢?(尺度转换
    • 这60个像素在图像的右上角,那么木棍在实际世界中处于什么位置呢?(位置转换
    • 镜头的畸变程度会影响图像的几何形状,径向畸变和切向畸变系数要如何获取呢?(畸变校正
  • 获取上面这些关键信息的过程就叫相机标定,通过相机标定,我们可以得到相机的内参和外参。
  • 只有知道了相机的内外参,才能有效地将其用作视觉传感器,进行精确的物体识别或视线跟踪等任务。
  • 本文将对相机标定的基本原理进行介绍,并使用 OpenCVOpenCV 进行相机标定的实践。

内参外参

参考相机与图像一文,我们知道相机的成像过程是将三维世界中的坐标点映射到二维图像平面上,这个过程可以用一个简单的针孔模型来描述(前一个等式),加入相机坐标系与世界坐标系之间的转换关系(后一个等式),我们可以得到相机成像的基本原理:

[uv1]=1Zc[fxγcx0fycy001][XcYcZc]=1ZcK[[R11R12R13R21R22R23R31R32R33][XwYwZw]+[t1t2t3]]\begin{bmatrix} u \\\\ v \\\\ 1 \end{bmatrix} = \frac{1}{Z_c} \begin{bmatrix} f_x & \gamma & c_x \\\\ 0 & f_y & c_y \\\\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_c \\\\ Y_c \\\\ Z_c \end{bmatrix} \\\\ = \frac{1}{Z_c} K \Biggl[ \begin{bmatrix} R_{11} & R_{12} & R_{13} \\\\ R_{21} & R_{22} & R_{23} \\\\ R_{31} & R_{32} & R_{33} \end{bmatrix} \begin{bmatrix} X_w \\\\ Y_w \\\\ Z_w \end{bmatrix} + \begin{bmatrix} t_1 \\\\ t_2 \\\\ t_3 \end{bmatrix} \Biggr]

将相机坐标系与世界坐标系的转换关系写成齐次坐标形式,有:

[XcYcZc1]=[R11R12R13t1R21R22R23t2R31R32R33t30001][XwYwZw1]=[Rt0T1][XwYwZw1]\begin{bmatrix} X_c \\\\ Y_c \\\\ Z_c \\\\ 1 \end{bmatrix} = \begin{bmatrix} R_{11} & R_{12} & R_{13} & t_1 \\\\ R_{21} & R_{22} & R_{23} & t_2 \\\\ R_{31} & R_{32} & R_{33} & t_3 \\\\ 0 & 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_w \\\\ Y_w \\\\ Z_w \\\\ 1 \end{bmatrix} = \begin{bmatrix} R & t \\\\ 0^T & 1 \end{bmatrix} \begin{bmatrix} X_w \\\\ Y_w \\\\ Z_w \\\\ 1 \end{bmatrix}

上面的等式中包含了相机的内参和外参:

  • 内参矩阵 KKIntrinsic Matrix)包含描述相机的内部特性的参数,包括焦距、光心、畸变等。

K=[fxγcx0fycy001]K = \begin{bmatrix} f_x & \gamma & c_x \\\\ 0 & f_y & c_y \\\\ 0 & 0 & 1 \end{bmatrix}

  • 外参矩阵 R,tR,tExtrinsic Matrix)描述相机的外部特性,包括相机在世界坐标系中的位置和方向,也就是相机坐标系与世界坐标系之间的转换关系。

[Rt0T1]=[R11R12R13t1R21R22R23t2R31R32R33t30001]\begin{bmatrix} R & t \\\\ 0^T & 1 \end{bmatrix} = \begin{bmatrix} R_{11} & R_{12} & R_{13} & t_1 \\\\ R_{21} & R_{22} & R_{23} & t_2 \\\\ R_{31} & R_{32} & R_{33} & t_3 \\\\ 0 & 0 & 0 & 1 \end{bmatrix}

标定目标

为确定空间物体表面某点的三维几何位置与其在图像中对应的二维坐标点之间的相互关系,必须建立相机成像的几何模型,这个几何模型参数就相机参数。在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为摄像机标定。

相机标定的目标是利用已的一系列世界坐标系下的三维点坐标 (Xw,Yw,Zw)(X_w, Y_w, Z_w) 和对应的二维像素点 (u,v)(u, v),找到 3×33 \times 3 的内参矩阵 KK3×33 \times 3 的旋转矩阵 RR3×13 \times 1 的平移向量 tt,当我们知道这些参数后,我们就可以说相机已经被标定了。

标定方式

从不同的角度拍摄一个已知尺寸并且有几何特征(比如直线、圆等)的物体,就能通过这些图像来计算相机的内参和外参。标定板是一种特殊的物体,它的特点是在平面上有规则的特征点,标定板的特征点可以是棋盘格、圆点、蜂窝等。

  • 在Halcon中,提供了圆点标定板和蜂窝标定板两种,通过标定助手可以实现高精度标定,输出相机内外参。
  • 在OpenCV中,使用棋盘格标定法,通过提取角点实现相机标定。

标定板

标定流程

标定流程可由以下几个步骤组成:

  1. 准备标定板:选择一个标定板,比如棋盘格,打印出来并粘贴在一个平面上。
  2. 拍摄标定板:在不同的角度拍摄标定板,获取一系列不同方向的照片。
  3. 提取角点:使用 OpenCV 的 findChessboardCorners 对每一张照片提取标定板的角点。
  4. 标定相机:理想无畸变的模型下,使用 OpenCV 的 calibrateCamera 函数进行计算得到内参和外参。

代码实现

// Github Link

参考资料