使用OpenCV计算深度视差图

3
我在使用OpenCV计算深度图时遇到了问题。我知道两个立体图像之间的距离是通过以下公式计算的:z = (baseline * focal) / (disparity * p),但我无法弄清楚如何使用深度图计算视差。我使用的代码如下,可以提供给我两张图像的视差图。
import numpy as np
import cv2

# Load the left and right images in gray scale
imgLeft = cv2.imread('logga.png', 0)
imgRight = cv2.imread('logga1.png', 0)

# Initialize the stereo block matching object 
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=5)

# Compute the disparity image
disparity = stereo.compute(imgLeft, imgRight)

# Normalize the image for representation
min = disparity.min()
max = disparity.max()
disparity = np.uint8(6400 * (disparity - min) / (max - min))



# Display the result
cv2.imshow('disparittet', np.hstack((imgLeft, imgRight, disparity)))
cv2.waitKey(0)
cv2.destroyAllWindows()
1个回答

2

为了从视差计算深度,OpenCV提供了reprojectImageTo3d函数。

您需要从立体矫正中获取视差到深度矩阵(Q),或者按照链接中的方法创建它。您可以在这里了解有关Q矩阵的更多信息。

在获取Q矩阵后,您可以简单地将视差图重新投影到3D空间。

depth = cv2.reprojectImageTo3D(disparity, Q)


谢谢你的回答。我已经完成了以下操作,并将数据输出到一个文档中,其中我得到了大约312000行的输出。例如,我获取每个像素中的x、y和z属性信息以及RGB信息。在第33行,我得到了以下内容:-77.00000 188.0000 -121920.0000 147 166 125。我想要的是两个或一组像素之间的差异,然后我可以将其添加到我的数学公式中计算距离。公式为D = (f*b)/d,其中D是距离,f是焦距,b是基线,d是差异。d的值大约为40。我该如何获得它? - benim bonkers
你在这里使用了简单的块匹配算法。你可以尝试使用半全局块匹配算法来计算视差。在numDisparities中,你将其设置为16。在OpenCV中,你需要将其设置为16的倍数,所以你需要将视差的数量设置为48。我认为在计算深度之前,你可能需要将视差的结果除以16。 - Gopiraj
我明白了。我已经发布了一个关于这个问题的新问题,如果你不介意的话,我会很感激你的帮助。谢谢! - benim bonkers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接