尝试了opencv documentation中所述的示例之后。
当我在KITTI图像对上尝试相同的代码时,我得到了:
我现在正在使用的代码如下所示,更改StereoBM_create中的参数并没有太大帮助:
import numpy as np
import cv2
from matplotlib import pyplot as plt
imgL = cv2.imread('000002_left.png',0)
imgR = cv2.imread('000002_right.png',0)
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
#stereo = cv2.StereoBM_create(numDisparities=64, blockSize=17)
disparity = stereo.compute(imgL,imgR)
cv2.imwrite('depth_map.png', disparity)
disp_v2 = cv2.imread('depth_map.png')
disp_v2 = cv2.applyColorMap(disp_v2, cv2.COLORMAP_JET)
plt.imshow(disp_v2)
cv2.imwrite('depth_map_coloured.png', disp_v2)
plt.show()
问题是:如何使深度图更好?
答案 0 :(得分:-1)
以我的经验,StereoBM(OpenCV)不适用于KITTI图像。也许是因为KITTI图像要复杂得多。
但是我使用此工具取得了很好的效果
答案 1 :(得分:-1)
您应该在opencv中调整立体匹配器的参数。
这是我创建的类中的一个函数。可以看出我调整了一些参数,例如视差数,最小视差等:
def get_stereo_map(self, image_idx):
left_RGB = self.get_left_RGB(image_idx) # left RGB image
right_RGB = self.get_right_RGB(image_idx) # right RGB image
# compute depth map from stereo
stereo = cv2.StereoBM_create()
stereo.setMinDisparity(0)
num_disparities = 16*5
stereo.setNumDisparities(num_disparities)
stereo.setBlockSize(15)
stereo.setSpeckleRange(16)
# stereo.setSpeckleWindowSize(45)
stereo_depth_map = stereo.compute(
cv2.cvtColor(np.array(left_RGB), cv2.COLOR_RGB2GRAY),
cv2.cvtColor(np.array(right_RGB), cv2.COLOR_RGB2GRAY))
# by equation + divide by 16 to get true disperities
stereo_depth_map = (self.storage.focal_pix_RGB * self.storage.baseline_m_RGB) \
/ (stereo_depth_map/16)
stereo_depth_map = DataParser.crop_redundant(stereo_depth_map)
return stereo_depth_map
完整代码参考我的仓库:https://github.com/janezlapajne/kitty-stereo-dataset-parser 还包括来自激光雷达和立体距离图的地面实况。希望对大家有帮助。