百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

双目立体匹配算法:Patch Match Stereo实用详解教程

bigegpt 2025-02-10 11:27 6 浏览

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

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

01 简介

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

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

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

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

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

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

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

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

基于上面的想法,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不仅可以直接估计亚像素视差, 还能够精确的重建倾斜表面,甚至能够重建圆形的曲面。


02 算法

1.模型

算法的目标是计算每一个像素所在的视差平面

,一旦得到了

,该像素的视差就可以按照下式来计算,其中

是平面

的参数,

是像素

坐标和

坐标。

待求解的视差平面

是在所有可能的平面中使得聚合匹配代价

最小的那一个平面:

其中F表示所有视差平面的集合。由于集合内元素的数目是无限的,所以不可能像传统的局部匹配算法那样,通过检查所有的平面来找到聚合代价最小的那一个平面(传统的局部算法是在一个有限的离散视差空间中进行搜索的)。像素

在视差平面

下的聚合代价是按照下式来计算的:

这里

表示中心位置在p处的矩形窗口。如果应用在视频中,这里的矩形窗口就由2D变成了3D,其中第三维代表前一帧或者后一帧。权重函数

采用了自适应权重,目的是为了降低egde-fattenning问题:

式中

是一个人为指定的参数,

表示像素

和像素

在RGB颜色空间中的

距离。当然,你也可以使用其他的权重函数,只要它能提升效果就行。函数

用来度量待匹配像素对之间的相似性,这里采用的方法是:

在上式中,

是通过

的视差计算出来的,所以

值在一个连续的实数区间内,它的颜色和梯度可以通过近邻像素进行线性插值得到。参数

用于平衡颜色项和梯度项的比重。截断参数

可以增强匹配代价在遮挡区域内的鲁棒性。

2.基于patch match的视差推理

有了以上的铺垫,现在最重要的问题就是如何通过最小化匹配代价来为每一个像素找到一个最优的3D视差平面。这个问题可以通过patch match来解决:首先对所有像素的视差平面进行随机初始化或根据某些先验信息进行初始化,然后基于迭代传播(空间传播、视图传播、帧间传播、平面细化)不断地更新所有像素的平面参数。patch match的优点是只要至少有一个像素的初始化视差平面位于或接近最优平面,就可以找到剩余所有像素的最优平面。

2.1随机初始化

patch match的第一步就是对左右视图的视差平面进行随机初始化,原则上是可以直接对平面

的三个参数

进行随机赋值,但是这样做无法保证在可允许的视差空间中进行均等的采样。因此需要对像素

设定一个视差搜索区间

(注意这个区间是连续的),然后从该区间中随机挑选一个视差值

作为该像素的初始视差,这样就得到了视差空间中的一个点

,有了点P,只要再得到一个单位法向量

就能计算出平面参数:

如果想要使用fronto-parallel window,可以将法向量设定为

,如果想关闭亚像素估计,可以将

限制在离散的整数范围内取值。

f

2.2迭代

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

2.2.1空间传播(spatial propogation)

空间传播的思想基础是在位置上相邻的像素一般具有相近的视差。设当前像素

的视差平面为

其邻域像素

的视差平面为

,若

,则将像素

的视差平面

赋予像素

,在偶数次迭代中,

的左侧和上侧的像素,在奇数次迭代中,

的右侧和下侧的像素。

2.2.2视图传播(view propogation)

视图传播的思想基础是左(右)图中的像素点与右(左)图中的对应匹配点应当具有相同的视差平面。设左(右)图像素

的视差平面为

其在右(左)图中的对应像素

的视差平面为

,若

,则将像素

的视差平面

赋予像素。

2.2.3帧间传播(temporal propogation)

帧间传播主要用于视频序列中,其思想基础是当前帧的像素

与其相邻帧的像素

的坐标相同,那么它们应当拥有相近的视差平面。很明显这个假设在帧率较高的视频中是成立的。设当前帧像素

视差平面为

,其前一帧或后一帧的像素

的视差平面为

,若

,则将像素

的视差平面赋予像素。

2.2.4平面细化(plane refinement)

平面细化的目的是通过更新像素

的视差平面

进一步降低匹配代价。由于平面

可以由一个点

和一个法向量

表示,所以平面的更新可以通过点坐标和法向量的更新来得到。设

的最大允许变化量为

的最大允许变化量为

,然后从

中随机选择一项数值

来计算

,从

随机选择三项数值来计算法向量

式中

用于将向量归一化为单位向量,这样就得到了一个新的平面

,若

,则将视差平面

赋予像素

,即

这一步需要经过多次迭代才能完成,初始时设定

