对于我的 StereoVision 项目(它是 2 个并行矩阵相机),视差图像一团糟。我尝试了 BM 和 SGBM 方法。我的相机设置错误吗?
import cv2
import numpy
import numpy as np
from matplotlib import pyplot as plt
left = cv2.imread("../JR_Pictures/JR_1_Test_left.bmp", cv2.IMREAD_GRAYSCALE)
right = cv2.imread("../JR_Pictur`enter code here`es/JR_1_Test_right.bmp",cv2.IMREAD_GRAYSCALE)
left = cv2.resize(left, (0, 0), None, 0.5, 0.5)
right = cv2.resize(right, (0, 0), None, 0.5, 0.5)
fx = 942.8 # 50 # 942.8 # lense focal length
baseline = 58.0 # distance in mm between the two cameras
disparities = 128 # num of disparities to consider
block = 13 # block size to match
units = 0.512 # depth units, adjusted for the output to fit in one byte
sbm = cv2.StereoBM_create(numDisparities=disparities,
blockSize=block)
left_matcher = cv2.StereoBM_create(numDisparities=disparities, blockSize=block)
wlsFilter = cv2.ximgproc.createDisparityWLSFilter(left_matcher)
right_matcher = cv2.ximgproc.createRightMatcher(left_matcher)
disparityL = left_matcher.compute(left, right)
disparityR = right_matcher.compute(left, right)
sigma = 1.5
lmbda = 32000.0
wls_filter = cv2.ximgproc.createDisparityWLSFilter(left_matcher);
wls_filter.setLambda(lmbda);
wls_filter.setSigmaColor(sigma);
filtered_disp = wls_filter.filter(disparityL, left, disparity_map_right=disparityR);
# calculate disparities
disparity = sbm.compute(left, right)
numpy_horizontal = np.hstack((left, right))
hori = np.hstack((disparityL, filtered_disp))
cv2.imshow('HorizontalStack1', numpy_horizontal)
cv2.imshow('HoriStack2', hori)
cv2.waitKey(0)
valid_pixels = disparity > 0
# calculate depth data
depth = numpy.zeros(shape=left.shape).astype("uint8")
depth[valid_pixels] = (fx * baseline) / (units * disparity[valid_pixels])
# visualize depth data
depth = cv2.equalizeHist(depth)
colorized_depth = numpy.zeros((left.shape[0], left.shape[1], 3), dtype="uint8")
temp = cv2.applyColorMap(depth, cv2.COLORMAP_JET)
colorized_depth[valid_pixels] = temp[valid_pixels]
plt.imshow(colorized_depth)
plt.show()
左右原始图像:
视差原始、过滤和计算的高度图:
缺少一些东西。 Stereo_BM 不是魔法,也不会为你做所有事情。
正如我已经写过here,您需要有一个校准系统,其中立体声设备的所有内在和外在参数都是已知的。 你校准过你的系统吗?你是如何得到
fx
和 baseline
的值的?
您使用的是立体设备还是这些只是用同一台相机拍摄的两张图像?
为什么需要校准?
首先,看看你的图像:它们没有被矫正!校正后的图像在水平线上有对应的点。仅当您有校准系统时才能进行校正。 正如您从书的底角看到的那样,它没有对齐(左右高度不同)。
其次,您没有考虑普通相机上可能相当大的镜头畸变。
然后,要计算深度,您需要基线信息。
我鼓励您尝试一下。 您可以在here找到我构建深度图的代码,您可以将其与其他示例结合起来创建您自己的系统。
这里是我如何进行校准的。祝你好运。