像素坐标系、图像坐标系、相机坐标系之间的转换

前言

这些确实很重要
但是因为个人原因,本文对相机坐标系转换到世界坐标系不作记录

正文

像素坐标系,图像坐标系,相机坐标系,世界坐标系这四个关键坐标系的转换流程如下
像素坐标系、图像坐标系、相机坐标系之间的转换_第1张图片

通过针孔摄像机模型把三维世界的点映射到二维空间的示意图大概长这样
像素坐标系、图像坐标系、相机坐标系之间的转换_第2张图片

u , v u,v u,v表示像素坐标。 x , y x,y x,y表示图像坐标。 X C , Y C , Z C X_C,Y_C,Z_C XC,YC,ZC表示相机坐标, O C O_C OC表示相机坐标系的原点。 X W , Y W , Z W X_W,Y_W,Z_W XW,YW,ZW表示世界坐标

如果抛掉世界坐标系和相机坐标系,像素坐标 ( u , v ) (u,v) (u,v)到图像坐标 ( x , y ) (x,y) (x,y)的仿射变换很简单

[ u v 1 ] \begin{bmatrix} u \\ v \\ 1 \\ \end{bmatrix} uv1 = [ 1 / d x 0 u 0 0 1 / d y v 0 0 0 1 ] \begin{bmatrix} 1/dx & 0 & u_0 \\ 0 & 1/dy & v_0 \\ 0 & 0 & 1 \\ \end{bmatrix} 1/dx0001/dy0u0v01 [ x y 1 ] \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} xy1

首先明确像素到图像之间的转换不仅是数值,也包含了单位的转换,即像素/px到毫米/mm,这样更容易理解公式,其中 d x dx dx d y dy dy分别代表 x x x方向和 y y y方向上单个像素对应的长度, u 0 u_0 u0 v 0 v_0 v0分别代表主点的像素坐标(相机光轴与成像平面的交点),换个皮肤就长下面这样

