基本立体声块匹配的错误结果(没有OpenCV)

时间:2013-11-28 06:29:42

标签: opencv image-processing computer-vision

我试图在不使用OpenCV或其他图像处理库的情况下实现立体块匹配。 所有教程,书籍,演讲幻灯片等仅讲授比较图像中块的基本方法,但结果非常糟糕。 我读了一些像K.Konolige那样的论文,这是OpenCV中算法的基础,但我似乎仍然错过了一些重要的东西。

我现在在做什么:

  1. 将Sobel应用于左右图像。
  2. 阻止匹配
    • 在左图像中的一个像素周围选择一个(9x9)块,并与右图像的同一行中的块进行比较(最多为原始块右侧80个像素)
    • 找到匹配最佳的一个(使用绝对差异的SAD总和)
  3. 由此产生的差异是我必须走多少步才才能找到最佳匹配。

    在阅读Konolige论文后,我实施了左右检查,在找到最佳匹配后,您在左图中搜索右图像的最佳匹配,如果是您的那个,则只接受它最初搜索或紧挨着它。

    还添加了一个检查,以便像素只能匹配一次,如果之前已匹配像素,则会在搜索中跳过使用位域像素。

    结果看起来不是很错,但非常稀疏。

    我没有添加什么?每个人似乎都知道的东西,但没有拼写出来。 我需要添加某种插值吗?

    感谢任何帮助!

    我的输入是Tsukuba立体声对。

    在网上找到的结果(第二个是OpenCV BM,第三个显然是博客作者的SAD BM)

    http://cseautonomouscar2012.files.wordpress.com/2012/11/111412_2001_comparisono1.png

1 个答案:

答案 0 :(得分:3)

您的结果稀疏是正常的,因为您的算法很稀疏!

让我们回顾一下这个故事:

  • 在第一步中,您应用了Sobel边缘检测器。你在这里做的是提取作为图像边缘的一组稀疏特征;
  • 然后你对结果应用块匹配:你实际做的是匹配边缘,从而匹配稀疏特征。

经典的BM实现工作在图像强度补丁上(这就是亮度均衡很重要的原因),即采用SSD / SAD /像素强度的相关性。

此外,BM工作,但对于困难的图像不太好。通常需要稳健的成本函数(例如归一化相关)而不是SAD。 将结果与OpenCV进行比较时要小心:OpenCV提出了另一种名为SGBM的BM实现(针对半全球BM)。在这种情况下,附加术语强制相邻像素的视差也接近。这称为规则性约束,有两种方式:

  1. 它限制了输出结果中的噪声(如果像素的差异是异常值,则将其删除并替换为从其邻居推断的值);
  2. 它允许将良好的结果传播到算法没有线索推断出良好结果的区域。这通常是边缘匹配的情况:您在边缘集合上获得了良好的视差估计,并且让正则化项将这个良好的估计传播到平坦(无纹理和无边缘)区域。