Python 中如何使用 OpenCV 的 DisparityWLSFilter?
How do you use OpenCV's DisparityWLSFilter in Python?
我可以用 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)
您需要使用 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);
我可以用 cv2.StereoSGBM
计算深度图,看起来很不错。现在我想按照 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)。
我的深度图是这样的:
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)
您需要使用 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);