文章目录

  • 立 体 算 法 流 程 介 绍
    • >全局立体匹配算法
    • >局部立体匹配算法
    • >半全局立体匹配算法SGM
  • SGM 算 法 原 理 详 解
    • >深度图初始化
    • >匹配代价计算
    • >代价聚合
    • >视差计算
    • >视差优化
  • tSGM 原 理 介 绍
  • 参 考 文 献 与 代 码 整 体 框 架

立 体 算 法 流 程 介 绍

>全局立体匹配算法

  全局立体匹配算法主要是采用了全局的优化理论方法估计视差,建立全局能量函数,通过最小化全局能量函数得到最优视差值。通过二维相邻像素视差之间的约束(如平滑性约束)而得到更好的匹配效果,但是对内存的占用量大,速度慢不适合实时运行。主要的算法有图割(graph cuts)、置信传播(belief propagation)、动态规划等算法。

>局部立体匹配算法

  主要是采用局部优化方法进行视差值估计,局部立体匹配算法有SAD,SSD等算法,与全局立体匹配算法一样,也是通过能量最小化方法进行视差估计,但是在能量函数中,只有数据向,而没有平滑项。该算法由于每个像素计算互不干扰可以并行计算,所以可以实时。但由于所基于的局部窗口视差相同的假设在很多情况下并不成立导致匹配效果较差。

>半全局立体匹配算法SGM

  综合上述局部和全局算法的优缺点,半全局算法依旧采用全局框架,但是在计算能量函数最小化的步骤时使用高效率的一维路径聚合方法来代替全局算法中的二维最小化算法,使用一维最优来近似二维最优,得到的视差图在效果上和全局算法没有太大的差别,但是算法效率却有非常大的提升。

SGM 算 法 原 理 详 解

>深度图初始化

  深度图初始化主要有两种方法:1.Delaunay三角剖分;2.稀疏点投影到对应帧,得到稀疏深度图,然后三角化,将三角化内平面插值得到完整的深度图。
  1.Delaunay三角剖分
  首先,为什么用Delaunay三角剖分,因为对于给定点云的地形或其他对象建模,Delaunay三角剖分提供了一组很好的三角形,可以用作模型中的多边形。特别是,Delaunay三角剖分避免了狭窄的三角形(因为从面积上相比,它们有较大的外接圆。)下图是非Delaunay三角剖分与Delaunay三角剖分的对比:

  接下来介绍Delaunay三角化的三个重要特性:空圆特性、最大化最小角、对偶性。空圆特性是指点集P的Delaunay三角剖分满足P内任意一个点都不在P内任意一个三角面片的外接圆内。其中任意三个点的外接圆不包含第4个点即任意三个点的外接圆是空的;Delaunay三角剖分中的所有三角形都满足空圆特性;若四边形中的一个三角形不满足空圆特性,则将对角线互换之后构成的新的三角形一定满足空圆特性。空圆特性表现形式如下图所示:

  最大化最小角指的是Delaunay三角剖分最大化三角面片内三角形的最小角,Delaunay三角剖分中所有三角形的内角中最小角大于任何其他剖分的最小角,具体表现形式如下图所示:

  对偶性指的是Delaunay 三角剖分与Voronoi Diagram是互为对偶的关系,关系如下图所示:

  几种Delaunay生成算法时间复杂度的比较如下表所示:
  

  以Bowyer-Waston算法为例简单介绍一下Delaunay三角剖分的原理。Bowyer-Waston算法是一种增量算法,它的工作原理是向所需点子集的有效Delaunay三角剖分添加点,一次添加一个点。每次插入后,其外接圆包含新点的所有三角形都会被删除,留下一个星形多边形孔,然后使用新点重新对其进行三角剖分。通过利用三角剖分的连通性来有效定位要删除的三角形,该算法可以采用时间复杂度为O(N logN)的操作来对N个点进行三角剖分,尽管存在特殊的退化情况,在这种情况下,这会上升到O(N2)。下图是它的图形化解释:

  按我的理解就是说:在依次插入点时有两种情况,情况1就是新加入的点位于三角形内部,假设添加新的点pr,连接prpi,prpj,prpk,分别检查与三角形prpipk,prpjpk,prpipk相邻的三角形的空圆特性,如果不满足空圆特性,则进行翻转(即选择另一条对角线),若pjpk需要翻转,则翻转之后需要对pkpm以及pkpj所在的四边形进行空圆特性检查。情况2就是新加入的点位于一条边上,假设添加新的点pr,连接prpl,prpk,分别检查与三角形prpjpk,prpjpl,prplpi,prpkpi相邻的三角形的空圆特性,如果不满足空圆特性,则进行翻转,若pjpk需要进行翻转,则翻转之后需要对pkpm以及pkpj所在的四边形进行空圆特性检查。

