为什么我的 StereoVision 视差图是错误的?

问题描述 投票:0回答:1

对于我的 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()

左右原始图像:

LeftPicRightPic

视差原始、过滤和计算的高度图:

enter image description here

python opencv stereo-3d disparity-mapping heightmap
1个回答
3
投票

缺少一些东西。 Stereo_BM 不是魔法,也不会为你做所有事情。

正如我已经写过here,您需要有一个校准系统,其中立体声设备的所有内在和外在参数都是已知的。 你校准过你的系统吗?你是如何得到

fx
baseline
的值的? 您使用的是立体设备还是这些只是用同一台相机拍摄的两张图像?

为什么需要校准?

首先,看看你的图像:它们没有被矫正!校正后的图像在水平线上有对应的点。仅当您有校准系统时才能进行校正。 正如您从书的底角看到的那样,它没有对齐(左右高度不同)。

其次,您没有考虑普通相机上可能相当大的镜头畸变。

然后,要计算深度,您需要基线信息。

我鼓励您尝试一下。 您可以在here找到我构建深度图的代码,您可以将其与其他示例结合起来创建您自己的系统。

这里是我如何进行校准的。祝你好运。

© www.soinside.com 2019 - 2024. All rights reserved.