9.3. 立体图像深度图

9.3.1. 目标

在这次会议上,
-我们将学习从立体图像创建深度图。

9.3.2. 基础

在上一节课中,我们看到了一些基本概念,如极线约束和其他相关术语。我们还看到,如果我们有两个相同场景的图像,我们可以从中直观地获得深度信息。下面是一幅图片和一些简单的数学公式,证明了直觉。(图片礼貌:

上图包含等效三角形。写出它们的等价方程将得到以下结果:

\[视差=x-x'=frac{Bf}{Z}\]

\(x\)\(x'\) 是与场景点3D相对应的图像平面中的点与其相机中心之间的距离。 \(B\) 是两个摄像机之间的距离(我们知道) \(f\) 是相机的焦距(已经知道)。简言之,上面的公式表明,场景中一个点的深度与对应图像点与其摄像机中心的距离差成反比。利用这些信息,我们可以得到图像中所有像素的深度。

所以它在两个图像之间找到对应的匹配。我们已经看到了外延约束如何使这个操作更快、更准确。一旦找到匹配,它就会找到差距。让我们看看如何使用OpenCV。

9.3.3. 代码

下面的代码片段显示了一个创建视差图的简单过程。

>>> import numpy as np
>>> import cv2
>>> from matplotlib import pyplot as plt
>>>
>>> imgL = cv2.imread('/cvdata/tsukuba_l.png',0)
>>> imgR = cv2.imread('/cvdata/tsukuba_r.png',0)
>>>
>>> stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
>>> disparity = stereo.compute(imgL,imgR)
>>> plt.imshow(disparity,'gray')
>>> plt.show()
../_images/sec04-depthmap_1_0.png

下图包含原始图像(左)及其视差图(右)。如你所见,结果被高度的噪音污染了。通过调整numDisparities和blockSize的值,可以获得更好的结果。

注意

要添加的更多详细信息

9.3.4. 额外资源

9.3.5. 练习

  1. OpenCV样本包含一个生成视差图及其三维重建的例子。支票 stereo_match.py 在OpenCV Python示例中。