C++代码实现网址:https://github.com/Bl4ckb0ne/delaunay-triangulation,伪代码如下所示:

function BowyerWatson (pointList)// pointList is a set of coordinates defining the points to be triangulatedtriangulation := empty triangle mesh data structureadd super-triangle to triangulation // must be large enough to completely contain all the points in pointListfor each point in pointList do // add all the points one at a time to the triangulationbadTriangles := empty setfor each triangle in triangulation do // first find all the triangles that are no longer valid due to the insertionif point is inside circumcircle of triangleadd triangle to badTrianglespolygon := empty setfor each triangle in badTriangles do // find the boundary of the polygonal holefor each edge in triangle doif edge is not shared by any other triangles in badTrianglesadd edge to polygonfor each triangle in badTriangles do // remove them from the data structureremove triangle from triangulationfor each edge in polygon do // re-triangulate the polygonal holenewTri := form a triangle from edge to pointadd newTri to triangulationfor each triangle in triangulation // done inserting points, now clean upif triangle contains a vertex from original super-triangleremove triangle from triangulationreturn triangulation

  2.稀疏点投影到对应帧,得到稀疏深度图,然后三角化,将三角化内平面插值得到完整的深度图(具体形式如下图所示)

>匹配代价计算

  文献[1]中介绍的SGM的代价计算是基于互信息(Mutual Information,MI)的匹配测度计算算法来计算匹配代价,互信息是一种影像明暗变化不敏感的相关性测度。但由于原理复杂且计算需要迭代效率比较低,在实际应用中,更有效的方法如Census变换,故在此不再介绍MI。
  Census变换主要是使用像素邻域内的局部灰度差异将像素灰度转换为比特串即为census值,基于Census变换的匹配代价计算方法是计算左右影像对应的两个像素的Census变换值得汉明(Hamming)距离(两个比特串得对应位不相同的数量:先进性异或运算,再统计运算结果中1的个数)。

>代价聚合

  采用全局立体匹配算法,即找到每个像素的最优视差使得整体能量最小。能量方程如下:
  
  这是一个二维优化问题,为了提高优化效率,SGM将问题转化为使用一维路径聚合的方式来近似二维最优,提高效率的同时也保证了效果。SGM能量方程公式如下:
  
  式中,C为匹配代价,第二项和第三项是平滑项,我们期望的是视差是连续的。所以如果当前像素xb与邻域像素xN视差相差比较小(1个像素)我们会给一个比较小的惩罚P1,如果大于一个像素则给一个大的惩罚P2,但是实际场景中肯定会有一些视差不连续区域相差比较大(比如:前景和背景),如下图所示:

  为了处理这种情况,我们对P2进行调整,公式如下所示,如果像素和它的邻域像素亮度差很大,那么该像素很可能是位于视差非连续区域,则一定程序上允许其和邻域像素的视差差值超过1个像素,对应超过1个像素的惩罚力度就适当减小一点。
  
  具体求解过程中,SGM路径代价聚合的思路就是将像素所有视差下的匹配代价进行像素周围所有路径上的一维聚合得到路径下的路径代价值,然后将所有路径代价值相加得到该像素聚合后的匹配代价值。一维聚合路径示意图如下所示(图中各个箭头方向就是聚合各个路径):

  某一维路径r代价计算公式如下:
  
  式中Lri(xb,d) < Cmax(xb,d) + P2 ;最终代价值(所有路径之和)为:
  

