最本质的相机内参intrinsics与外参extrinsics分析,从建模,推导到求解


一些内容来自于:Camera Extrinsics and Intrinsics. Link: Extrinsics, Intrinsics.

本文的坐标变换,矩阵变换完全建立在单应性坐标 homogeneous coordinate和单应性变换的基础上,包括了基础的刚体变换,以及投影变换等。具体的描述参见:homogeneous单应性坐标的定义,以及不同投影,仿射,相似,刚体变换矩阵的关系和自由度分析。

I. 坐标系的建立,Coordinate System.

主要讲从世界坐标系到图像平面坐标系以及到相机的传感器感光元件上的坐标系定义。注意:下面开始,所有的坐标点的含义均遵循下面的命名规则:

  • o o o表示的是object,world,也就是世界坐标系下面的坐标或者转换矩阵,3D;
  • k k k表示camera,相机坐标系下的坐标或者变换矩阵;
  • c c c表示image plane,图像平面坐标系下的坐标点或者变换矩阵;
  • s s s表示sensor,传感器平面坐标系下的坐标点或者变换矩阵;
  • 一个投影变换矩阵,写成 b H a ^bH_a bHa或者写成 b P a ^bP_a bPa,它的含义为:从a坐标系投影到b坐标系下的homo矩阵H或者投影矩阵P,都是可以的。也可以说成,将a坐标系下的点投影到b坐标系下的transformation变换矩阵。

因此, s H c {^sH_c} sHc表示从image plane图像平面投影到sensor传感器平面的投影矩阵,以此类推, c H k {^cH_k} cHk表示从camera相机坐标系投影到image plane图像平面的投影矩阵, k H o {^kH_o} kHo表示从object/ world世界坐标系投影到camera相机坐标系下的投影矩阵,也可以称之为homo矩阵。

根据表述规则,罗列出不同坐标系下的坐标点的表示方法。

  1. World/ Object coordinate system.
    S o = [ X , Y , Z ] T ,   o   f o r   o b j e c t . S_{o}=[X, Y, Z]^T,\ o \ for \ object. So=[X,Y,Z]T, o for object.
  2. Camera coordinate system.
    S k = [ k X , k Y , k Z ] T ,   k   f o r   c a m e r a . S_{k}=[{^kX}, {^kY}, {^kZ}]^T,\ k \ for \ camera. Sk=[kX,kY,kZ]T, k for camera.
  3. Image (plane) coordinate system.
    S c = [ c x , c y ] T ,   c   f o r   i m a g e   o r   p l a n e . S_c=[^cx,{^cy}]^T, \ c \ for \ image \ or \ plane. Sc=[cx,cy]T, c for image or plane.
  4. Sensor coordinate system. This has some distortion and nonlinearity from image coord to sensor coord.
    S s = [ s x , s y ] T ,   s   f o r   s e n s o r . S_s=[^sx, {^sy}]^T, \ s \ for \ sensor. Ss=[sx,sy]T, s for sensor.

II. 转换关系,Transformation.

从目标的世界坐标系3D,转换到相机坐标系3D,然后转换到图像平面坐标系2D,最后转换到传感器坐标系2D。转换的矩阵关系为:
[ s x s y 1 ] = s H c c H k k H o [ X Y Z 1 ] \left[ \begin{matrix} ^sx \\ ^sy \\ 1 \end{matrix} \right] = {^sH_c} {^cH_k} {^kH_o}\left[\begin{matrix} X\\ Y\\ Z\\ 1 \end{matrix}\right] sxsy1=sHccHkkHoXYZ1
其中,image plane和camera system的原点,在x和y方向是重合的,只是说image plane的原点坐标相较于camera origin向z轴平移了c。因此,图像平面的原点可以表示为相机平面的z轴平移。
k O c = k [ 0 , 0 , − c ] T ^kO_c={^k[0, 0, -c]^T} kOc=k[0,0,c]T
下图展示了图像平面与相机平面的原点关系。
图像平面与相机平面的原点关系图

III. From the world coord to the sensor coord.

下面分析从世界坐标系,通过一系列转换,到图像和传感器平面坐标的关系。其中,目标到相机是外参,相机与图像平面,传感器平面,是内参。
世界坐标系到传感器坐标系的转换关系
他们之间的变换关系,对应的刚体变换到投影变换等不同方式。具体如下图:
变换方式分析

3.1 Extrinsics,相机的外参

Extrinsic parameters describe the pose of the camera in the world.

3.1.1 从世界坐标系到相机坐标系

