首页 > 编程语言 >必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程

时间:2023-09-28 18:02:25浏览次数:50  
标签:Stereo 立体匹配 PMS 像素 算法 平面 Patch 窗口 视差

计算机视觉life

聚焦计算机视觉、机器人SLAM、自动驾驶、AR领域核心技术。

公众号

本文对立体匹配算法:Patch Match Stereo实用进行了教程详解。

作者丨3D视觉开发者社区

01

简介

我们知道,现有立体匹配算法一般被分类为局部算法、全局算法和半全局算法,其中局部算法和半全局算法是应用最为广泛。在局部算法中,一个最简单的做法就是采用某种像素相似性度量,比如像素灰度差的绝对值AD,给定左图中的一个点p,在右图中的对应行上(假设输入是已经校正好的图像)搜索与其AD值最小的点q,这样得到的点q就是p在右图中对应的匹配点,p、q的水平坐标差称作视差。然而这种做法所得到的视差图中会包含大量的噪声,即错误的匹配对,原因可能是多方面的,如传感器噪声,左右相机的采集性能差异,图像中存在大面积无纹理、弱纹理或重复纹理,左右相机接收的光照差异(室外环境)等。

一个更好的做法是不直接匹配单个像素,而是匹配像素点所在的区域,这个区域叫做支撑窗口(support window),支撑窗口的尺寸可以是固定的,也可以是自适应变化的。如下式所示,由于支撑窗口内的像素提供了更多的信息,因此可以有效降低匹配歧义。

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_算法

然而使用支撑窗口的做法是存在问题的,实际上它隐性的遵从了一个假定,即窗口内的所有像素具有相同的视差。然而这个假定在很多情况下并不成立,比如:

A. 窗口内的像素与中心像素位于不同的表面;
B. 窗口所捕获的是一个倾斜表面或曲面,即非平行表面(这个平行指的应该是与相机成像平面平行)。
如下图(a)所示,Q点实际上位于一个亚像素的视差平面上,R位于倾斜平面上,S位于一个弧形表面上:


必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_计算机视觉_02


许多研究人员主要关注的是A中所描述的情况,为了解决这种问题,一个比较有效的做法是对窗口内的像素采用自适应权重进行匹配,如下式所示,这样的方法可以很好的避免edge fattening(边缘平滑)问题:

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_人工智能_03

权重计算所使用的方法可以是类似双边滤波的核函数:

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_搜索_04

也可以是基于测地线距离的核函数:

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_算法_05

那么如何解决B中的问题呢?我们知道空间中任意一点都可以认为是在一个唯一的平面上,如下式所示,该平面的参数为

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_迭代_06

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_计算机视觉_07

基于上面的想法,2011年Michael Bleyer 提出了一个相当新颖的立体匹配算法叫PMS,该算法的主要思想是对每一个像素计算一个独立的最优3D视差空间平面,如果该像素位于一个曲面上,那么该平面代表曲面在该像素点处的切面,在这个基础上,用于匹配的支撑窗口就是not fronto-parallel support window,简称slanted support window。这样一来问题的挑战就转移到了如何为每一个像素点在所有可能的视差空间平面中挑选出最优的视差平面。

显然视差平面的数量是无限多的,因此通过遍历所有的视差平面来寻找最优平面是不可能的。Michael Bleyer 找到了一个巧妙的方法解决这个问题,那就是采用Patch Match的思想,Patch Match本身是一个高效求解近似最近邻场(Nearest neighbor filed)的方法,主要包括初始化、空间传播、随机搜索三个步骤。除了Patch Match中的空间传播外,作者还另外提出了视图传播和帧间传播(用于连续的视频帧)能够更好的帮助算法收敛。如下图所示,利用PMS不仅可以直接估计亚像素视差, 还能够精确的重建倾斜表面,甚至能够重建圆形的曲面。

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_算法_08

02

算法

1.模型

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_搜索_09

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_算法_10


必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_迭代_11

2.2迭代

如下图所示,迭代过程中,每一个像素将经历4个阶段:空间传播、视图传播、帧间传播、平面细化,一般先处理左图,然后再处理右图。在偶数次迭代中从左上到右下依次遍历每一个像素,在奇数次迭代中,则顺序相反。

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_计算机视觉_12

2.2.1空间传播(spatial propogation)

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_计算机视觉_13

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_人工智能_14

4.为全局算法构建数据项

全局算法对于遮挡区域和无纹理区域的处理要优于局部算法,所以本文提出的匹配代价还可以应用到全局算法当中,只不过此时将无法在使用连续的视差平面。下图显示了局部算法对于纹理匮乏的图像匹配失败,而全局算法却很好的处理了这种情况。

必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_搜索_15

03

代码实现

代码地址:

https://github.com/fightingcf/patchmatchstereo

04

实验

这里选择了MiddleBurry数据集中图像进行实验,效果如下图,可以看到该算法生成的视差图是稠密的,而且边缘保持的非常好,整体视差精度较高。


必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_搜索_16


必须收藏!双目立体匹配算法:Patch Match Stereo实用详解教程_算法_17

05

总结

1.PMS算法不同于传统的局部算法,它不是直接估计视差,而是估计视差平面,而且利用patch match思想在无限多的视差平面中来推理出最优视差平面。因此它的两个最大的优点是:(1)能够直接计算亚像素视差;(2)能够处理倾斜表面和曲面,这是其他局部算法所不具备的。