>视差计算

  代价聚合后,每个像素直接找聚合代价最小对应的视差值就是我们所要求的视差值。

>视差优化

  视差一致性检查
  将左右图互换,得到R-L视差图。与L-R视差图对比,根据左图的视差找到在右图中的对应视差,如果两者小于阈值则认为是准确的,反之是错的把该值剔除。如下图:

  亚像素计算
  上述计算的视差图是像素级别的,在实际使用中精度是无法满足需求的。SGM通过在上述计算的最小代价的视差层附近进行插值找到亚像素级的精度。如下图:

tSGM 原 理 介 绍

  与SGM的区别主要是在代价聚合的时候:1.使用金字塔图像计算视差(由粗糙到精即从低分辨率到高分辨率计算匹配代价);2.每个像素的视差范围都不同,只在真值附近搜索大大减少了搜索范围和内存占用,如下图:

  每个像素的视差范围计算方法:如果当前像素值d(x)无效,搜索窗口win=31,反之win=7;以当前像素为中心,窗口大小win搜索所有有效视差都存储在disps中,disps的大小是numdisp,中值是disp,最大值是max,最小值min:


  3.代价聚合时,SGM由于每个像素视差范围都一样,所以各个搜索路径都有对应的视差,tSGM由于每个像素视差范围不一样有的可能都没有重叠范围,所以之前的代价聚合计算方法需要调整,把没有重合的情况考虑进去。

if d > dmax(xb - ri)Lri(xb,d) = Cri(xb,d) + P2;
if d < dmin(xb - ri)Lri(xb,d) = Cri(xb,d) + P2;
elseLri(xb,d) = SGM

参 考 文 献 与 代 码 整 体 框 架

  参考文献:[1]. Stereo Processing by Semi-global Matching and Mutual Information
       [2]. SURE: Photogrammetric Surface Reconstruction from Imagery
  代码框架:

文章参考:
1.https://en.wikipedia.org/wiki/Bowyer%E2%80%93Watson_algorithm
2.https://blog.csdn.net/electech6/article/details/116233056

