机器学习实践系列之12 - OpenCV之三维重建

       又一次提到了 三维重建,许是三维重建的应用面太广,从 PrimSense 到 Kinnect 再到RealSense,还有一堆国内的山寨机不表。

       从 Kinnect Fusion 到 Project Tango,伟大的项目 见证着一个说法:世界总归是三维的。

        机器学习实践系列之12 - OpenCV之三维重建_第1张图片

       那就用 3D 来感知世界吧!


一. 摄像机的深度?

       如何从摄像机来获取深度,最简单的方法莫过于买一个 RGBD Camera了,对于 RGBD 摄像机的分类,主要有以下几种:

1. TOF(Time of fly)

    通过激光测距的方式计算飞行时间,确定反射距离,这类相机准确度比较高,但成本也很高。

2. 结构光

    结构光 所谓结构可以看作是图案(点、线、面等),将结构光投射至物体表面,接收器接收该物体表面反射的结构光图案,利用图案的形变来计算物体的几何信息。

3. 纯双目视觉立体匹配

    纯双目就是利用双目视觉特征,通过特征点匹配来进行计算,这里的计算通常是采用三角测量原理。

       本节按照 双目+结构光 的方式进行讲解。


• 摄像机标定 (张正友 方法)

       对于双目,第一步当然是摄像机标定,标定的概念大家应该并不陌生,比如你用过 棋盘格 做过畸变校正。

       [成像] = M * [物体],这里,矩阵M可以看成是摄像机成像的几何模型。 M中的参数就是摄像机参数,这个参数求解参数的过程就是 摄像机标定

        机器学习实践系列之12 - OpenCV之三维重建_第2张图片

       张正友 的标定方法是目前应用最多的,大家可以参考 OpenCV 的例子,分两步标定:

       1. 通过 cvCalibrateCamera2() 对每个摄像头单独进行标定,消除畸变,如果是工业相机这一步可以略过;

           PS:普通相机受畸变影响比较大,不做矫正的话 边缘处会有很大失真。

       2. 通过 cvStereoCalibrate() 来实现双目标定。

• 双极线 与 结构光

       极线 的概念比较简单,可以看下上图,根据立体成像原理,视点1、视点2和物体点 构成一个平面,这个平面与每副图像的交线(上图红色)就是极线,极线的价值在于我们寻找两幅图之间的匹配点的时候,只需要在两条线上寻找,这个约束提高了 匹配准确性,也大大降低了计算量。

       极线 为我们提供了一个方向的约束,那么另一个方向的约束就需要借助 结构光来完成了。

       这里的 结构光 我们使用 格雷码编码方式,实验中作者采用了7位 格雷码(7副图像),对应 2^7=128 种状态,如图所示:

        机器学习实践系列之12 - OpenCV之三维重建_第3张图片

       向物体连续 投射7副黑白图像,那么对于图中任意一个像素,可以得到诸如这样一个序列:

              黑 - 白 - 白 - 黑 - 黑 - 白 - 黑 (格雷码 0110010)

       这个结果的计算通过 图像二值化 得到,假设对应下图所示的 黄色线

       黄色的格雷码线红色的极线 求交,交到对应的像素点 P1(假设为左图),我们只需要在右图对应极线 搜素 格雷码值同样为 0110010 的像素即可,假设为P2。

       这个过程不需要特征匹配,对于特征不够的情况,能够得到准确的结果。

        机器学习实践系列之12 - OpenCV之三维重建_第4张图片

• 立体重建

       在得到对应点之后,立体重建就很简单了,利用三角函数计算即可,这里不再啰嗦。

        三维重建效果(可以看到黑色的地方重建比较困难,吸光现象严重):

机器学习实践系列之12 - OpenCV之三维重建_第5张图片


二. 运动状态的立体匹配

       假设已经获得了单个角度的 深度图像(包含RGB),下一步需要考虑用这个深度图来做运动重建,也就是 Kinnect Fusion的思路。

       实际上这属于 SLAM 的范畴,目前效果比较好 当属 OrbSLAM 和 RGBD-SLAM v2。

       未完待续……

你可能感兴趣的:(机器学习,计算机视觉)