,然后每次迭代完后,将

,直到

迭代停止。假如像素当前的视差平面是完全错误的,初次迭代使用较大的搜索范围就有可能将其转移到正确平面附近,之后的迭代中不断的缩小搜索范围,使得视差平面在当前平面附近捕获视差细节,能够适用于弧形表面。

后处理部分首先对左右视差图执行左右一致性检验,在小于设定阈值的情况下该视差点就会被设定为无效点,然后进行填充。填充的方法是搜索无效点左侧最近邻和右侧最近邻的有效像素点,设它们的视差平面分别为

,选择其中视差较小的那一个平面赋给当前无效点。之所以选择小的那一个是因为无效点多为遮挡区域的点,而遮挡区域往往处于背景之中。这样的缺点就是容易导致视差图中产生水平条纹,为了减轻水平条纹,可以对视差做加权中值滤波,滤波核的参数

与匹配阶段所使用的参数相同。

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

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

03 代码实现

代码地址:

https://github.com/fightingcf/patchmatchstereo

04 实验

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


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.

分享计算机视觉2D/3D标注工具

标注工具是处理原始数据的第一关,无论是检测任务、分割任务还是3D感知、点云等,都需要制作真值来监督网络学习。企业级的标注方案一般通过内部的自研工具或专业标注团队完成,而对于个人或小的团队来说,一款开源好用的标注工具则至关重要,自动驾驶之心为大家汇总了领域常用到的标注工具,涉及2D检测分割/3D检测分割以及多传感器的标定同步。

检测分割标定

1.Labelme

项目地址:https://github.com/wkentaro/labelme

主要支持:

  • 多边形分割、语义分割、2D框、线标注、点标注(可用于目标检测,图像分割等任务)
  • 视频标注

标注保存文件为JSON、VOC与COCO格式等;

2.LabelImg

项目地址:https://github.com/heartexlabs/labelImg

标注保存文件有三种可选:PASCAL VOC、YOLO、CreateML,只支持目标检测任务的数据标注。

3.CVAT

项目地址:https://github.com/openvinotoolkit/cvat

免费在线交互式视频和图像分割标注工具;

4.VOTT

项目地址https://github.com/microsoft/VoTT

微软发布的一款基于JavaScript开发用于图像目标检测的标注工具,使用React+Redux进行开发,支持Windows和Linux平台运行。软件还提供了基于CNTK训练的faster-rcnn模型进行自动标注然后人工矫正的方式,能大幅减轻标注所需的工作量。


5.EISeg

EISeg(Efficient Interactive Segmentation)基于飞桨开发的一个高效智能的交互式分割标注软件。它涵盖了通用、人像、遥感、医疗、视频等不同方向的高质量交互式分割模型。另外,将EISeg获取到的标注应用到PaddleSeg提供的其他分割模型进行训练,便可得到定制化场景的高精度模型,打通分割任务从数据标注到模型训练及预测的全流程。

老版本

https://github.com/PaddleCV-SIG/EISeg

新版本:https://github.com/PaddlePaddle/PaddleSeg/tree/release/2.6/EISeg

主要特点:

  • 高效的半自动标注工具,已上线多个Top标注平台
  • 覆盖遥感、医疗、视频、3D医疗等众多垂类场景
  • 多平台兼容,简单易用,支持多类别标签管理

img

6.RITM

三星开源交互标定工具RITM:https://github.com/saic-vul/ritm_interactive_segmentation

用于基于点击的交互式分割,该模型使用了预训练推理模型输出的分割掩码,它不仅可以分割一个全新的对象,还可以从外部mask开始并对其进行校正;

多传感器标定

1.OpenCalib

项目地址:https://github.com/PJLab-ADG/SensorsCalibration

商汤开源的工具包,支持camera、lidar、imu、radar之间的标定:

标定工具支持棋盘格、圆形、方形等方式!

3D检测标定

1.point-cloud-annotation-tool

项目地址:https://github.com/springzfx/point-cloud-annotation-tool

主要用于标定3D点云中目标的box信息,支持导出KITTI格式和Apollo 3D格式!

2.annotate

项目地址:https://github.com/Earthwings/annotate

基于ROS框架标定,生成3D检测框,xyz和whl信息;

3.3D BAT

项目地址:https://github.com/walzimmer/3d-bat

可以用于标定汽车、卡车、摩托车、自从车、行人等3D目标,支持任何大于10个点的目标标注!

4.SUSTechPOINTS

项目地址:https://github.com/naurril/SUSTechPOINTS

