2016-01-24 1060 views
2

我是一个完整的初学者,我试图从左侧和右侧图像获取真正的深度图。我已经使用OpenCV通过块匹配获取视差图,如下面的代码所示。Python:如何从视差图中获得真实深度

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

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

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

0

假设你的相机标定,图像纠正,您可以使用this tutorial提供的公式是:

disparity = Baseline * focal-lens/depth 

所以,

depth = Baseline * focal-lens/disparity