{ x = ( u − u 0 ) ∗ d x y = ( v − v 0 ) ∗ d y \begin{cases} x=(u-u_0)*dx\\ y=(v-v_0)*dy\\ \end{cases} {x=(uu0)dxy=(vv0)dy

结合图一起看就会发现,先把像素点移到主点位置,然后用像素个数乘单个像素对应的长度就是图像坐标

现在把相机坐标系加上,稍稍复杂了一点,简单地把透视投影的部分理解成相似三角形,想象你平行于相机坐标系Z轴,朝向Y轴正方向把整个坐标系拍在墙上,然后就有了下图

像素坐标系、图像坐标系、相机坐标系之间的转换_第3张图片

从图中很容易看出,三角形 O C O x y p O_CO_{xy}p OCOxyp与三角形 O C O P P O_CO_PP OCOPP相似,补充设定如下
线段 p O x y = p x pO_{xy}=p_x pOxy=px 这里的 p x p_x px就是点 p p p x x x坐标值
线段 O C O x y = f O_CO_{xy}=f OCOxy=f 这里的 f f f就是焦距
线段 O C O P = Z C O_CO_P=Z_C OCOP=ZC 这里的 Z C Z_C ZC就是 P P P点的相机坐标 Z C Z_C ZC
线段 P O P = X C PO_P=X_C POP=XC 这里的 X C X_C XC就是 P P P点的相机坐标 X C X_C XC
从图中得出关系: X C / Z C = p x / f X_C/Z_C=p_x/f XC/ZC=px/f
类似地,换个方向拍坐标系得出另一个关系, Y C / Z C = p y / f Y_C/Z_C=p_y/f YC/ZC=py/f
整理方程如下

{ X C / Z C = x / f Y C / Z C = y / f Z C = Z C \begin{cases} X_C/Z_C=x/f\\ Y_C/Z_C=y/f\\ Z_C=Z_C\\ \end{cases} XC/ZC=x/fYC/ZC=y/fZC=ZC

换一下皮肤

{ Z C ∗ x = f ∗ X C Z C ∗ y = f ∗ Y C Z C ∗ 1 = 1 ∗ Z C \begin{cases} Z_C*x=f*X_C\\ Z_C*y=f*Y_C\\ Z_C*1=1*Z_C\\ \end{cases} ZCx=fXCZCy=fYCZC1=1ZC

提取 Z C Z_C ZC,推出如下关系

Z C [ x y 1 ] Z_C\begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} ZC xy1 = [ f 0 0 0 f 0 0 0 1 ] \begin{bmatrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} f000f0001 [ X C Y C Z C ] \begin{bmatrix} X_C \\ Y_C \\ Z_C \\ \end{bmatrix} XCYCZC

再结合像素坐标转图像坐标推出如下(忘记了就回头看看)

Z C [ u v 1 ] Z_C\begin{bmatrix} u \\ v \\ 1 \\ \end{bmatrix} ZC uv1 = [ 1 / d x 0 u 0 0 1 / d y v 0 0 0 1 ] \begin{bmatrix} 1/dx & 0 & u_0 \\ 0 & 1/dy & v_0 \\ 0 & 0 & 1 \\ \end{bmatrix} 1/dx0001/dy0u0v01 [ f 0 0 0 f 0 0 0 1 ] \begin{bmatrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} f000f0001 [ X C Y C Z C ] \begin{bmatrix} X_C \\ Y_C \\ Z_C \\ \end{bmatrix} XCYCZC

一般相机内参的表示形式如下

[ f x 0 u 0 0 f y v 0 0 0 1 ] \begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \\ \end{bmatrix} fx000fy0u0v01 = [ f / d x 0 u 0 0 f / d y v 0 0 0 1 ] \begin{bmatrix} f/d_x & 0 & u_0 \\ 0 & f/d_y & v_0 \\ 0 & 0 & 1 \\ \end{bmatrix} f/dx000f/dy0u0v01

最终形态如下

Z C [ u v 1 ] Z_C\begin{bmatrix} u \\ v \\ 1 \\ \end{bmatrix} ZC uv1 = [ f x 0 u 0 0 f y v 0 0 0 1 ] \begin{bmatrix} f_x & 0 & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \\ \end{bmatrix} fx000fy0u0v01 [ X C Y C Z C ] \begin{bmatrix} X_C \\ Y_C \\ Z_C \\ \end{bmatrix} XCYCZC

到此为止,可以得到方程如下

{ u = f X ∗ X C / Z C + u 0 v = f y ∗ Y C / Z C + v 0 Z C = Z C \begin{cases} u=f_X*X_C/Z_C+u_0\\ v=f_y*Y_C/Z_C+v_0\\ Z_C=Z_C\\ \end{cases} u=fXXC/ZC+u0v=fyYC/ZC+v0ZC=ZC

再换个皮肤就更清晰了

{ X C = ( u − u 0 ) ∗ Z C / f x Y C = ( v − v 0 ) ∗ Z C / f y Z C = Z C \begin{cases} X_C=(u-u_0)*Z_C/f_x\\ Y_C=(v-v_0)*Z_C/f_y\\ Z_C=Z_C\\ \end{cases} XC=(uu0)ZC/fxYC=(vv0)ZC/fyZC=ZC

很容易发现的是,需要的参数 f x , f y , u 0 , v 0 f_x, f_y, u_0, v_0 fx,fy,u0,v0就是相机内参提供的4个值。
具体求相机内参的方法本文不作介绍,张正友标定法永远滴神

已知像素坐标 u , v u, v u,v,想要求解相机坐标 X C , Y C , Z C X_C, Y_C, Z_C XC,YC,ZC,还需要知道的最后一个关键参数就是 Z C Z_C ZC

Z C Z_C ZC可以通过深度相机获取(包括但不限于双目、双目结构光、单目结构光等相机),普通的工业相机还可以借助PnP求解法,本文不多作介绍

你可能感兴趣的:(数码相机,计算机视觉,矩阵,线性代数,几何学)