我正在开发一个 StereoVision 项目。我设置了立体相机,拍摄了一张图片(它是 2 个并行矩阵相机),然后我阅读了 openCV 文档,尝试了示例和其他数据集,看起来它工作得很好。另一方面,我的照片的视差图像一团糟。我也用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()
我尝试了 Github、Stackoverflow、OpenCv 教程中的几个代码,但没有一个能正常工作,所以我认为问题出在没有相机或没有图像。我不得不缩小它们,因为它是 BMP 文件格式,我无法上传它到 stackoverflow :D
所以,这些是我的左右原始图像。
左图,右图:
还有我的 DisparityRaw、过滤和计算的高度图。
如果我错过了任何信息,请告诉我,并感谢您的帮助。
缺少一些东西。 Stereo_BM 不是魔法,也不会为你做所有事情。
正如我已经写过here,您需要有一个校准系统,其中立体声设备的所有内在和外在参数都是已知的。 你校准过你的系统吗?你是如何得到
fx
和 baseline
的值的?
您使用的是立体声设备还是这些只是用同一台相机拍摄的两张图像?
为什么需要校准?
首先,看看你的图像:它们没有被矫正!校正后的图像在水平线上有对应的点。仅当您有校准系统时才能进行校正。 正如您从书的底角看到的那样,它没有对齐(左右高度不同)。
其次,您没有考虑普通相机上可能相当大的镜头畸变。
然后,要计算深度,您需要基线信息。
我鼓励您尝试一下。 您可以在这里找到我构建深度图的代码,您可以将其与其他示例结合起来创建您自己的系统。
这里是我进行校准的方法。祝你好运。