Python+OpenCV 计算图像场景的深度图(原理与代码实现)

目录

  • 问题描述
  • 原理介绍
  • StereoBM_create()
    • 作用
    • 原型
    • 参数
    • 返回值
  • StereoBM.compute()
    • 作用
    • 原型
    • 参数
    • 输出
  • StereoSGBM_create()
  • OpenCV代码
  • 结果

问题描述

目录hw3下有立体视觉对应的两幅图像view1.png和view5.png,图像来源于http://vision.middlebury.edu/stereo/data/。请计算出这两幅图像对应场景的深度。

原理介绍

由于时间原因,通过调用OpenCV中与计算立体图像的深度图相关的函数实现,没有自己造轮子。

双目立体匹配一直是双目视觉的研究热点,双目相机拍摄同一场景的左、右两幅视点图像,运用立体匹配匹配算法获取视差图,进而获取深度图,这也正是本次实验的内容。从原理上,如果我们有两张相同场景的图像,我们可以通过直观的方式从中获得深度信息,如下图所示。
上图包含等效三角形,并有如下方程式:


其中disparity是视差,x与x’是与三维场景中的点对应的图像平面中的点与其相机中心之间的距离。B是两个摄像机之间的距离(已知),f是摄像机的焦距(已知)。该等式表明,场景中的点的深度与相应的图像平面的点及其相机中心之间的距离差成反比。该等式就是推导像素深度的原理。

在OpenCV中,具体实现涉及到如下几个方法:

StereoBM_create()

作用

创建StereoBM(block match)对象。

原型

cv.StereoBM_create( [, numDisparities[, blockSize]] ) -> retval

参数

• numDisparities:disparity的搜索范围。 对于每个像素,算法将找到从0(默认的最小视差)到numDisparities的最佳视差。之后,可以通过改变最小视差来改变搜索范围,见StereoSGBM_create()。
• blockSize:块的线性大小。大小应该是奇数(因为块位于当前像素的中心)。更大的块大小意味着更平滑,但不太准确的视差图。较小的块大小会给出更详细的视差图,但算法找到错误对应的几率更高。

返回值

• retval:StereoBM(block match)对象。可以通过该对象的compute()方法。

StereoBM.compute()

作用

计算一对stereo图像的视差。

原型

cv.StereoMatcher.compute(left, right[, disparity]) -> disparity

参数

• left:8bit单通道图像,左图。
• right:8bit单通道图像,右图。

输出

• disparity:视差图,与输入图像的大小相同。StereoBM或StereoSGBM计算16位定点视差图(其中每个视差值有4个小数位),而其他算法输出32位浮点视差图。

StereoSGBM_create()

见该文章:
python cv.StereoSGBM_create方法参数与用法详解

OpenCV代码

import cv2

def estimate_depth(left_path, right_path, show=True):
    # 读取左右两张图像
    img_left = cv2.imread(left_path, 0)
    img_right = cv2.imread(right_path, 0)
    height, width = img_left.shape[:2]

    # 初始化stereo block match对象
    stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)

    # 获取视差图
    disparity = stereo.compute(img_left, img_right)

    if show:
        # 将视差图归一化
        # min_val = disparity.min()
        # max_val = disparity.max()
        # disparity = np.uint8(6400 * (disparity - min_val) / (max_val - min_val))

        # 显示视差图
        cv2.imshow('disparity image', disparity)
        cv2.imwrite('disparity.jpg', disparity)
        cv2.waitKey(0)


estimate_depth('images/view1.png', 'images/view5.png')

结果


文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
青葱年少的头像青葱年少普通用户
上一篇 2023年4月5日
下一篇 2023年4月5日

相关推荐