相机的内外参与相机标定
我们所生活的现实世界是一个三维的世界,人类生活期间,已经能够熟练地估计周围物体的深度及定位,但是,现在的照相机一般都只能拍摄二维图像,场景从三维变到二维的时候,一个最重要的信息,深度,就丢失了,在只是为了观赏的时候,一个二维的图像也是足够的,如果想做导航,定位及其它3D 重建等应用的时候,这个深度信息及物体之间的相对关系,距离就显得很重要了,如何从二维图像,估计出真实的三维世界,也是计算机视觉一个比较重要的任务,由此发展出多视几何,计算几何等学科。
相机的内外参估计,是几何测量的基础,相机的内外参,构建了三维世界坐标系到图像坐标系的变换关系,也就是完成了一个三维坐标到二维坐标的映射。相机的内外参,对我们理解相机成像模型也有很大的帮助。
我们先给出如下的定义:
- 世界坐标系, P w = ( x w , y w , z w ) P_w = (x_w, y_w, z_w) Pw=(xw,yw,zw), 原点为 O w O_w Ow,这个原点可以是三维世界的任意一个点
- 相机坐标系, P c = ( x c , y c , z c ) P_c = (x_c, y_c, z_c) Pc=(xc,yc,zc), 原点为 O c O_c Oc,一般把相机的原点设置在相机的光心处
- 图像坐标系, P i = ( u i , v i , 1 ) P_i = (u_i, v_i, 1) Pi=(ui,vi,1), 原点为 O i O_i Oi,一般把图像的左上角设为图像坐标系的原点
相机外参
世界坐标系的一个点 P w P_w Pw,如果以相机作为参考系,相机原点在世界坐标系中的坐标为 O c O_c Oc,则该点的坐标就变成了 P w − C P_w - C Pw−C, C C C 表示世界坐标系的原点与相机坐标系原点之间的偏移量,这个比较好理解,我们以二维平面坐标为例,如果二维坐标的原点为 (0, 0),那么在二维坐标系中的一个点为 (2, 3),如果相机的原点就在 (2, 3),那么以相机作为参考,该点的坐标就是 (0, 0),所以世界坐标系中的一个点在相机坐标系中有一个平移的关系。
另外,由于相机本身在三维坐标系中,会发生不同角度的旋转,就是我们常说的 pitch, yaw, roll,所以相机坐标系的三个坐标轴与世界坐标系的三个坐标轴,会存在三个夹角,所以相机坐标系中的一个点与世界坐标系中的一个点的关系满足如下的式子:
P c = R ( P w − C ) P_c = \mathbf{R}(P_w - C) Pc=R(Pw−C)
上式中的 R \mathbf{R} R 表示一个旋转矩阵, C C C 表示世界坐标系的原点与相机坐标系原点之间的偏移量,这两个量构成了相机的外参,将世界坐标系与相机坐标系联系起来了。
相机内参
接下来,我们再看一下相机的内参,相机的内参主要表示相机坐标系到图像坐标系的映射,在相机坐标系中,真实世界的一个点还是一个三维的点, P c = ( x c , y c , z c ) P_c = (x_c, y_c, z_c) Pc=(xc,yc,zc),但是投影到图像坐标系之后,深度消失了,也就是 z c z_c zc 消失了,只剩下 x c , y c x_c, y_c xc,yc,假设相机镜头的焦距为 f f f,在小孔成像模型中,像平面就在焦距 f f f 处,根据简单的三角关系,我们可以推出:
u i = f x c z c v i = f y c z c u_i = f \frac{x_c}{z_c} \quad v_i = f \frac{y_c}{z_c} ui=fzcxcvi=fzcyc
上面的式子说明了相机坐标系与图像坐标系存在一个尺度的变化,这个尺度和点的物距有关,这个式子也很好的解释了为什么小孔成像中会有近大远小的关系。
不过,上面的式子,像平面的原点是在像平面与主光轴的交点处,也就是图像的中心,我们一般设定的图像原点在图像的左上角,为了适配这种关系,可以给上面的式子再加一个平移量,则上式变为:
u i = f x c z c + p u v i = f y c z c + p v u_i = f \frac{x_c}{z_c} + p_u \quad v_i = f \frac{y_c}{z_c} + p_v ui=fzcxc+puvi=fzcyc+pv
上面的式子换成矩阵形式:
z c [ u i v i 1 ] = [ f 0 p u 0 f p v 0 0 1 ] [ x c y c z c ] z_c \begin{bmatrix} u_i \\ v_i \\ 1 \end{bmatrix} = \begin{bmatrix} f & 0 & p_u \\ 0 & f & p_v \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} x_c \\ y_c \\ z_c \end{bmatrix} zc⎣⎡uivi1⎦⎤=⎣⎡f000f0pupv1⎦⎤⎣⎡xcyczc⎦⎤
写成一个更紧凑的形式:
z c P i = K P c z_c P_i = \mathbf{K}P_c zcPi=KPc
上面这个式子描述了相机坐标系到图像坐标系的映射关系, z c z_c zc 表示一个点在相机坐标系下的深度, K \mathbf{K} K 表示相机内参矩阵
投影矩阵
现在,我们有了相机的外参,表示世界坐标系到相机坐标系的变换,也有了相机的内参,表示相机坐标系到图像坐标系的变换,那么将内外参联合起来,就可以得到世界坐标系到图像坐标系的映射:
z c P i = K P c = K R ( P w − C ) z_c P_i = \mathbf{K} P_c = \mathbf{K}\mathbf{R}(P_w - C) zcPi=KPc=KR(Pw−C)
为了写成一个更加紧凑的形式,引入齐次坐标,将世界坐标系写成 P w = ( x w , y w , z w , 1 ) P_w = (x_w, y_w, z_w, 1) Pw=(xw,yw,zw,1),则上述式子可以表示成:
z c P i = [ K R − K R C ] P w = H P w z_c P_i = \begin{bmatrix} \mathbf{K}\mathbf{R} & - \mathbf{K}\mathbf{R} C \end{bmatrix} P_w = \mathbf{H} P_w zcPi=[KR−KRC]Pw=HPw
上式的 H \mathbf{H} H 是一个 3 × 4 3 \times 4 3×4 的投影矩阵,可以表示成:
H = K R [ I − C ] \mathbf{H} = \mathbf{K}\mathbf{R} \begin{bmatrix} \mathbf{I} & -C \end{bmatrix} H=KR[I−C]
K \mathbf{K} K 就是相机内参矩阵, R \mathbf{R} R 是相机外参中的旋转矩阵, C C C 是平移量,上面的内参矩阵 K \mathbf{K} K 是理想的小孔成像模型,如果考虑到实际情况,更一般的内参矩阵会考虑到装配误差,像素的长宽不一致等问题,内参矩阵更一般的形式如下所示:
K = [ a x s p x 0 a y p y 0 0 1 ] \mathbf{K} = \begin{bmatrix} a_x & s & p_x \\ 0 & a_y & p_y \\ 0 & 0 & 1 \end{bmatrix} K=⎣⎡ax00say0pxpy1⎦⎤
其中,
a x = f d x a y = f d y a_x = \frac{f}{dx} \quad a_y = \frac{f}{dy} ax=dxfay=dyf
上式将尺度由实际的 mm 转换成像素为单位,dx,dy 表示单个像素的长宽值, p x , p y p_x, p_y px,py 也表示实际的像素个数
相机标定
为了得到相机的外参,内参,根据上面的表达式,可以通过精确地测量三维世界的坐标点和图像上的坐标点,建议对应关系,再求解线性方程,从而获得投影矩阵,然后再通过矩阵分析,获得相机的内参,外参,这种方法的缺陷就是需要知道精确的三维坐标,这个在实际使用的时候不太方便,在实际使用的时候,一般都是用张正友标定法,这个方法的具体细节后面可以找个时间单独讲,这里就大概介绍一下基本的流程,这个方法已经集成到 OpenCV 里了。
- 准备一个标定板,比如黑白棋盘格,测量棋盘格格子的尺寸
- 对需要标定的相机,从各个角度拍摄一组图像
- 对获取的图像提取角点信息,获取角点在图像上的坐标,调用函数 cv2.findChessboardCorners
- 进一步获取更精确的角点坐标,调用函数 cv2.cornerSubPix
- 调用 OpenCV 的函数进行内外参的计算,调用函数 cv2.calibrateCamera
- 最后会返回四组参数:mtx, dist, rvecs, tvecs
- mtx 内参矩阵
- dist 畸变系数
- rvecs 外参的旋转矩阵
- tvecs 外参的平移量
参考
CMU 计算摄影课 http://graphics.cs.cmu.edu/courses/15-463/
多视图几何基础——深入理解相机内外参数 https://zhuanlan.zhihu.com/p/54139614文章来源:https://www.toymoban.com/news/detail-407972.html
相机标定的原理及实现 https://blog.csdn.net/weixin_43843780/article/details/89294131文章来源地址https://www.toymoban.com/news/detail-407972.html
到了这里,关于相机的内外参与相机标定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!