world coordinate to camera coordinate.
从世界坐标系到相机坐标系的转换是可逆的。知道了外参,就知道转换的矩阵。求逆就可以相互转换。
是目标点的3D位置与相机点的3D位置的相互关系所组成的homo矩阵。包括的目标位置和相机位置的一个平移和旋转关系。是一个刚体变换。只是旋转和平移。6个自由度 X p X_p Xp为投影的目标点的世界坐标系下的3D坐标。
k X p = k H X p {^kX_p} = {^kH}X_p kXp=kHXp
其中, k H {^kH} kH矩阵为:
k H = [ R − R X o 0 T 1 ] {^kH}= \left[ \begin{matrix} R &-RX_o \\ 0^T&1 \end{matrix} \right] kH=[R0TRXo1]
X o X_o Xo为camera在世界坐标系下的坐标。通过 k H ^kH kH矩阵,将世界坐标系下的点 X p X_p Xp投影到相机坐标系下的 k X P ^kX_P kXP
下图是对上面的一个小的总结,手写的推导。
相机的不同坐标系的转换关系

3.2 Intrinsics,相机的内参

Intrinsic parameters describe the mapping of the scene in front of the camera to the pixels in the final image (sensor).
其中,可逆的部分是从图像平面到sensor平面以及传感器的偏差,这里表述为model deviation。这两部分是可逆的,都是2D与2D直接的变换。而对于相机到图像,这是一个中心投影,由3D到2D的一个变换。在这个过程中,缺少了深度信息,因此,是不可逆的变换。

3.2.1 从相机到图像平面

相机坐标系到图像平面坐标系,camera coordinate to image plane。
这里采用了相似三角形的方式,来分析相机上的一点 P P P和图像平面上的一点 p ˉ \bar p pˉ。其中, x , y x, y x,y采用的是相似三角形的变换,而 z z z上所有的点,即深度信息,全是mapping到一个平面上,均为常数 c c c,这个常数,也可以设置为focal length,焦距。
在这里插入图片描述
因此,得到了图像平面上的一点 c x p ˉ ^cx_{\bar p} cxpˉ
c x p ˉ = c P k k X p ^cx_{\bar p} = {^cP_k}{^kX_p} cxpˉ=cPkkXp
其中, c P k ^cP_k cPk为:
c P k = [ c 0 0 0 0 c 0 0 0 0 1 0 ] ^cP_k=\left[ \begin{matrix} c &0 &0&0 \\ 0&c&0&0\\ 0&0&1&0 \end{matrix} \right] cPk=c000c0001000
k H {^kH} kH c P k ^cP_k cPk做合并处理,就能够直接得到从世界坐标系投影到图像平面的矩阵 c P ^cP cP。这里表示从世界坐标系投影到相机坐标系,通过 k H {^kH} kH;然后,在从相机投影到图像平面,通过 c P k {^cP_k} cPk
c P = c P k k H = [ c 0 0 0 0 c 0 0 0 0 1 0 ] [ R − R X o 0 T 1 ] ^cP={^cP_k}{^kH}=\left[ \begin{matrix} c &0 &0&0 \\ 0&c&0&0\\ 0&0&1&0 \end{matrix} \right] \left[ \begin{matrix} R &-RX_o \\ 0^T&1 \end{matrix} \right] cP=cPkkH=c000c0001000[R0TRXo1]
其中,由于 c P k {^cP_k} cPk的最后一列全为0,对最后一列做简化,得到calibration matrix c k ^ck ck:
c k = [ c 0 0 0 c 0 0 0 1 ] ^ck=\left[ \begin{matrix} c &0 &0 \\ 0&c&0\\ 0&0&1 \end{matrix} \right] ck=c000c0001
得到最后的投影矩阵 c P ^cP cP
c P = c k [ R − R X o ] = c k R [ I − X o ] 3 × 4 ^cP={^ck} \left[ \begin{matrix} R &-RX_o \end{matrix} \right] ={^ck}R \left[ \begin{matrix} I &-X_o \end{matrix} \right] _{3\times4} cP=ck[RRXo]=ckR[IXo]3×4
因此,我们能够将任何的世界坐标的点 X p X_p Xp,投影到图像平面 c x ^cx cx
c x = c k R [ I − X o ] X p ^cx={^ck}R \left[ \begin{matrix} I &-X_o \end{matrix} \right] X_p cx=ckR[IXo]Xp

3.2.2 从图像平面到传感器

image plane to sensors. 很多时候,传感器坐标系的初始原点 ( 0 , 0 ) (0,0) (0,0)不是平面的中心点。有一个小的位移。一般还包括了剪切和尺度的变换。因此,从图像平面到传感器的变换矩阵 s H c ^sH_c sHc为:
s H c = [ 1 s x H 0 1 + m y H 0 0 1 ] ^sH_c=\left[ \begin{matrix} 1 &s &x_H \\ 0&1+m&y_H\\ 0&0&1 \end{matrix} \right] sHc=100s1+m0xHyH1
s H c ^sH_c sHc矩阵与calibration matrix矩阵 c k ^ck ck结合,得到:
K = s H c c k = [ 1 s x H 0 1 + m y H 0 0 1 ] [ c 0 0 0 c 0 0 0 1 ] = [ c c s x H 0 c ( 1 + m ) y H 0 0 1 ] K={^sH_c}{^ck}=\left[ \begin{matrix} 1 &s &x_H \\ 0&1+m&y_H\\ 0&0&1 \end{matrix} \right] \left[ \begin{matrix} c &0 &0 \\ 0&c&0\\ 0&0&1 \end{matrix} \right] \\=\left[ \begin{matrix} c &cs&x_H \\ 0&c(1+m)&y_H\\ 0&0&1 \end{matrix} \right] K=sHcck=100s1+m0xHyH1c000c0001=c00csc(1+m)0xHyH1
其中,矩阵 K K K是仿射变换,包含5个参数,自由度为5:相机的常数,也就是焦距 c c c, 原点 x H , y H x_H,y_H xH,yH,尺度因子 m m m,剪切因子 s s s
s x = K R [ I − X o ] X ^sx=KR \left[ \begin{matrix} I &-X_o \end{matrix} \right] X sx=KR[IXo]X
下图是一个对相机内参的总结,包括了上述讲的几个方面。
相机内参的转换关系

