在OpenCV文档中没有充分解释Konolige的块匹配算法的应用。CvStereoBMState的参数影响cv::StereoBM计算差值的精度。然而,这些参数没有文档化。我将在下面列出这些参数,并描述我所理解的。也许有人可以添加一个参数的描述,这是不清楚的。
- preFilterType:决定在计算差之前对图像应用哪种过滤器。可以是CV_STEREO_BM_XSOBEL (Sobel滤波器)或CV_STEREO_BM_NORMALIZED_RESPONSE(可能是平均强度的差异??)
- preFilterSize:预过滤器的窗口大小(宽度=窗口高度,负值)
- preFilterCap:剪辑输出到[-preFilterCap, preFilterCap]。区间之外的值会怎样呢?
- SADWindowSize:左右图片中比较窗口的大小,计算绝对差的和以找到相应的像素。
- minDisparity:最小的视差,被考虑在内。默认值为零,如果可能出现负差异,则应设置为负值(取决于相机视图之间的角度以及测量对象到相机的距离)。
- numberof悬殊:悬殊搜索范围[minDisparity, minDisparity+ numberof悬殊].
- textureThreshold:仅在纹理大于(或至少等于?)此阈值的位置计算视差。纹理是如何定义的?周围窗户的变化??
- uniquenessRatio:引用自calib3d.hpp:"接受计算的差异d*仅如果SAD(d)>= SAD(d*)(1 + uniquenessRatio/100.)在搜索范围内的任何d != d+/-1。"
- speckleRange:确定。
- trySmallerWindows: ? ?
- roi1, roi2:只计算这些区域的差异??不确定。
- speckleWindowSize:确定。
- dis12maxdiff:不确定,但calib3d.hpp中的注释说,执行左右检查。猜测:像素从左图像匹配到右图像,从右图像匹配到左图像。只有当原始左像素和反向匹配像素之间的距离小于dis12maxdiff时,差异才有效。
speckleWindowSize和speckleRange是函数cv::filterSpeckles的参数。看看OpenCV的文档。cv::filterSpeckles用于后处理视差贴图。它用无效的视差值(short -16或float -1.f)替换大小小于或等于speckleWindowSize(形成blob的像素数)的相似视差的blob(两个相邻值的差不超过speckleRange)。
这些参数在关于立体图像深度图的Python教程中有更好的描述。参数似乎是一样的。
texture_threshold:过滤掉没有足够纹理的区域用于可靠匹配
斑点范围和大小:基于块的匹配器经常产生"斑点";靠近物体的边界,其中匹配窗口捕捉一侧的前景和背景另一方面。在这个场景中,匹配器似乎也是在桌子上的投影纹理中寻找小的虚假匹配。为了消除这些伪影,我们对视差图像进行后处理由speckle_size和speckle_range控制的散斑过滤器参数。Speckle_size是a视差团被忽略为"散斑"。Speckle_range控制如何接近的价值差异必须被认为是相同的一部分blob。
差距数:窗口滑动多少像素。它越大,可见深度的范围越大,但更多需要计算
min_disparity:距离x位置的偏移量开始搜索的左像素。
uniqueness_ratio: 另一个后过滤步骤。如果最佳匹配视差不是远远好于搜索范围内的其他差异,像素被过滤掉。你可以试着调整一下Texture_threshold和散斑过滤仍然可以通过虚假的比赛。
prefilter_size and prefilter_cap:预过滤相位,使图像亮度归一化并增强纹理准备块匹配。通常你不需要调整这些。
还可以查看关于选择立体声参数的ROS教程。