OpenCV-Python教程:49.立体图像的深度图

基础

在上一节,我们看到了极线约束和其他相关术语。我们也看到了如果我们有同一场景的两张图像,我们可以从直觉的方法从里面获得更多信息。下面是一个图像,和一些数学公式证明这个直觉

上面的图包含等面积三角形,写出他们的等式会得到下面的结果:

x和x'是图像平面里的点对应的场景里的点和摄像机中心的距离。B是两个摄像机之间的距离(我们已知),f是摄像机焦距(已知)。所以,上面的等式说一个点在场景里的深度和对应图像点和他们摄像机中心点的距离差成反比。有了这个信息,我们可以得出图像里所有像素的深度。

所以它在两个图像里找对应的匹配点。我们已经看到了极线约束会让这个运算快捷和准确,当它找到了匹配,它也就找到了视差,让我们看看用OpenCV怎么做

编码

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

import numpy as np
import cv2
from matplotlib import pyplot as plt

imgL = cv2.imread('tsukuba_l.png',0)
imgR = cv2.imread('tsukuba_r.png',0)

stereo = cv2.createStereoBM(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL,imgR)
plt.imshow(disparity,'gray')
plt.show()

下面的图像包含原始图像(左边)和它的视差图(右边)。你可以看到结果被高度噪音污染了。调整numDisparities和blockSize的值,你可以得到更好结果。

END

推荐阅读更多精彩内容

  • 理论 傅里叶变换用来分析多种过滤器的频率特征。对于图片,2D离散傅里叶变换(DFT)用来找频率范围。一个快速算法叫...
    xxxss阅读 5,291评论 0 52
  • 理论 在早先的章节里,我们看到很多图像平滑技术如高斯模糊,Median模糊等,它们在移除数量小的噪音时在某种程度上...
    xxxss阅读 18,740评论 0 48
  • 基础概念 当我们使用针孔摄像机拍摄图像时,我们会丢失重要信息,图像的深度。或者图像每个点离摄像机有多远,因为这是一...
    xxxss阅读 2,972评论 0 50
  • 简单阈值 这里,问题很简单,如果像素值超过阈值,就给分配一个值(可能是白色),否则给分配另一个值(可能是黑色)。用...
    xxxss阅读 3,659评论 1 51
  • 一个院子,一个我从小到大都生活的地方。我随着时间年轮的滚动在慢慢的改变,它也一样。我了解它的一切,因为在那段...
    菇凉少年我戒爱了i阅读 85评论 0 0