OpenCV相机标定与3D重建(1)概述

时间:2024-11-09 09:13:11
  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

本节中的函数使用所谓的针孔相机模型。通过使用透视变换将场景中的3D点 P w P_w Pw 投影到图像平面上,从而获得场景的视图,形成相应的像素点 p p p P w P_w Pw均用齐次坐标表示,即分别为3D和2D齐次向量。在本节引言的末尾,您将找到关于射影几何、齐次向量和齐次变换的简要介绍。为了更加简洁的符号表示,我们通常省略“齐次”一词,而直接说向量而不是齐次向量。

由针孔相机模型给出的无畸变的射影变换如下所示。
s    p = A [ R ∣ t ] P w , s \; p = A \begin{bmatrix} R|t \end{bmatrix} P_w, sp=A[Rt]Pw,
其中 P w P_w Pw是相对于世界坐标系表示的3D点,p 是图像平面上的2D像素,A 是相机内参矩阵,R 和t 是描述从世界坐标系到相机坐标系(或相机框架)的坐标变化的旋转和平移,s 是射影变换的任意缩放因子,并不是相机模型的一部分。相机内参矩阵A(使用的符号如[314]中所述,也通常记作K)将给定在相机坐标系中的3D点投影到2D像素坐标,即:
p = A P c . p = A P_c. p=APc.
相机内参矩阵 A 由以像素单位表示的焦距 f x f_x fx f y f_y fy以及主点 ( c x , c y ) (c_x, c_y) (cx,cy)组成,主点通常接近图像中心:
A = [ f x 0 c x 0 f y c y 0 0 1 ] A = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} A= fx000fy0cxcy1
因此
[ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ X c Y c Z c ] \begin{bmatrix}{u}\\{v}\\{1}\end{bmatrix}=\begin{bmatrix}{f_x}&{0}&{c_x}\\ {0}&{f_y}&{c_y}\\ {0}&{0}&{1} \end{bmatrix} \begin{bmatrix}{X_c}\\{Y_c}\\{Z_c}\end{bmatrix} uv1 = fx000fy0cxcy1 XcYcZc

内参矩阵不依赖于所观察的场景。因此,一旦估计出来,只要焦距固定(对于变焦镜头而言),就可以重复使用。因此,如果相机的图像按某个比例因子缩放,那么所有这些参数都需要按相同的比例因子进行缩放(相应地乘以或除以)。

联合旋转-平移矩阵 [ R ∣ t ] [R|t] [Rt]是射影变换和齐次变换的矩阵乘积。3x4 的射影变换将用相机坐标表示的3D点映射到图像平面上的2D点,并且这些2D点用归一化的相机坐标 x ′ = X c / Z c x' = X_c / Z_c x=Xc/Zc y ′ = Y c / Z c y' = Y_c / Z_c y=Yc/Zc
Z c [ x ′ y ′ 1 ] = [ 1 0 0 0 0 1 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] Z_c \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix} Zc xy1 = 100010001000 XcYcZc1
齐次变换由外参 R R R t t t编码,表示从世界坐标系w到相机坐标系c的基底变换。因此,给定世界坐标中的点P
的表示 P w P_w Pw,我们可以通过
P c = [ R ∣ 0 ; t ∣ 1 ] P w P_c = [R | 0; t | 1] P_w Pc=[R∣0;t∣1]Pw
这个齐次变换由 R,一个3x3的旋转矩阵,和t,一个3x1的平移向量组成:
[ R