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

时间:2016-01-24 22:07:34

标签: python opencv image-processing distance depth

我是一个完全的初学者,我试图从左右图像获取真正的深度图。我已经使用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 个答案:

答案 0 :(得分:2)

为了计算立体声的深度,您需要知道相机之间的平移和旋转。如果有,则可以获取每个视差值并使用三角测量来计算该3D点的深度。

我建议阅读http://www.robots.ox.ac.uk/~vgg/hzbook/ 有详细解释。

答案 1 :(得分:0)

假设您的相机已经过校准,图像已经过校正,您可以使用this tutorial提供的公式:

disparity = Baseline * focal-lens / depth

所以,

depth = Baseline * focal-lens / disparity