Python:如何从视差图中获取真实深度

3

我是一个完全的初学者,正在尝试从左右图像中获取真实的深度图。我使用OpenCV通过块匹配来获取视差图,如下面的代码所示。

import cv2
import cv2.cv as cv
import sys
import numpy as np

def getDisparity(imgLeft, imgRight, method="BM"):

gray_left = cv2.cvtColor(imgLeft, cv.CV_BGR2GRAY)
gray_right = cv2.cvtColor(imgRight, cv.CV_BGR2GRAY)
print gray_left.shape
c, r = gray_left.shape
if method == "BM":
    sbm = cv.CreateStereoBMState()
    disparity = cv.CreateMat(c, r, cv.CV_32F)
    sbm.SADWindowSize = 11
    sbm.preFilterType = 1
    sbm.preFilterSize = 5
    sbm.preFilterCap = 61
    sbm.minDisparity = -50
    sbm.numberOfDisparities = 112
    sbm.textureThreshold = 507
    sbm.uniquenessRatio= 0
    sbm.speckleRange = 8
    sbm.speckleWindowSize = 0

    gray_left = cv.fromarray(gray_left)
    gray_right = cv.fromarray(gray_right)

    cv.FindStereoCorrespondenceBM(gray_left, gray_right, disparity, sbm)
    disparity_visual = cv.CreateMat(c, r, cv.CV_8U)
    cv.Normalize(disparity, disparity_visual, 0, 255, cv.CV_MINMAX)
    disparity_visual = np.array(disparity_visual)

elif method == "SGBM":
    sbm = cv2.StereoSGBM()
    sbm.SADWindowSize = 9;
    sbm.numberOfDisparities = 0;
    sbm.preFilterCap = 63;
    sbm.minDisparity = -21;
    sbm.uniquenessRatio = 7;
    sbm.speckleWindowSize = 0;
    sbm.speckleRange = 8;
    sbm.disp12MaxDiff = 1;
    sbm.fullDP = False;

    disparity = sbm.compute(gray_left, gray_right)
    disparity_visual = cv2.normalize(disparity, alpha=0, beta=255, norm_type=cv2.cv.CV_MINMAX, dtype=cv2.cv.CV_8U)

return disparity_visual

imgLeft = cv2.imread('1.png')
imgRight = cv2.imread('2.png')
try:
    method = "BM"
except IndexError:
    method = "BM"

disparity = getDisparity(imgLeft, imgRight, method)
cv2.imshow("disparity", disparity)
#cv2.imshow("left", imgLeft)
#cv2.imshow("right", imgRight)
cv2.waitKey(0)

我的问题是:使用Python获取从视差到真实深度图的最简单方法是什么?
2个回答

2

为了计算立体视觉中的深度,需要知道相机之间的平移和旋转关系。如果已知这些信息,可以利用三角测量法计算每个视差值所对应的 3D 点的深度。

我推荐阅读 http://www.robots.ox.ac.uk/~vgg/hzbook/,以获取详细解释。


0
假设您的相机已经校准,图像已矫正,您可以使用本教程提供的公式:
disparity = Baseline * focal-lens / depth

所以,

depth = Baseline * focal-lens / disparity

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