一、概述
相机实现如下转换:世界坐标系-> 相机坐标系->[(畸变矫正>)图像坐标系->] 像素坐标系
坐标系定义(如上图所示):
- 世界坐标系 可以任意定义;
- 相机坐标系 原点在光心(小孔成像的中心),z轴与相机光轴平行;
- 图像坐标系 为2维平面,平面在相机焦平面,原点在图像中心;
- 像素坐标系 与图像坐标系在同一平面,但原点在图像左上角(对应传感器阵列)。
坐标变换的基本原理和主要参数如下:
- 世界坐标系->相机坐标系:通过刚体的旋转和平移矩阵实现。其中,旋转矩阵R可由3个控制参数推出(Rodrigues旋转公式)、平移矩阵T有3个参数,组合在一起R|T形成外参矩阵(Extrinsic matrix),共6个参数。Transform:
其中,下标w表示世界坐标系,c表示相机坐标系。
- 相机坐标系->像素坐标系:通过内参控制,
.
其中,内参矩阵K(Intrinsic matrix),包括5个控制参数(很多时候简化为4个)。该过程实际上是由多步合并而来,即相机坐标系->图像坐标系、图像坐标系->像素坐标系。另外,对于鱼眼相机和工业相机等畸变较大的相机,还需要在中间穿插畸变矫正的操作。由于相机建模是为了获得从世界坐标系到真实像素坐标系之间的转换,畸变矫正是指在理想图像上添加畸变(注意:不是去畸变,去畸变是指为畸变的图像去除畸变,获得无畸变的图像),畸变分为径向畸变和横向畸变。其中,径向去畸变依据的原理是泰勒级数展开,可以根据精度需要选择2个或3个参数;切向畸变一般取2个参数。畸变系数D (Distortion coefficient)。
二、坐标变换
2.1 世界坐标系 <=> 相机坐标系
从世界坐标到相机坐标系的变换关系:
其中,(Xw,Yw,Zw)为世界坐标,(xc,yc,zc)为相机坐标,给出的即是外参矩阵。其中,使用符号
表示world to camera的变换。
变换分为主动变换(alibi or active transformation) V.S. 被动变换(alias or passive transformation):一个vector坐标的变换可以是由于主动变换导致的,也有可能是由于被动变换导致的。
- 主动变换:vector自己发生旋转和平移。
- 被动变换:坐标系发生旋转和平移,导致vector的坐标在旋转后的坐标系下发生变换。
参考:主动变换和被动变换_FSKEps的博客-CSDN博客_主动变换
Rotation Matrix -- from Wolfram MathWorld
左乘(pre-multiplication)V.S. 右乘(post-multiplication)
- 左乘: Rv(v是column vector),坐标系不动,点动,则左乘。
- 右乘: vR(v是row vector),点不动,坐标系动,则右乘。右乘由于坐标系动,所以每次旋转需要基于上一次旋转后后得到的坐标系的轴来看本次旋转。
参考:三维旋转矩阵 左乘和右乘分析_狼逍豪的博客-CSDN博客_旋转矩阵左乘右乘的区别
双目立体视觉:一(坐标系变换、左乘右乘、旋转矩阵)_三眼二郎-CSDN博客_坐标变换
左手坐标系和右手坐标系:本文统一使用右手坐标系。
参考:Transformation Ambiguities and Conventions — pytransform3d 1.11.0 documentation
下面着重介绍旋转。旋转有多种表示方法,常用的包括旋转矩阵(9个数,但实际只有3个自由度)、四元数、欧拉角(roll-pitch-yaw)。欧拉角是最直观的,使用3个参数表示3个旋转方向的自由度:
所绕旋转轴 | 旋转术语 | 欧拉角 |
---|---|---|
X | Roll | |
Y | Pitch | |
Z | Yaw |
其中,方向轴的定义符合右手定则,逆时针旋转为正。
图片引自 https://math.stackexchange.com/questions/363652/understanding-rotation-matrices
主动变换中(rotation of object relative to fixed axes),把vector绕坐标轴旋转的矩阵为:
,
,
被动变换(rotation of the axes)矩阵中给的是固定的vector在旋转后的坐标系中的坐标(参考Rotation Matrix -- from Wolfram MathWorld)。
2.1.1 世界坐标系=>相机坐标系
工业上一般选择Z-Y-X的顺序,三个旋转角的名字分别称为yaw,pitch,roll。把一个vector从世界坐标系旋转到相机坐标系的旋转矩阵为: