【问题标题】:Python: How to get real depth from disparity mapPython:如何从视差图中获得真实深度
【发布时间】:2016-05-01 03:25:48
【问题描述】:

我是一个完整的初学者,我正在尝试从左右图像中获取真实的深度图。我已经使用 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 从视差中获取真实深度图(距离)的最简单方法是什么?

【问题讨论】:

    标签: python opencv image-processing distance depth


    【解决方案1】:

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

    disparity = Baseline * focal-lens / depth
    

    所以,

    depth = Baseline * focal-lens / disparity
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-05-27
        • 2020-06-15
        • 2018-10-22
        • 2016-08-21
        • 1970-01-01
        • 2019-09-27
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        相关资源
        最近更新 更多