3.2.3 传感器平面的非线性误差

上面的所有设定都只考虑了线性的误差,在真实世界里面,具有镜头的畸变,传感器的不平整性。包括径向畸变和切向畸变。需要用一些参数来进行校正。这个矩阵为 a H s ^aH_s aHs
a H s ( x ) = [ 1 0 Δ x ( x , q ) 0 1 Δ y ( x , q ) 0 0 1 ] ^aH_s(x)= \left[ \begin{matrix} 1 &0 &\Delta_x(x,q)\\ 0&1&\Delta_y(x,q)\\ 0&0&1 \end{matrix} \right] aHs(x)=100010Δx(x,q)Δy(x,q)1
最后得到非线性误差后的在传感器上的图像坐标:
a x = a H s s x {^ax}={^aH_s}{^sx} ax=aHssx

IV. 总结.

可以将整个投影看做两部分。

  1. 仿射变换,将世界坐标下的点 X p X_p Xp投影到传感器坐标系下为点 s x ^sx sx
    s x = P X p ^sx=PX_p sx=PXp
  2. 非线性变换,考虑传感器的非线性误差:
    a x = a H s ( x ) s x ^ax={^aH_s}(x){^sx} ax=aHs(x)sx
  3. 整个参数量为11个,包括了外参6个,内参5个

下图对本文所描述的外参和内参做了总结。
相机内外参数的总结

如果有用,记得点赞👍加收藏哦。!!!!

  • 19
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MATLAB R2018b 中,可以使用 `cameraParameters` 和 `extrinsics` 函数来求取外参矩阵。具体步骤如下: 1. 读入图片并提取角点 首先,需要读入双目相机拍摄的一对图片,并从中提取出对应的角点。可以使用 `detectCheckerboardPoints` 函数来自动检测棋盘格角点,也可以手动标注角点位置。 2. 定义内参矩阵 接下来,需要定义双目相机内参矩阵。可以使用 `cameraMatrix` 函数构造一个 `cameraParameters` 对象,该对象包含相机内参矩阵、畸变系数等信息。 ```matlab intrinsics_left = cameraMatrix([fx_left, 0, cx_left; 0, fy_left, cy_left; 0, 0, 1], size(img_left)); intrinsics_right = cameraMatrix([fx_right, 0, cx_right; 0, fy_right, cy_right; 0, 0, 1], size(img_right)); ``` 3. 求取外参矩阵 接下来,可以使用 `estimateCameraParameters` 函数来求取双目相机外参矩阵。该函数需要输入左右相机内参矩阵、角点坐标等信息。 ```matlab [stereoParams, pairsUsed, estimationErrors] = estimateCameraParameters(imagePoints, worldPoints, ... 'EstimateSkew', false, 'EstimateTangentialDistortion', false, ... 'NumRadialDistortionCoefficients', 2, 'WorldUnits', 'mm', ... 'InitialIntrinsicMatrix', [intrinsics_left.IntrinsicMatrix; zeros(1,3)], ... 'InitialRadialDistortion', [intrinsics_left.RadialDistortion; 0], ... 'Verbose', true); ``` 其中,`imagePoints` 是一个包含左右相机角点坐标的 cell 数组,`worldPoints` 是一个包含棋盘格上角点对应的实际物理坐标的矩阵。 4. 获取外参矩阵 最后,可以使用 `extrinsics` 函数从 `stereoParams` 对象中获取左右相机外参矩阵。 ```matlab [R, t] = extrinsics(imagePoints{1}, worldPoints, stereoParams.CameraParameters1); ``` 其中,`imagePoints{1}` 表示左相机的角点坐标,`stereoParams.CameraParameters1` 表示左相机的 `cameraParameters` 对象。`R` 和 `t` 分别表示左相机到世界坐标系的旋转矩阵和平移向量。 注意,上述代码只给出了求取左相机外参矩阵的示例,求取右相机外参矩阵的方式类似,只需要将 `imagePoints{1}` 和 `stereoParams.CameraParameters1` 替换为 `imagePoints{2}` 和 `stereoParams.CameraParameters2` 即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值