2.PMS算法的性能比较有限,虽然在middleburry上表现的确惊艳,但是在处理室外场景时鲁棒性不是特别好,特别是对于较高的图像噪声、大面积的弱纹理或重复纹理等(当然其他的算法也不能很好的处理),其效果一般弱于SGM和ELAS等算法。

3.PMS算法的速度比较慢,因为它的所有处理流程都是顺序性的,不能并行处理,目前已经有一些算法改进了PMS中的传播方式使其能够并行处理,并应用于GPU,这里给出论文名称《Massively Parallel Multiview Stereopsis by Surface Normal Diffusion》。

参考资料:
1.PatchMatch Stereo - Stereo Matching with Slanted Support Windows,Michael Bleyer, Christoph Rhemann, Carsten Rother.
2.Stereo Matching—State-of-the-Art and Research Challeng,Michael Bleyer, Christian Breiteneder.
3.Massively Parallel Multiview Stereopsis by Surface Normal Diffusion, Silvano Galliani, Katrin Lasinger, Konrad Schindler.

本文只做学术分享,如有侵权,联系删除


标签:Stereo,立体匹配,PMS,像素,算法,平面,Patch,窗口,视差
From: https://blog.51cto.com/u_14318213/7641365

相关文章

  • SpringMVC如何在web.xml中配置DispatcherServlet
    SpringMVC如何在web.xml中配置DispatcherServlet配置WEB-INF/web.xml===>配置前端控制器/中央控制器/分发控制器,用户所有的请求都会经过它的处理<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi......
  • Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: com.fa
    报错:Handlerdispatchfailed;nestedexceptionisjava.lang.NoSuchMethodError:com.fasterxml.jackson.databind.ObjectMapper.canSerialize(Ljava/lang/Class;Ljava/util/concurrent/atomic/AtomicReference;)Zjar包冲突,找到对应的jar包删除......
  • 如何给OpenWrt的源码打patch
    如何给OpenWrt的源码打patch目录如何给OpenWrt的源码打patch给package打patch给kernel打patch给package打patchOpenWrt有成熟的打patch机制,可以直接从服务器download源码,校验后,再结合自己开发的patch,打上,然后编译。开发环境:基于Ubuntu14.0432bit主机,编译demo_board机型。需......
  • 阿里云PAI-灵骏大模型训练工具Pai-Megatron-Patch正式开源!
    作者:李鹏,王明,施晨,黄俊导读随着深度学习大语言模型的不断发展,其模型结构和量级在快速演化,依托大模型技术的应用更是层出不穷。对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将大模型消耗的算力发挥出来,还要应对大模型的持续迭代。开发简单易用的大模型训练工具就成了......
  • opatch报补丁时,oui-patch.xml (Permission denied)报错
    前言一套19.19RAC环境,使用opatch工具安装数据库补丁,第一个节点成功安装,但在第二个节点执行opatch命令时报错。主要的错误有提示:/u01/app/oraInventory/ContentsXML/oui-patch.xml(Permissiondenied),具体如下所示。[grid@19crac235074478]$$ORACLE_HOME/OPatch/opatcha......
  • Lnton 羚通视频分析算法平台【OpenCV-Python】教程: Depth Map from Stereo Images 立
    立体图像的深度图(DepthMap)是表示图像中每个像素点距离相机的深度或距离信息的二维灰度图。它提供了场景中物体的三维结构和距离信息,对于三维重建、增强现实、虚拟现实等应用具有重要意义。深度图可以通过以下方式获取:1.双目视觉方法:使用两个相机(左右摄像机)同时拍摄同一场景,通过计......
  • Python中Mock和Patch的区别
    在测试并行开发(TPD)中,代码开发是第一位的。尽管如此,我们还是要写出开发的测试,并执行它们来验证代码的准确性(而不是直接运行代码或使用控制台)。在Python中,我们有一个叫做单元测试的过程,里面有mock和patch函数。这篇文章将讨论这两个角色的用途和区别。Mock和Patch对象库的用途......
  • git不同分支同步代码,打patch补丁
    背景介绍一个代码管理者,不可避免的就是要将别人修改的代码同步到其他分支或其他仓库分支,因为不是所有人都有权限去合并的。合并代码有很多方式,比如直接文件夹覆盖、文件覆盖等。但上面的方法,繁琐还容易出错。写shell脚本也可以实现。这里主要想说,可以把内核打补丁的方法,......
  • [struts2]配置dispatcher INCLUDE和Forward可能问题解决
    Struts2.1.6GA不支持<dispatcher>FORWARD</dispatcher>和<dispatcher>INCLUDE</dispatcher>你要是和URLRewrite过滤器一起工作会报错。目前最新版本GeneralAvailability(GA)Releases-ReadyforPrimeTime!Struts2.1.8("bestavailable")Struts2.0.14(&qu......
  • Django学习小记[4]——URL Dispatcher
    URLdispatcher简单点理解就是根据URL,将请求分发到相应的方法中去处理,它是对URL和View的一个映射,它的实现其实也很简单,就是一个正则匹配的过程,事先定义好正则表达式和该正则表达式对应的view方法,如果请求的URL符合这个正则表达式,那么就分发这个请求到这个view方法中。有了这个bas......