【问题标题】:How do you use OpenCV's DisparityWLSFilter in Python?如何在 Python 中使用 OpenCV 的 DisparityWLSFilter?
【发布时间】:2020-10-18 23:11:04
【问题描述】:

我可以用cv2.StereoSGBM 计算一个看起来不错的深度图。现在我想按照here 的描述应用 WLS 过滤。

This 的答案有一些信息,我在下面进行了说明,但我不能完全开始工作。

如何在 Python 中使用ximgproc_DisparityWLSFilter?我知道理论以及如何在 C++ 中做到这一点,但找不到任何关于如何将函数包装在 Python 中的文档。 (使用 OpenCV 4.2.0)。 This 是 GitHub 上的源,但它也不包含 Python 绑定。

在做:

wls = cv2.ximgproc_DisparityWLSFilter.filter(disparity_SGBM, imgL)

给予:

Traceback (most recent call last):
  File ".\stereo_SGBM_filtering.py", line 158, in <module>
    wls = cv2.ximgproc_DisparityWLSFilter.filter(disparity_SGBM, imgL)
TypeError: descriptor 'filter' requires a 'cv2.ximgproc_DisparityFilter' object but received a 'numpy.ndarray'

所以我知道我至少能够访问这些功能。

像这样修复它:

wls = cv2.ximgproc_DisparityWLSFilter(stereoSGBM)
filtered_disparity_map = wls.filter(disparity_SGBM, imgL)

不给出任何错误,但也不给我图像。

详细信息:

原始图像(Tsukuba 来自 Middlebury data set)。

我的深度图如下所示:


import cv2 

imgL = cv2.imread("tsukuba_l.png", cv2.IMREAD_GRAYSCALE)  # left image

... 

win_size = 2
min_disp = -4
max_disp = 9
num_disp = max_disp - min_disp  # Needs to be divisible by 16
stereoSGBM = cv2.StereoSGBM_create(
    minDisparity=min_disp,
    numDisparities=num_disp,
    blockSize=5,
    uniquenessRatio=5,
    speckleWindowSize=5,
    speckleRange=5,
    disp12MaxDiff=2,
    P1=8 * 3 * win_size ** 2,
    P2=32 * 3 * win_size ** 2,
)

disparity_SGBM = stereoSGBM.compute(imgL_undistorted, imgR_undistorted)
wls = cv2.ximgproc_DisparityWLSFilter(stereoSGBM)
filtered_disparity_map = wls.filter(disparity_SGBM, imgL)

【问题讨论】:

    标签: python opencv disparity-mapping


    【解决方案1】:

    您需要使用createDisparityWLSFilter工厂方法获取DisparityWLSFilter的实例并使用它。

    例如:

    wsize=31
    max_disp = 128
    sigma = 1.5
    lmbda = 8000.0
    left_matcher = cv2.StereoBM_create(max_disp, wsize);
    right_matcher = cv2.ximgproc.createRightMatcher(left_matcher);
    left_disp = left_matcher.compute(left_image, right_image);
    right_disp = right_matcher.compute(right_image,left_image);
    
    # Now create DisparityWLSFilter
    wls_filter = cv2.ximgproc.createDisparityWLSFilter(left_matcher);
    wls_filter.setLambda(lmbda);
    wls_filter.setSigmaColor(sigma);
    filtered_disp = wls_filter.filter(left_disp, left_image, disparity_map_right=right_disp);
    

    【讨论】:

    • 这是什么版本的 OpenCV?你是从官方 python 文档中学到的吗?我在哪里可以找到那个?我在 4.1.1 版本,而 cv2 没有属性 ximgproc
    • 您能否也举一个使用 WLS 进行引导过滤的示例,例如使用 rgb 图像来指导深度图的过滤? (类似于kaiminghe.com/publications/pami12guidedfilter.pdf 中的图 10)
    • @ABlankenship:我花了一点时间才弄明白,但是您必须通过执行pip install opencv-contrib-python 来安装额外 OpenCV 模块附带的软件包。
    猜你喜欢
    • 2016-07-01
    • 2011-06-29
    • 2022-01-06
    • 1970-01-01
    • 2019-09-10
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    相关资源
    最近更新 更多