python cv.StereoSGBM_create方法参数与用法详解

作用

创建StereoSGBM(semi-global block matching)对象。该对象实现了半全局匹配算法。

原型

cv.StereoSGBM_create([, minDisparity[, numDisparities[, blockSize[, P1[, P2[, disp12MaxDiff[, preFilterCap[, uniquenessRatio[, speckleWindowSize[, speckleRange[, mode]]]]]]]]]]]) -> retval

参数

  • minDisparity:最小可能的差异值。正常情况下,它为零,但有时校正算法会移动图像,因此需要相应地调整此参数。
  • numDisparities:disparity的搜索范围,即最大差异减去最小差异。该值始终大于零。在当前的实现中,这个参数必须可以被16整除。
  • blockSize:块的线性大小。大小应该是奇数(因为块位于当前像素的中心)。更大的块大小意味着更平滑,但不太准确的视差图。较小的块大小会给出更详细的视差图,但算法找到错误对应的几率更高。一般在3到11之间。
  • P1:控制视差平滑度的第一个参数,是相邻像素之间视差变化为1的惩罚。值越大,视差越平滑。
  • P2:控制视差平滑度的第二个参数,是相邻像素之间视差变化超过1的惩罚。值越大,视差越平滑。该算法要求P2>P1。
  • disp12MaxDiff:左右视差检查中允许的最大差异(以整数像素为单位)。将其设置为非正值以禁用检查。
  • preFilterCap:预滤波图像像素的截断值。该算法首先计算每个像素的x方向的导数,并按[-preFilterCap,preFilterCap]间隔剪裁其值。结果值被传递到Birchfield-Tomasi像素代价函数。
  • uniquenessRatio:最佳(最小)计算成本函数值应超过第二最佳值的百分比,满足此百分比的条件下才认为找到的匹配是正确的。通常,5-15范围内的值就足够好了。
  • speckleWindowSize:考虑其噪声斑点的平滑差距区域的最大尺寸,并使之无效。把它设置为0以禁用斑点过滤。否则,将它设置在50-200范围内的某个地方。
  • speckleRange:每个连接组件内的最大视差变化。如果进行斑点过滤,将参数设置为正值,它将被隐式地乘以16。通常,1或2就足够了。
  • mode:默认情况下,它设置为false。若将其设置为MODE_HH,将运行完整的双过程动态规划算法。

代码示例

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')

猜你喜欢

转载自blog.csdn.net/qq_41112170/article/details/126736215