本节将学习如何从立体图像中生成深度图。
基本原理
上一节中,我们学习了极线约束等基础概念和相关术语。 我们还了解到,若同一场景存在两幅图像,可通过直观方法获取深度信息。 下图展示了一些简单公式,验证了这一直观理解。
上图包含等效三角形。写出它们的等效方程后,将得到以下结果:
$$disparity = x - x' = \frac{Bf}{Z}$$
$x$ 和 $x'$,是场景中3D点在左右图像平面对应点与相机光心之间的距离。 $B$ 为两相机间距(已知),$f$ 为相机焦距(已知)。 简而言之,上述方程表明:场景中某点的深度与其对应图像点及相机光心距离之差成反比。 因此,基于这些信息可推导出图像中所有像素的深度。
该过程通过匹配两幅图像中的对应点实现。我们已了解如何利用极线约束加速并提高匹配精度。 找到匹配点后,即可计算视差。以下是使用OpenCV实现视差图的示例代码:
代码
下方代码片段展示了生成视差图的简单流程。
import numpy as np
import cv2
from matplotlib import pyplot as plt
imgL = cv2.imread('/data/cvdata/tsukuba_l.png',0)
imgR = cv2.imread('/data/cvdata/tsukuba_r.png',0)
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL,imgR)
plt.imshow(disparity,'gray')
plt.show()