如何在Python中使用OpenCV的DisparityWLSFilter?

2024-06-23 03:00:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以用cv2.StereoSGBM计算一个深度贴图,看起来很不错。现在我想应用WLS过滤,如here所述

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

enter image description hereenter image description here

我的深度贴图如下所示:

enter image description here


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)


Tags: 函数sizefiltermincv2windispwls
1条回答
网友
1楼 · 发布于 2024-06-23 03:00:16

您需要使用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);

相关问题 更多 >

    热门问题