转载自:https://zhuanlan.zhihu.com/p/30333032
在已经了解了立体视觉的原理之后,现在我们开始看一下立体视觉的具体实现步骤和相关的算法问题。
立体视觉系统概述
要实现一个立体视觉系统,我们首先肯定需要先获得图像,然后我们就需要进行相机标定,只有完成了相机标定,我们才能继续往下进行。然后进行图像校正,立体匹配,最后进行深度计算。整体流程如下图所示。下面将分几点分别讲述。
- 图像的获取与相机标定
在这里,我们使用双目立体视觉系统为例。既然是双目立体视觉,所以说,立体视觉图像的获取是来至两个摄像机的。
我们知道了图像的获取信息源是来自摄像机,那么我们就需要对两个摄像机进行标定,因为我们实际拿到的双目相机不可能是完全标准的立体视觉的标准模式。我们对两个摄像机进行标定主要是找到两个相机的内参数矩阵(在坐标转换中会使用到),获得相机的焦距,光心坐标,镜头的畸变系数等等,另外一个重要的参数就是获得外参数矩阵,即旋转矩阵 与平移矩阵 。
目前我们一般会使用两种工具来进行相机标定:Matlab中的标定工具箱进行标定(http://www.vision.caltech.edu/bouguetj/calib_doc/download/index.html)或者使用OpenCV来进行相机标定。我们通常都会使用尽量多的棋盘格来进行相机标定,通常这些棋盘格的位置方向尽量不一样数量也尽可能的多,这样可以增加最终数据的准确性。
- 坐标转换
我们需要从相机中看到的物体都是存在于世界坐标下的,那么它们是如何转换成像素坐标的,下面就是我们讨论的内容。整个坐标转换的过程如下图所示。
1.摄像机坐标与世界坐标之间的转换
我们首先需要建立摄像机坐标与世界坐标之间的联系,换一种说法就是要将世界坐标系映射到摄像机坐标系下。我们首先假设空间中的一点 的齐次坐标为 , 在摄像机坐标系下的坐标为 。从图中可以很清楚的看到,从世界坐标转换到摄像机坐标可以由旋转矩阵 和平移矩阵 组合得到,将其写成矩阵形式:
其中旋转矩阵 为 的正交矩阵, 为平移向量。
2.图像坐标与摄像机坐标之间的转换
我们都知道,相机的成像原理是小孔成像,那么空间中的点(坐标为在摄像机坐标系下) 投影到图像坐标系下得到的齐次坐标为 ,那么由小孔成像原理,我们可以得到下面两个公式:
将上述公式写成齐次形式:
3.像素坐标与图片坐标之间的转换
数字图像在计算机内是以行列形式存储的,定义像素坐标系为 ,坐标系如下图所示。其中像素坐标系的原点为 (一般为图片的左上角),在像素坐标系下单位长度为像素(Pixel),因此坐标点 表示这个点在图像中的第 列第 行上。但是往往一个像素在不能代表实际的物理长度,通俗点讲就是在图片中的一个像素比不等于实际上的1m或者1cm,所以还需要建立如图所示的第二套坐标系,即图像坐标系 。图像坐标系的原点为 (由于实际摄像机会有可能存在偏差,所以 可能并不在图像的中心)。现在规定每个像素点与 坐标系单位长度的比值分别为 和 (像素/实际距离), 在像素坐标系下的坐标为 。
两个坐标的变换关系得到如下公式:
将上述公式写成齐次形式:
整合上面所求出的三个齐次形式的公式,我们可以最终得到一个像素坐标与世界坐标之间的转换关系:
一般我们规定 为相机的内参数矩阵:
到这里我们就可以看出相机标定的重要性了,它不仅得到了我们最终要的内参数矩阵,同时也得到我们需要的旋转矩阵和平移矩阵,所以说相机的标定往往是第一步,只有相机标定完成了我们才能进行后面的内容。
- 立体校正
在完成了相机标定之后,我们已经获得了我们需要的各种参数,但是我们还需要完成一个内容才能进入立体视觉的核心内容,那就是立体校正。
为什么我们需要进行立体校正呢?
由于镜头成像的原因,会使得图像在边缘形成一种扭曲(distortion)现象。而且由于两个摄像机摆放的位置不合理,也使得成像会发生变化。这些因素会对后续的立体匹配产生影响,因此就需要对这些因素进行校正操作,消除透镜的畸变和同时将立体视觉系统变成理想的标准模型。总结起来就是:1.消除相机畸变;2.将立体视觉系统转换成我们熟悉的标准模型
立体校正的示意图如下所示:
- 小结
这次主要介绍的可以说是整个立体视觉最初的准备工作,其核心内容就在于立体校正中的坐标转换。我们可以看出,相机标定的结果好坏对整个系统最后的结果影响还是很大的,在实际操作时,我们往往需要进行多次的立体标定,记录最好的参数,这样可以给后面的匹配工作减小很多误差。
下次将开始介绍整个立体视觉的核心部分:立体匹配的内容。