赞
踩
SGBM(Semi-Global Block Matching)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SGBM)。它是基于全局匹配算法和局部匹配算法的优缺点,提出了一种折中的方法,既能保证视差图的质量,又能降低计算复杂度。
SGBM的原理可以分为以下几个步骤:
SGBM的参数有以下几个:
下面通过调整每个参数来观察其影响效果:
初始值设置:
minDisparity = 0
numDisparities = 16
blockSize = 3
P1 = 8*blockSize*blockSize
P2 = 32*blockSize*blockSize
disp12MaxDiff = -1
preFilterCap = 63
uniquenessRatio = 10
speckleWindowSize = 0
speckleRange = 0
numDisparities: 视差数量越多,能够获取到更多详细的深度信息。但是,增加视差数量也会增加计算量,可能会导致较慢的运行速度以及噪声增多,且增大numDisparities会扩大视差范围,即视差图中可以估计的深度范围增大。如果增大的视差范围超过了场景中实际的深度范围,就会出现黑色区域。黑色区域表示无法进行有效的匹配或估计深度。
minDisparity: 最小视差越大,物体离相机近的程度就会变小。如果提高最小视差,则可能会使视差图被高估,因为物体不可能有大于最小视差的负的视差值。而如果最小视差过低,则可能会受到噪声的影响,产生错误的视差值。
blockSize: 所选的窗口大小越大,所包含的像素就越多,从而产生更稳定,但粗略的视差图。减小块大小,可以获得反之,一些锐利但可能嘈杂(即不确定)的视差边缘。
P1 和 P2: 两种参数都是控制视差变化规则的,从而使结果更平滑,增加这些值会使抗噪声能力更强但同时会失去保留锐度的细节。如果P1和P2参数值过小,则会使视差图中出现许多噪声或未对齐的图像。如果参数值太高,将导致平滑的结果,丢失更多的细节和锐度。
disp12MaxDiff: 这个参数用于限制左右视图之间的最大视差数量差异。增加这个值可能会导致插值和未对齐的像素点在图像中显示。但太小的值,则视差较光滑,缺少细节特征。
uniquenessRatio: 这个参数是用来控制像素值的唯一性,如果唯一性比例越高,则得到的视差图的噪声和未对齐的像素会越小。但如果唯一性比例太高,则有可能会失去细节特征。
speckleWindowSize: 这个参数被用来滤除孤立噪点或者离群值,如果窗口太小,则没有过滤到足够的噪声点而窗口太大则会损失一些细节特征。
speckleRange: 这个参数规定一个视差变化的阈值,如果发现视差变化超出了这个阈值,则这个像素应该是一些无用的孤立像素。适当调整该参数可以使其过滤掉孤立的杂点和噪声。
preFilterCap: 该参数控制了像素的最大值。如果已经将值限制在负值的范围内,那么它必须和像素值相比较,过滤掉那些值过大的像素点。
mode: SGBM算法的解释模式,分别为SGBM,HHSGBM和SGBM_3WAY。这些模式包含了不同的参数设定,也会影响到视差图的效果。
原文链接SGBM你不知道的秘密:深入探讨SGBM参数影响效果
评论获取源码!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。