目标
- 本节要学习为立体图像制作深度地图
基础
在上一节中,学习了对极约束的基本概念和相关术语。 如果同一场景有两幅图像的话,在直觉上就可以获得图像的深度信息。 下面是的这幅图和其中的数学公式证明,我们的直觉是对的。(图像来源 image courtesy)
上图包含等效三角形。写出它们的等价方程将得到以下结果:
x 和 x' 分别是图像中的点到 3D 空间中的点和到摄像机中心的距离。 B 是这两个摄像机之间的距离,f 是摄像机的焦距。上边的等式告诉我们,点的深度与 x 和 x' 的差成反比。所以根据这个等式就可以得到图像中所有点的深度图。
这样就可以找到两幅图像中的匹配点了。前面已经知道了对极约束可以使这个操作更快更准。 一旦找到了匹配,就可以计算出 disparity 了。让我们看看在 OpenCV 中怎样做吧。
代码
下面的代码显示了构建深度图的简单过程。
import numpy as np
import cv2
from matplotlib import pyplot as plt
imgL = cv2.imread('/data/cvdata/tsukuba_l.png',0)
plt.imshow(imgL)
<matplotlib.image.AxesImage at 0x7f49d135b110>
imgR = cv2.imread('/data/cvdata/tsukuba_r.png',0)
plt.imshow(imgR)
<matplotlib.image.AxesImage at 0x7f49d123b200>
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL,imgR)
plt.imshow(disparity,'gray')
plt.show()
下图左侧为原始图像,右侧为深度图像。如图所示,结果中有很大的噪音。
通过调整 numDisparities 和 blockSize 的值,将会得到更好的结果。