前言

在 相机投影及相机畸变一文 中,已经和大家介绍了三维世界到二维世界的图像投影和图像畸变及其去除相关问题。有了内参,我们可以一定程度的还原相机到底看到了什么。但是相机观测的数据还是处于相机坐标,我们还需要将局部观测转变到全局观测上来。将传感器坐标系观测转换到载体坐标系需要通过外参。本章将介绍坐标系转换及相机外参这两部分内容。

坐标系变换

坐标系变换其实在解决同一个物体在不同坐标系观察下的位置问题。

以上图为例,对同一物体,在不同坐标系下便有不同坐标。那么如果知道A与B的相对位置关系,且知道树在A坐标系下的坐标,我们如何求出树在B坐标系下的坐标呢,这就涉及到坐标系转换的内容。

首先存在一个人为设定的世界坐标系,任何物体在这个坐标系下有其固定的坐标。而当一个物体被某个物体(如相机)观测到之后,那么在相机坐标系下会有一个观测坐标,如上图中的A,B,C,但这个观测是相对观测,只对当前的相机坐标系有意义,对其他观测者是没有意义的,因为它无法把这个信息转换为对自己有用的信息,只有当坐标能转化到世界坐标系这个公共坐标系下,其他观测者才能利用这次观测,从而达到对环境的“有效建模”。那么如何转换呢,需要使用转换矩阵来完成。

二维旋转变换

假设XOY为固定的世界坐标系,X’OY’为活动坐标系,在XOY坐标系下有一点P(x,y),假设X’OY’相对于XOY旋转了θ度,则根据三角函数,可以得到在X’OY’下点P的坐标P’为:

X = OD + DF = xcos(θ) + ysin(θ)Y = PC - FC = ycos(θ) - xsin(θ)

二维平移变换

X = x + txY = y + ty

二维坐标系变换

把上述旋转变换与平移变换结合在一起,就是二维坐标系变换啦!

三维坐标系变换

二维的旋转,可以看做三维下只绕Z轴的旋转,其中Z坐标不变。

相应的,对于不同旋转,目前只需要记住中间有一个3X3的旋转矩阵就行(该矩阵有一个特殊性质,就是属于SO3群),而平移则是从二维变为三维就行了,最后三维变换:

使用坐标系变换,可以把相机坐标系(cam)下的坐标,转换到世界坐标系下。反之,也可以把世界坐标系下坐标,转换到相机坐标系下。

相机外参

首先需要说明外参是什么?一般而言外参表示的是当前参考坐标系载体在全局坐标系载体的位置。以移动机器人为例,相机 camera_link 在 机器载体 base_link的相对位置,这二者之间存在一个变换矩阵,通常用 camera_link 到 base_link的欧式转换表示,而这个变换矩阵,就是常说的相机外参。使用外参矩阵,可以把相机坐标系下看到的点转换到机器人坐标下。通俗来讲,相机外参描述了相机安装在载体的什么地方,安装角度是怎样的。

相机外参标定确定了相机在世界坐标系中的位置和朝向,这些信息可以用于将图像中的点转换为世界坐标系中的点,或者将世界坐标系中的点转换为图像中的点。

相机外参的标定

如果知道相机相对于载体坐标系安装的位置与角度,是可以直接得到相机外参的,但是,由于机械安装的误差,或者运动过程的变形,这个外参是会改变的。为了获取此时的外参,常借助于一些外参标定工具,常见的外参标定工具有如下几种:

OpenCV

OpenCV除了提供相机内参标定外,也提供了相机外参标定的功能。通过拍摄已知的三维空间点的图像,并利用这些点在相机坐标系下的三维坐标,可以计算相机的位姿。

Matlab

Matlab也提供了相机外参标定的工具箱,其中包括了单目和立体相机的标定工具。通过拍摄已知的三维空间点的图像,可以计算相机的位姿。

Kalibr

Kalibr是ETH Zurich的一个开源相机标定工具,支持单目、双目和多目相机标定。Kalibr使用基于优化的方法来计算相机的位姿,同时也可以进行相机和IMU的联合标定。

参考链接

https://blog.csdn.net/weixin_45590473/article/details/122848202