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

bms*_*sob 5 opencv image-processing computer-vision

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

我现在在做什么:

  1. 将Sobel应用于左右图像.
  2. 阻止匹配
    • 在左图像中的像素周围选择一个(9x9)块,并与右图像的同一行中的块进行比较(原始块右侧最多80个像素)
    • 找到匹配最佳的一个(使用绝对差值的SAD总和)

由此产生的差异是我必须走多少步才才能找到最佳匹配.

在阅读了Konolige论文之后,我实现了左右检查,在找到最佳匹配后,您在左图中搜索到最佳匹配,并且只有在您最初搜索到的图像时才接受它.或者就在旁边.

还添加了一个检查,以便像素只能匹配一次,如果先前已经与像素匹配,则将在搜索中跳过使用位域像素的像素.

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

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

任何帮助表示赞赏!

我的输入是Tsukuba立体声对.

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

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

san*_*iso 3

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

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

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

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

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

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