使用cv::StereoBM进行视差计算的CvStereoBMState文档

11
Konolige的块匹配算法在OpenCV文档中的解释不够充分。CvStereoBMState的参数会影响cv::StereoBM计算视差值的准确性,但是这些参数没有被记录在文档中。以下是这些参数的列表及我的理解。也许有人可以增加那些不清楚的参数的描述。
  • preFilterType:决定在计算视差之前在图像上应用哪种滤波器。可以是CV_STEREO_BM_XSOBEL(Sobel滤波器)或CV_STEREO_BM_NORMALIZED_RESPONSE(与平均强度的差异???)。
  • preFilterSize:预过滤器的窗口大小(宽度=窗口的高度,负值)
  • preFilterCap:将输出剪辑为[-preFilterCap,preFilterCap]。超出该区间的值会发生什么?
  • SADWindowSize:在左右图像中比较的窗口的大小,在其中计算绝对差的总和以查找相应像素。
  • minDisparity:考虑到的最小视差。默认值为零,如果可能存在负视差(取决于相机视野之间的角度和测量对象到相机的距离),则应将其设为负值。
  • numberOfDisparities:视差搜索范围[minDisparity,minDisparity+numberOfDisparities]。
  • textureThreshold:仅在纹理大于(或至少等于?)此阈值的位置计算视差。纹理如何定义???周围窗口中的方差吗?
  • uniquenessRatio:摘自calib3d.hpp:“仅接受计算得出的视差d*,如果SAD(d)> = SAD(d*)(1 + uniquenessRatio/100.)对于任何d!= d+/-1在搜索范围内。”
  • speckleRange:不确定。
  • trySmallerWindows:???
  • roi1、roi2:仅在这些区域计算视差值吗?不确定。
  • speckleWindowSize:不确定。
  • disp12MaxDiff: 不确定,但是calib3d.hpp中的一条注释说执行了左右检查。猜测:从左图匹配像素到右图,再从右图匹配回左图。只有当原始左像素和反向匹配像素之间的距离小于disp12MaxDiff时,视差才有效。

  • 1
    这取决于您是否在stereoRectify中使用了标志CV_CALIB_ZERO_DISPARITY。如果是,则minDisparity应设置为零或正数,因为在这种情况下视差_不能为负数_。至于其他变量,我不知道。 - BConic
    2
    @AldurDisciple,关于minDisparity参数,我在stereoRectify中使用了CV_CALIB_ZERO_DISPARITY,但计算出的视差的最小值是负数(例如-16)。 - Basel
    算法本身有解释吗? - Stepan Yakovenko
    2个回答

    3

    speckleWindowSize和speckleRange是cv::filterSpeckles函数的参数。请查看OpenCV的文档。 cv::filterSpeckles用于后处理视差图,它会将大小小于等于speckleWindowSize(形成斑点的像素数量)且相邻两值之差不超过speckleRange的相似视差块替换为无效的视差值(短整型-16或浮点型-1.f)。


    0

    参数在Python教程深度图从立体图像中有更好的描述。这些参数似乎是一样的。

    texture_threshold:过滤掉纹理不足以进行可靠匹配的区域。
    斑点范围和大小:基于块的匹配器通常会在物体边界附近产生“斑点”,其中匹配窗口在一侧捕捉前景,另一侧捕捉背景。在这个场景中,匹配器还在桌子上的投影纹理中找到了一些小的虚假匹配。为了消除这些伪像,我们使用由speckle_size和speckle_range参数控制的斑点滤波器对视差图像进行后处理。speckle_size是一个视差blob被认为是“斑点”的下限像素数。speckle_range控制值相近的视差必须被视为同一blob的距离。
    视差数:窗口滑动的像素数。它越大,可见深度范围就越大,但需要更多的计算。
    min_disparity:从左像素的x位置开始搜索的偏移量。
    uniqueness_ratio:另一个后过滤步骤。如果最佳匹配的视差与搜索范围内的每个其他视差相比没有足够的优势,则该像素将被过滤掉。如果texture_threshold和斑点滤波仍然让虚假匹配通过,可以尝试调整此参数。
    prefilter_size和prefilter_cap:预处理阶段,用于归一化图像亮度并增强纹理以准备进行块匹配。通常情况下,您不需要调整这些参数。

    同时,还可以查看这个ROS教程,了解如何选择立体参数。


    欢迎提供解决方案的链接,但请确保您的答案即使没有链接也是有用的:在链接周围添加上下文,以便其他用户了解它的内容和原因,然后引用您链接的页面中最相关的部分,以防目标页面不可用。仅仅是一个链接的答案可能会被删除 - double-beep

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接