主要支持:

  • 9自由度框编辑
  • 对象类型/ID/属性编辑
  • 交互式/自动长方体拟合
  • 批处理模式编辑
  • 透视/投影视图编辑
  • 多个摄像头图像,可自动切换摄像头
  • 点云数据的二进制/pcd文件
  • Jpg/png图像文件
  • 对象/框/点着色
  • 聚焦模式,隐藏背景,轻松查看细节
  • 流播放/停止
  • 对象ID生成

3D点云分割标定

1.semantic-segmentation-editor

项目地址:https://github.com/Hitachi-Automotive-And-Industry-Lab/semantic-segmentation-editor

基于web的一款工具,支持图像和点云格式,用于2D和3D数据的分割标注!

相关推荐

【Docker 新手入门指南】第十章:Dockerfile

Dockerfile是Docker镜像构建的核心配置文件,通过预定义的指令集实现镜像的自动化构建。以下从核心概念、指令详解、最佳实践三方面展开说明,帮助你系统掌握Dockerfile的使用逻...

Windows下最简单的ESP8266_ROTS_ESP-IDF环境搭建与腾讯云SDK编译

前言其实也没啥可说的,只是我感觉ESP-IDF对新手来说很不友好,很容易踩坑,尤其是对业余DIY爱好者搭建环境非常困难,即使有官方文档,或者网上的其他文档,但是还是很容易踩坑,多研究,记住两点就行了,...

python虚拟环境迁移(python虚拟环境conda)

主机A的虚拟环境向主机B迁移。前提条件:主机A和主机B已经安装了virtualenv1.主机A操作如下虚拟环境目录:venv进入虚拟环境:sourcevenv/bin/active(1)记录虚拟环...

Python爬虫进阶教程(二):线程、协程

简介线程线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能...

基于网络安全的Docker逃逸(docker)

如何判断当前机器是否为Docker容器环境Metasploit中的checkcontainer模块、(判断是否为虚拟机,checkvm模块)搭配学习教程1.检查根目录下是否存在.dockerenv文...

Python编程语言被纳入浙江高考,小学生都开始学了

今年9月份开始的新学期,浙江省三到九年级信息技术课将同步替换新教材。其中,新初二将新增Python编程课程内容。新高一信息技术编程语言由VB替换为Python,大数据、人工智能、程序设计与算法按照教材...

CentOS 7下安装Python 3.10的完整过程

1.安装相应的编译工具yum-ygroupinstall"Developmenttools"yum-yinstallzlib-develbzip2-develope...

如何在Ubuntu 20.04上部署Odoo 14

Odoo是世界上最受欢迎的多合一商务软件。它提供了一系列业务应用程序,包括CRM,网站,电子商务,计费,会计,制造,仓库,项目管理,库存等等,所有这些都无缝集成在一起。Odoo可以通过几种不同的方式进...

Ubuntu 系统安装 PyTorch 全流程指南

当前环境:Ubuntu22.04,显卡为GeForceRTX3080Ti1、下载显卡驱动驱动网站:https://www.nvidia.com/en-us/drivers/根据自己的显卡型号和...

spark+python环境搭建(python 环境搭建)

最近项目需要用到spark大数据相关技术,周末有空spark环境搭起来...目标spark,python运行环境部署在linux服务器个人通过vscode开发通过远程python解释器执行代码准备...

centos7.9安装最新python-3.11.1(centos安装python环境)

centos7.9安装最新python-3.11.1centos7.9默认安装的是python-2.7.5版本,安全扫描时会有很多漏洞,比如:Python命令注入漏洞(CVE-2015-2010...

Linux系统下,五大步骤安装Python

一、下载Python包网上教程大多是通过官方地址进行下载Python的,但由于国内网络环境问题,会导致下载很慢,所以这里建议通过国内镜像进行下载例如:淘宝镜像http://npm.taobao.or...

centos7上安装python3(centos7安装python3.7.2一键脚本)

centos7上默认安装的是python2,要使用python3则需要自行下载源码编译安装。1.安装依赖yum-ygroupinstall"Developmenttools"...

利用本地数据通过微调方式训练 本地DeepSeek-R1 蒸馏模型

网络上相应的教程基本都基于LLaMA-Factory进行,本文章主要顺着相应的教程一步步实现大模型的微调和训练。训练环境:可自行定义,mac、linux或者window之类的均可以,本文以ma...

【法器篇】天啦噜,库崩了没备份(天啦噜是什么意思?)

背景数据库没有做备份,一天突然由于断电或其他原因导致无法启动了,且设置了innodb_force_recovery=6都无法启动,里面的数据怎么才能恢复出来?本例采用解析建表语句+表空间传输的方式进行...