opencv立体图像的深度图

如果我们有两个场景相同的图像,则可以通过直观的方式从中获取深度信息。下面是一张图片和一些简单的数学公式证明了这种想法。

opencv立体图像的深度图_第1张图片

公式: 

 

x和x'是图像平面中与场景点3D相对应的点与其相机中心之间的距离。B是两个摄像机之间的距离(我们知道),f是摄像机的焦距(已经知道)。简而言之,上述方程式表示场景中某个点的深度与相应图像点及其相机中心的距离差成反比。因此,利用此信息,我们可以得出图像中所有像素的深度。 

创建视差图的代码:

1、StereoBM_create():该算法使用极几何来计算所谓的视差图,它是对图像中检测到的不同深度的基本表示。这样就能提取出一张图片中的前景部分而抛弃其余部分。

参数:

numDisparities:

即最大视差值与最小视差值之差, 窗口大小必须是16的整数倍,int 型

blockSize:

匹配的块大小。它必须是> = 1的奇数。通常情况下,它应该在3--11的范围内。这里设置为大于11也可以,但必须为奇数。

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

 结果:

opencv立体图像的深度图_第2张图片

当你熟悉StereoBM时,会有一些参数,可能需要微调参数以获得更好,更平滑的结果。参数:

texture_threshold:过滤出纹理不足以进行可靠匹配

区域斑点范围和大小:基于块的匹配器通常会在对象边界附近产生“斑点”,其中匹配窗口捕获一侧的前景和背景 在另一场景中,匹配器似乎还在桌子上投影的纹理中找到小的虚假匹配项。为了消除这些伪像,我们使用由speckle_size和speckle_range参数控制的散斑滤镜对视差图像进行后处理。speckle_size是将视差斑点排除为“斑点”的像素数。speckle_range控制必须将值差异视为同一对象的一部分的程度。

视差数量:滑动窗口的像素数。它越大,可见深度的范围就越大,但是需要更多的计算。

min_disparity:从开始搜索的左像素的x位置开始的偏移量。

uniqueness_ratio:另一个后过滤步骤。如果最佳匹配视差不足够好于搜索范围中的所有其他视差,则将像素滤出。如果texture_threshold和斑点过滤仍在通过虚假匹配,则可以尝试进行调整。

prefilter_size和prefilter_cap:预过滤阶段,可标准化图像亮度并增强纹理,以准备块匹配。通常,你不需要调整这些。

你可能感兴趣的:(人工智能,计算机视觉)