Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基本立体块匹配的结果不好(没有OpenCV)_Opencv_Image Processing_Computer Vision - Fatal编程技术网

基本立体块匹配的结果不好(没有OpenCV)

基本立体块匹配的结果不好(没有OpenCV),opencv,image-processing,computer-vision,Opencv,Image Processing,Computer Vision,我试图在不使用OpenCV或其他图像处理库的情况下实现立体块匹配。 所有教程、书籍、讲座幻灯片等都只教授比较图像中块的最基本方法,但结果非常糟糕。 我读了一些文章,比如K.Konolige的文章,这是OpenCV算法的基础,但我似乎仍然错过了一些重要的东西 我现在做的是: 将Sobel应用于左右图像 进行块匹配 在左图像中的像素周围拾取一个(9x9)块,并与右图像同一行中的块进行比较(原始块右侧最多80个像素) 找到最匹配的一个(使用绝对差的SAD和) 由此产生的差异是我必须向右走多少步才能

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

我现在做的是:

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

    在阅读了Konolige的论文后,我实施了左右检查,在找到最佳匹配后,您将在左图像中搜索右图像的最佳匹配,并且仅当它是您最初搜索的图像或其旁边的图像时才接受它

    还添加了一个检查,这样一个像素只能匹配一次,使用一个位字段,如果像素先前已与像素匹配,则在搜索中将跳过像素

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

    我没有补充的是什么?每个人似乎都知道,但没有说清楚。 我需要添加某种插值吗

    感谢您的帮助

    我的输入是筑波立体声对

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


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

    让我们把故事倒回一点:

    • 在第一步中,应用Sobel边缘检测器。这里要做的是提取一组稀疏的特征,这些特征是图像的边缘
    • 然后在结果上应用块匹配:实际操作是匹配边,从而匹配稀疏特征
    经典的BM实现工作于图像强度块(这就是亮度均衡非常重要的原因),即采用SSD/SAD/像素强度相关性

    此外,BM也可以工作,但在处理困难的图像时效果不太好。稳健的成本函数(如归一化相关性)通常是必要的,而不是SAD。 当您将结果与OpenCV进行比较时要小心:OpenCV提出了另一种称为SGBM(半全局BM)的BM实现。在这种情况下,附加项强制相邻像素的视差也接近。这称为规则性约束,有两种帮助:

  • 它限制了输出结果中的噪声(如果像素的视差是异常值,则将其移除并替换为从相邻像素推断出的值)
  • 它允许将好的结果传播到算法无法推断出好结果的区域。这是边缘匹配的典型情况:在边缘集上获得良好的视差估计,并让正则化项将此良好估计传播到平坦(无纹理和无边缘)区域