双目视觉(一)-相机标定及各坐标系间转换关系
本篇文章用来记录近期学习双目视觉定位的收获,后续我将随着不断深入学习对文章进行补充
视觉是人类感知外界环境信息的重要途径,其中人类约有80%的环境信息是通过双眼获取的。双目视觉系统是典型的类人视觉模型,可以很好的解决物体的识别与定位问题。
双目视觉定位的实现主要分为以下几个内容:
1. 相机标定
- 目的
确定空间某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型之间的转换参数就是相机参数,求解参数的过程叫做相机标定(摄像机标定)。 - 方法
张正友棋盘格标定法 - 工具
目前主流的方法有openCV中的Stereo Celibrate库和Matlab中的标定包,由于使用openCV标定的结果很不稳定,因此选择采用Matlab标定包进行标定,再将标定结果读入到openCV中,用于后续的图像校准和匹配。具体实现步骤我会在后续文章中写到。 - 原理
建立立体视觉系统所需要的各个坐标系,包括世界坐标系,相机坐标系以及图像坐标系(物理和像素坐标系)。
坐标系名称 | 坐标系描述 |
---|---|
世界坐标系(3D) | 描述目标在真实世界中的位置引入的参考坐标系(Xw,Yw,Zw) |
相机坐标系(3D) | 联系世界坐标系与图像坐标系的桥梁,一般取摄像机的光学轴为z轴(Xc,Yc,Zc) |
图像物理坐标系(2D) | 根据投影关系引入,方便进一步得到像素坐标,单位为毫米,坐标原点为摄像机光轴与图像物理坐标系的交点位置(x,y) |
图像像素坐标系(2D) | 真正从相机内读到的信息,图像物理坐标的离散化,以像素为单位,坐标原点在左上角(u,v) |
明确各个坐标系之间的相互转换关系:
(1)世界坐标系与相机坐标系
这是将一个三维的坐标系转换成另一个三维的坐标系,这两个坐标系之间的转换属于刚体转换,物体只改变在两个坐标系中的空间位置(平移)和朝向(旋转),而不改变其形状。它们之间的转换关系可以用旋转矩阵R和平移矩阵T来完成,这两个矩阵反映了世界坐标系与相机坐标系之间的转换关系,合称外参矩阵Lw。获得了外参矩阵,这样已知世界坐标系中的一点通过转换关系就可以得到此点在相机坐标系的位置,反之亦成立。
两个坐标系之间的转换关系用矩阵的形式表示如下:
= R * + T = = Lw *
旋转矩阵R为3*3矩阵,是三个旋转矩阵相乘的结果,代表了坐标系旋转的三个方向。平移矩阵T为3*1矩阵。
(2)相机坐标系与图像物理坐标系
这是将一个三维的坐标系转换成一个二维的坐标系,这两个坐标系的转换要通过几何投影关系获得,下面是两个坐标系的投影关系示意图:
在这里,我们可以轻松的由三角形的相似性原理得到如下关系式:
=
=
Zc*x = f * Xc
Zc*y = f * Yc
同样,可以用矩阵的形式来表示如下:
Zc * =
(3)图像物理坐标系与图像像素坐标系
首先以一个很形象的例子来说明两个坐标系间的区别。物理坐标系是一个连续的概念,它是以毫米为单位,就好某一观众在电影院里的具体坐标值(3.4,5.9);而像素坐标系是一个离散的概念,它是以像素作为单位,只能是整数值坐标,就好比某一观众在电影院里的位置是(第三排,第六列)。另外还需要注意的是,这两个坐标系的原点位置也不相同,物理坐标系将原点定为摄像机光轴与图像物理坐标系的交点位置,通常称其为主点;而像素坐标系则以像素图像的左上角为原点。
这是将一个连续的二维坐标系转换成了一个离散的二维坐标系,这两个坐标系之间的转换关系要通过数字离散化的方式获得。两个坐标系之间的转换关系用矩阵的形式表示如下:
=
为x方向单位长度包括像素的个数,为y方向单位长度包括像素的个数,(u,v)为像素坐标,(x,y)为物理坐标
考虑到两个坐标系中的原点位置不同,假设主点在像素坐标系中的坐标为(u0,v0),则有:
=
将相机坐标系到物理坐标系的转换矩阵与物理坐标系到像素坐标系的转换矩阵进行合并:
Zc * = * Zc * =
= = K*Pc
这里的K就是相机的内参矩阵,反映了相机坐标系与图像坐标系之间的转换关系。
(4)各坐标系转化示意图
注意:以下的1/dx和前文中的等同,1/dy和前文中的等同,ku等同于前文中的fx,kv等同于前文中的fy,为畸变系数(本文暂且不考虑到相机畸变情况)。
各坐标系之间转换关系式:
- 结果
通过对摄像机进行标定,最终获得了相机固有的内参矩阵K;以及反映相机在世界坐标中位姿的外参矩阵。获得了内外参矩阵,也就知道了三维空间中的每一点对应到图像坐标系中的位置;除此之外,还会获得相机的畸变系数,反映了相机直线投影的偏移情况,用于后续对图像消除畸变。
本文地址:https://blog.csdn.net/qq_45646174/article/details/103859796
上一篇: 荐 java迭代器及foreach详解
下一篇: Java函数式编程-之-函数式接口