基于图像的三维重建——深度图计算方法1-SGM/tSGM(9)相关推荐

  1. 基于图像的三维重建——基于空间patch扩散的方法(PMVS)

    1.PMVS:多视图匹配经典算法简介 导语:常见的稠密重建方法主要有三种:基于体素的方法.基于深度图融合的方法以及基于3D patch扩张的方法.第一种基于体素的方法仅适用于小场景,单个物体,遮挡较少 ...

  2. 基于图像的三维重建研究

    前言 三维重建,顾名思义就是对现实世界中的三维物体用计算机来进行模拟.目前主流的有两种手段:采用红外设备对物体进行测距.基于多张有关待测物体的二维图像进行三维重建.由于前者需要红外设备,成本比较昂贵且 ...

  3. Windows环境下几款优秀的基于图像的三维重建软件

    基于图像的目标三维重建技术是计算机视觉领域中研究的热点,近些年来,涌现了大量的优秀算法,对于目标重建的完整性,准确性,实时性不断提高.本文今天向大家介绍几款可以在window平台下,运行的软件,用户只 ...

  4. 研究生科研必备!!!2015-2020年各类国际会议基于图像的三维重建论文综述(1)——总览

    此文为2015-2020年各类国际会议与期刊基于图像的三维对象重建论文综述的第一部分,总览部分 本文涵盖总结了2015到2020年几百篇国际会议与期刊上的3d-reconstruction文章. 本系 ...

  5. 基于图像的三维重建系统概览

    前言 从2维图像重建3维立体具有重要的研究价值和潜在经济社会价值,其核心技术是图像的密集匹配,从最早的70年代摄影测量领域开始研究图像匹配,至今已有近半个世纪的时间.可以这样说,该问题的研究基础奠定于 ...

  6. 基于图像的三维重建——特征点检测与匹配(2)

    文章目录 前言 一.特征点检测 二阶的拉普拉斯高斯边缘提取算法(LOG) 尺度不变特征变换算法(SIFT) 加速稳健特征算法(SURF) Harris角点特征提取算子 加速分割测试特征提取(FAST) ...

  7. 基于图像的三维重建——三角测量(4)

    文章目录 简介 求解方法 直接线性变换法 RANSAC鲁棒估计 简介 三角测量是根据对应图像位置的集合和已知点的摄像机位置确定一个点的3D位置的问题.当给定相机内外参矩阵时,图像上每个特征点实际上对应 ...

  8. 基于图像的三维重建——稠密重建准备(8)

    文章目录 三 维 重 建 流 程 稠 密 重 建 整 体 框 架 深 度 图 计 算 >代码流程图 >数据准备 >>图像映射 >>邻域帧选择 >>最佳邻 ...

  9. 基于图像的三维重建——对极几何(3)

    文章目录 对极约束 基础矩阵F 基础矩阵性质 基础矩阵求解方法 直接线性变换法 基于RANSAC的鲁棒方法 本征矩阵E 本征矩阵性质 本征矩阵求解 从本征矩阵中恢复相机姿态 单应矩阵H 单应矩阵性质 ...

最新文章

  1. System.Data.SqlClient.SqlException:“ ',' 附近有语法错误。必须声明标量变量 @Password。”
  2. BAD SLAM:捆绑束调整直接RGB-D SLAM
  3. 五、(H3C)基于802.1x+AD+DHCP+NPS动态下发vlan 华三交换机配置
  4. SQLSERVER 查询存储过程内容,主要是通过关键词查询相关的存储过程使用
  5. C++ 对象的内存布局
  6. thinkphp5将时间戳直接转换成时间格式
  7. LookupError: No installed app with label 'user'
  8. 学习《PythonWeb开发实战(董伟明)》中文PDF+源代码
  9. 设计师必备各类型3D字体图层样式PSD素材
  10. python @的作用
  11. 基于 Multiple Teacher Single Student 框架的多领域对话模型
  12. 路由器刷openwrt后不能上网 修改brlan的ip地址失败
  13. 区块链学习笔记(3)--交易机制与双花
  14. eclipse小应用程序||eclipse切换低版本JDK实现JavaAPPlet
  15. 新形势下,企业如何做好数据安全治理?
  16. java毕业设计——基于java+Eclipse+jsp的网上手机销售系统设计与实现(毕业论文+程序源码)——网上手机销售系统
  17. 远程桌面和创建新用户
  18. Mac 安装 homebrew 慢解决方案
  19. python 接口自动化测试王浩然 pdf_7-python接口自动化测试.pdf
  20. python创建一个集合类型的方法是_【Python基础】一文理解Python集合,17个方法全解,看完就够了...

热门文章

  1. 判断是否为平衡二叉树(Java)
  2. linux还原数据库报错,RMAN还原数据库报错问题解决案例
  3. godaddy新建二级域名
  4. php有哪几种运行环境,php有哪些运行环境
  5. java编写篮球比赛计分,android 篮球比赛计分器
  6. 使用webgl绘制一个点
  7. MESH标准配网流程
  8. Java工作4年来应聘要16K最后没要,细节如下。。。
  9. 分析编程题c语言,二级C语言部分上机编程题详细分析
  10. 浅谈软件开发方向之嵌入式