You are on page 1of 84

《视觉几何三维重建:从入门到精通》课程手册

---OpenMVS原理详解 + 逐行源码解析
该内容是公众号 计算机视觉life 旗下课程《视觉几何三维重建:从入门到精通》第2期 的课件编纂成的课程
手册。

说明:本课程注释源码会持续更新在https://github.com/electech6/openMVS_comments

修订时间:2021年9月6日

扫描一下,系统学习视觉/激光/多传感器融合SLAM、三维重建等精品课程:

 
《视觉几何三维重建:从入门到精通》课程手册
---OpenMVS原理详解 + 逐行源码解析
1. 三维重建与OpenMVS简介
1.1 什么是三维重建?
1.1.1 三维重建定义
1.1.2 三维重建分类
1.1.3 三维重建应用
1.2 基于MVS(Multi-View Stereo)重建简介
1.2.1 位姿计算
1.2.1 经典开源框架
1.3 OpenMVS特点
1.4 OpenMVS算法流程
1.5 OpenMVS安装使用教程
1.5.1 源码与注释代码地址
1.5.2 依赖项与安装工具说明
1.5.3 Linux 编译
1.5.4可能存在的编译问题
1.5.5 使用说明
1.6 常用的3D显示软件简介
1.7 常见的三维数据格式
2. 立体视觉基础知识
2.1 3D基础概念
2.1.1 深度图(depth)/视差图(disparity)
2.1.2 三维点云(point cloud)
2.1.3 三维网格(mesh)
2.1.4 纹理贴图模型(texture mesh)
2.2 齐次坐标,刚体变换
2.3 图像坐标系,相机坐标系,世界坐标系
2.4 相机投影模型(针孔相机模型)
2.5 对极几何
2.6 三角测量与极线校正
2.7 视差图转深度图
2.8 立体匹配
2.8.1 全局立体匹配算法
2.8.2 局部立体匹配算法
2.8.3 半全局立体匹配算法SGM
3. 稠密重建
3.1 数据准备
3.1.1 邻域帧选择
3.1.2 全局最佳邻域帧选择
3.2 深度图计算算法1: SGM/tSGM(Semi-Global Matching)
3.2.1 算法流程介绍:
3.2.2 SGM算法原理详解
3.2.2.1 深度图初始化
3.2.2.2 匹配代价计算
3.2.2.3 代价聚合
3.2.2.4 视差计算
3.2.2.5 视差优化
3.2.3 tSGM原理介绍
3.2.4 参考文献与代码整体框架
3.3 深度图计算方法2-PatchMatch
3.3.1 深度计算流程
3.3.2 PatchMatch算法详解
3.3.2.1 深度图初始化
3.3.2.2 patch初始化
3.3.2.3 深度图传播优化
3.3.2.4 深度图优化
3.3.3 参考文献与代码框架
3.4 深度图融合
3.5 SGM与PatchMatch对比思考
4. 曲面重建
4.1 四面体网格(Delaunay Tetrahedralization)介绍
4.2 最小割/最大流(Minimum Cut/Max Flow)
4.3 三维曲面重建
5. Mesh Refinement
5.1 什么是Mesh Refinement
5.2 Mesh预处理
5.3 Refinement通用框架介绍
5.4 OpenMVS中使用的refine框架介绍
5.5 光度一致性梯度推导
6. 纹理贴图
6.1 原理介绍
6.1.1 基础知识
6.1.2 Face View的选择
马尔可夫随机场
马尔可夫随机场在视觉中的应用(多标签(labeling)问题)
马尔可夫随机场能量优化问题求解(给每个结点选择一个最优标签)
利用LBP求解face的最优视图view算法步骤
6.1.3 纹理Patch的构建
6.1.4 全局纹理接缝颜色校正(Global Seam Leveling)
6.1.5 局部纹理接缝颜色校正(Local Seam Leveling)
6.1.6 纹理图(Texture Atlas)生成
6.2 代码框架
6.2.1 代码流程图
7. 三维重建拓展1-基于RGBD重建
7.1 RGBD的获取
7.2 经典开源框架
7.2.1 KinectFusion
7.2.2 BundleFusion
8. 三维重建拓展2-基于深度学习的重建
8.1 单帧图像重建Mesh
8.1.1 人脸重建
8.1.1.1 3DMM重建简介
8.1.1.2 基于3DMM重建-Nonlinear 3D Face Morphable Model
8.1.1.3 基于3DMM重建-2DASL
8.1.1.4 端到端重建-PRNet
8.2 基于深度学习的Depth Estimate(MVS)
8.2.1 MVS(Multi-View Stereo)-经典深度学习开源框架
8.2.2 MVSNet
8.2.3 JDACS-MS
8.2.4 PatchMatchNet
8.3 深度图相关评测网站
8.4 SOTA论文
8.5 数据集网站集合
1. 三维重建与OpenMVS简介
1.1 什么是三维重建?
1.1.1 三维重建定义

用相机拍摄真实世界的物体、场景,并通过计算机视觉技术进行处理,从而得到物体的三维模型。英文
术语:3D Reconstruction。

涉及的主要技术有:多视图立体几何、深度图估计、点云处理、网格重建和优化、纹理贴图、马尔科夫
随机场、图割等。

三维重建是计算机辅助几何设计(CAGD)、计算机图形学(CG)、计算机动画、计算机视觉、医学图像处
理、科学计算和增强现实(AR)、混合现实(MR)、机器人导航、自动驾驶等领域的共性科学问题和
核心技术。

1.1.2 三维重建分类

三维重建主要分为主动式测量和被动式测量。

被动式

被动式一般利用周围环境如自然光的反射,使用相机获取图像,然后通过特定算法计算得到物体的立体
空间信息。主要有SFS(Shape From Shading,从阴影恢复形状)和立体视觉方法等。

SFS

图像的阴影边界包含了图像的轮廓特征信息,因此能够利用不同光照条件下的图像的明暗程度与
阴影来计算物体表面的深度信息,并以反射光照模型进行三维重建。阴影恢复形状法的应用范围
比较广泛,可以恢复除镜面外的各种物体的三维模型。缺点体现在过程多为数学计算、重建结果
不够精细,另外不能忽视的是,SFS法需要准确的光源参数,包括位置与方向信息。这就导致其无
法应用于诸如露天场景等具有复杂光线的情形中。

立体视觉

主要是分为双目立体视觉(Binocular Stereo Vision)和多视立体视觉(Multi-View Stereo,


MVS)前者可以看作是后者的特例。

双目立体视觉:利用成像设备从不同的位置获取被测物体的两幅图像,对它们进行立体校
正,然后基于视差原理,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方
法。双目立体视觉融合两只眼睛获得的图像并观察它们之间的差别,使我们可以获得明显的
深度感,建立特征间的对应关系,将同一空间物理点在不同图像中的映像点对应起来,这个
差别,我们称作视差(Disparity)图像。
多视立体视觉(Multi-View Stereo,MVS):从一系列图像中重建3D模型即基于RGB的建
模(刚体重建),mvs算法可以仅根据图像重建出精细的三维模型。它能取一组可能非常大
的图像,然后构造一个准确的3D几何模型,主要是基于一些合理的假设比如场景的刚性。

主动式

激光三角法

利用三角形几何关系求得距离。先由扫描仪发射激光到物体表面,利用在基线另一端的CCD相机
接收物体反射信号,记录入射光与反射光的夹角,已知激光光源与CCD之间的基线长度,由三角
形几何关系推求出扫描仪与物体之间的距离。为了保证扫描信息的完整性,许多扫描仪扫描范围
只有几米到数十米。这种类型的三维激光扫描系统主要应用于工业测量和逆向工程重建中。它可
以达到亚毫米级的精度。

结构光原理

结构光是由一个投影仪以及CCD相机组成,用投影仪投射出固定的编码的光栅到被测物体上,
CCD相机根据光栅的变化来计算出物体的空间位置(X,Y,Z)坐标,进而获取物体表面轮廓数据。
时间飞行(TOF)法

传感器发出类似红外线的光,遇到物体反射后,传感器通过计算机光线发射和反射的时间相位
差,来换算被测物体距离,以产生深度信息,再结合传统相机获物体表面的轮廓。

1.1.3 三维重建应用

影像娱乐

智能家居
文物重建、AR旅游

自动驾驶

大场景三维重建
逆向工程

机器人导航

1.2 基于MVS(Multi-View Stereo)重建简介

从一系列图像中重建3D模型即基于RGB的建模(刚体重建)。主要分为两大部分:SFM(Structure-from-
Motion )/Slam(Simultaneous Localization and Mapping ) 、 MVS ,前者是根据采集的图像进行位姿计
算,后者根据前面的图像和位姿进行三维重建。本小节SFM以Colmap为例进行简单介绍,MVS以OpenMVS
为例在后续章节详细介绍,也是我们整个文档的重点内容。
1.2.1 位姿计算

参考:https://link.zhihu.com/?target=https%3A//github.com/colmap/colmap

1.2.1 经典开源框架

位姿计算:

COLMAP, MVE, OpenMVG, Slam等;

MVS:

COLMAP, MVE, PMVS, SMVS, OpenMVS等;

经典必读论文:
综述:Multi-View Stereo: A Tutorial[1]

MVS开源框架测评:
Tanks and Temples: Benchmarking Large-Scale Scene Reconstruction[2]

1.3 OpenMVS特点

OpenMVS是一个比较经典的MVS(Multi-View Stereo)开源库,集成三维重建整个完整的技术方案(相
机模型,多视立体几何,稠密重建,曲面重建,点云融合,纹理贴图)。在每个重建环节使用的都是非
常经典有效的算法,例如包含目前三维重建非常经典有效的深度图重建算法SGM,PatchMatch。综合
重建效果和性能,目前MVS是所有开源库中最好的。
该框架还涉及Graph Cut、MRF、泊松融合等比较经典的通用算法原理与代码实现,以及常见的点云
后处理和网格后处理(去噪、细分,去非流形,补洞)等图形学相关算法。
综合来说,OpenMVS非常适合入门系统学习和二次开发。代码框架非常完善,代码实现清晰且规范,
可快速提高项目实战经验。学习三维重建必备。

1.4 OpenMVS算法流程
1.5 OpenMVS安装使用教程
1.5.1 源码与注释代码地址

源码:https://github.com/cdcseacave/openMVS
注释代码:https://github.com/electech6/openMVS_comments

1.5.2 依赖项与安装工具说明

OpenMVS 依赖的几个开源库,有两个是可选的可以先不安装.

Eigen version 3.2 (or higher on Windows only)


OpenCV version 2.4 or higher
Ceres version 1.10 or higher (可选)
CGAL version 4.2 or higher
Boost version 1.56 or higher
VCG
GLFW(可选)

工具:

CMake
git
C/C++ compiler like Visual Studio or GCC

1.5.3 Linux 编译

Ubuntu 16.04

#准备一个空闲的机器安装:
sudo apt-get update -qq && sudo apt-get install -qq
sudo apt-get -y install git cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa-
dev

#安装Eigen (必需)
git clone https://gitlab.com/libeigen/eigen.git --branch 3.2
mkdir eigen_build && cd eigen_build
cmake . ../eigen
make && sudo make install
cd ..

#安装Boost (必需)
sudo apt-get -y install libboost-iostreams-dev libboost-program-options-dev
libboost-system-dev libboost-serialization-dev

#安装OpenCV (必需)
sudo apt-get -y install libopencv-dev

#安装CGAL (必需)
sudo apt-get -y install libcgal-dev libcgal-qt5-dev

#安装VCGLib (必需)
git clone https://github.com/cdcseacave/VCG.git vcglib

#安装Ceres (可选)
sudo apt-get -y install libatlas-base-dev libsuitesparse-dev
git clone https://ceres-solver.googlesource.com/ceres-solver ceres-solver
mkdir ceres_build && cd ceres_build
cmake . ../ceres-solver/ -DMINIGLOG=ON -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
make -j2 && sudo make install
cd ..

#安装GLFW3 (可选)
sudo apt-get -y install freeglut3-dev libglew-dev libglfw3-dev

#安装OpenMVS
git clone https://github.com/electech6/openMVS_comments.git openMVS
mkdir openMVS_build && cd openMVS_build
cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="/path to vcglib/vcglib"

#如果想生成共享库,可以在cmake加如下命令:
#-DBUILD_SHARED_LIBS=ON

#生成 OpenMVS 库文件:


sudo make -j2 && sudo make install

1.5.4可能存在的编译问题

1. opencv中部分函数未定义
先卸载:

sudo apt-get autoremove opencv-doc opencv-data libopencv-dev libopencv2.4-java


libopencv2.4-jni python-opencv libopencv-core2.4 libopencv-gpu2.4 libopencv-
ts2.4 libopencv-photo2.4 libopencv-contrib2.4 libopencv-imgproc2.4 libopencv-
superres2.4 libopencv-stitching2.4 libopencv-ocl2.4 libopencv-legacy2.4
libopencv-ml2.4 libopencv-video2.4 libopencv-videostab2.4 libopencv-
objdetect2.4 libopencv-calib3d2.4

再源码安装,可以安装比如4.1.1版本。

2. boost报错
解决方法:升级boost==1.6.3

3. 如果出现如下错误
解决办法:可能你安装的依赖库版本太高了需要降一下。推荐cgal4.11 boost1.65

1.5.5 使用说明

OpenMVS 可执行文件生成在 openMVS/openMVS_build/bin/ 里面,在 openMVS_build 文件夹下打开终端,


按照顺序执行如下命令:(-w 设置的是数据的路径,-i 是输入的文件名,-o是输出的文件名)。

注意:colmap/openmvg计算的位姿可以通过作者提供的InterfaceCOLMAP,InterfaceVisualSFM转成稠密
重建输入的*.mvs文件。这里我们主要关注mvs重建过程,未给位姿这个配置介绍(后面如果大家有需求可
以补充)。大家先根据提供的数据测试。

1. 稠密重建

./bin/DensifyPointCloud -w /home/**/data/openMVS_sample -i scene.mvs -o


test_dense.mvs

输出log:
得到的稠密点云test_dense.ply:

2. 曲面重建

./bin/ReconstructMesh -w /home/data -i test_dense.mvs -o test_mesh.mvs

输出的log :
生成的网格模型test_mesh.ply:

 
3. 网格优化

./bin/RefineMesh -w /home/data -i test_mesh.mvs -o test_refinemesh.mvs

输出的log :
优化的模型test_refinemesh.ply:

4. 纹理贴图

./bin/TextureMesh -w /home/data -i test_refinemesh.mvs -o test_texture.mvs

输出的log:
输出的结果 test_texture.ply test_texture.png:

1.6 常用的3D显示软件简介

MeshLab: https://www.meshlab.net/

查看重建模型结果方式:打开meshlab,将3D 模型文件(obj,ply)直接拖进去即可。(更多操作
说明见课程视频演示)

1.7 常见的三维数据格式

支持的常见三维数据格式:obj,ply,stl(用于3D打印)

Obj中标志位:

v :几何体顶点(Geometric vertices) vt :贴图坐标点(Texture vertices)


vn :顶点法线(Vertex normal) f : 面 (Face)
obj与ply文件具体内容示例
2. 立体视觉基础知识
2.1 3D基础概念
2.1.1 深度图(depth)/视差图(disparity)

a.深度图:场景中每个点到相机的距离

视差图:同一个场景在两个相机下成像的像素的位置偏差dis

b.两者关系:depth=bf/dis

c. 是三维信息的一种表示方式

2.1.2 三维点云(point cloud)

a.三维点云是某个坐标系下的点的数据集

b.包含了丰富的信息,包括三维坐标XYZ、颜色RGB等信息

2.1.3 三维网格(mesh)

a.由物体的邻接点云构成的多边形组成的

b.通常由三角形、四边形或者其它的简单凸多边形组成
2.1.4 纹理贴图模型(texture mesh)

a.带有颜色信息的三维网格模型

b.所有的颜色信息存储在一张纹理图上,显示时根据每个网格的纹理坐标和对应的纹理图进行渲染得到高分
辨率的彩色模型

2.2 齐次坐标,刚体变换

齐次坐标

用n+1维矢量表示n维矢量,主要用途是可以方便矩阵运算。(参考下式)

刚体变换
假设欧式空间中一点P,在两个坐标系中的坐标分别为 和 ,那么图中变换公
式:

即:

用齐次坐标表示:

刚性物体无论位置和方向发生变换还是在不同坐标系下观察同一个物体,它的形状和大小都保持
不变;
3个旋转3个平移共6个自由度;

用途:
计算一个刚体经过旋转和平移后的新坐标
计算同一刚体在不同坐标系下的坐标。

2.3 图像坐标系,相机坐标系,世界坐标系

图像坐标系
上图中, 是表示以像素为单位的图像坐标系的坐标, 是以mm为单位的图像坐标系的坐
标, 是相机光轴与图像的交点其对应的像素坐标 ,每个像素在 轴和 轴对应的物理尺寸
。两者转换关系如下:

用矩阵的表示形式:

逆关系:

相机与世界坐标系

为相机光心, 轴与图像的 轴平行, 轴为相机光轴与相机图像平面垂直交点就是图像坐标原


点。 与 组成的直角坐标系为相机坐标系, 为焦距。

世界坐标系与相机坐标系转换关系:

式中 为3x3的正交单位矩阵, 为三维平移向量, , 为4x4矩阵。

2.4 相机投影模型(针孔相机模型)
把图像平面放到针孔前方(数学上等价,计算更简单):

当已知图像点p时,由针孔成像模型,任何位于射线OP上的空间点的图像点都是p点,因此空间点不是唯一
确定的。

投影关系(从世界坐标系到图像坐标系)

称为归一化焦距, 只与相机内部参数有关,被称为相机内参; 由相机相对世界坐


标系的方位决定,被称为相机外参。确定相机内外参数被称为相机标定。

2.5 对极几何

对极几何实际上是“两幅图像之间的对极几何”,它是图像平面与以基线为轴的平面束的交的几何(这里的基
线是指连接摄像机中心的直线)。
在对极几何中:匹配点之间的关系是可以通过如下计算得到具体参考:https://zhuanlan.zhihu.com/p/798
45576

极点 :极点:右相机坐标原点在左像平面上的像;极点:左相机坐标原点在右像平面上的像
极平面 :由两个相机坐标原点、和物点 组成的平面

极线 :极平面与两个像平面的交线
极线约束:给定图像上的一个特征,它在另一幅图像上的匹配视图一定在对应的极线上,即已知 则
它对应在右图的匹配点一定在极线 上反之亦然。

极线约束给出了对应点重要的约束条件,它将对应点匹配从整幅图像中查找压缩到一条线上查找,大大
减小了搜索范围,对对应点的匹配起指导作用。
2.6 三角测量与极线校正

三角测量

假设我们两台摄像机像平面精准位于同一平面上,且行对齐,两个光轴严格平行。

利用三角形关系我们很容易推出Z值:

如果主点 坐标相同则可简化为:

因为视差 ,且 为我们的深度值 ,故:

视差与深度图关系:

视差与深度成反比,视差接近0时,微小的视差变化会产生较大的深度变化
当视差较大时,微小的视差变化几乎不会引起深度多大的变化

因此,立体视觉系统仅物体距离相机较近时具有较高的深度精度

极线校正
校正过程:将相机在数学上对准到同一观察平面上,使得相机上像素行是严格对齐的
校正目的:对两幅图像的二维匹配搜索变成一维,节省计算量,排除虚假匹配点
校正算法:

为了将摄相机极点变换到无穷远使得极线水平对准,我们创建一个旋转矩阵,首先是 轴的旋
转,我们将 轴旋转到与基线相同的方向即旋转后新 轴就是 ,旋转向量:

确定旋转后的新 轴,只需满足与 正交即可:选则与主光轴和 相交的方向:

新的 轴,与 垂直且满足右手定则:

最终得到的旋转矩阵:

新的旋转矩阵:

校正后,baseline 计算:
下式中 是指右相机光心在左相机坐标系下的坐标(也等于与右相机光心[0,0,0]的距离), 求解公式
的意义是左相机光心在右相机校正后的坐标系下的坐标(也等于与右相机校正后的坐标系下光心[0,0,0]
的距离)。故baseline就是 轴方向的距离。

2.7 视差图转深度图

视差图是校正后的坐标系下得到的值,首先将其转换为校正后坐标系下的深度图

已知:

则:

把上式写成矩阵形式:

式中 定义如下:

将校正后的坐标系下深度图转换到校正前的相机坐标系下

已知:校正前的相机坐标系下坐标 转到校正后相机坐标系下坐标 转换关系如下:

则已知校正后的求校正前的公式如下:
再将其投影到图像坐标系下:

即:

将上两步合并得到校正后坐标系下的视差图( ) 与校正前的坐标系下的深度图

的转换矩阵

已知:

则:

2.8 立体匹配

三维重建的核心就是立体匹配。通过寻找匹配点,利用三角测量或对极约束得到其在空间中的3D信息。立体
匹配算法主要分为全局、局部、半全局。

2.8.1 全局立体匹配算法

全局立体匹配算法主要是采用了全局的优化理论方法估计视差,建立全局能量函数,通过最小化全局
能量函数得到最优视差值

通过二维相邻像素视差之间的约束(如平滑性约束)而得到更好的匹配效果,但是对内存的占用 量
大,速度慢不适合实时运行。主要的算法有图割(graph cuts)、信念传播(belief propagation)、动态
规划等算法。

2.8.2 局部立体匹配算法

主要是采用局部优化方法进行视差值估计,局部立体匹配算法有 SAD,SSD 等算法,与全局立体匹配


算法一样,也是通过能量最小化方法进行视差估计,但是在能量函数中,只有数据项,而没有平滑项。

该算法由于每个像素计算互不干扰可以并行计算,所以可以实时。但由于所基于的局部窗口视差相同的
假设在很多情况下并不成立导致匹配效果较差。
2.8.3 半全局立体匹配算法SGM

综合上述局部和全局算法的优缺点,半全局算法依旧采用全局框架,但是在计算能量函数最小化的步骤
时使用高效率的一维路径聚合方法来代替全局算法中的二维最小化算法,使用一维最优来近似二维最优,得
到的视差图在效果上和全局算法没有太大的差别,但是算法效率却有非常大的提升。
3. 稠密重建
稠密重建即深度图重建或深度估计(depth estimate)是重建流程中第一个环节,也是三维重建中最关键的
环节。在传统算法中比较经典实用的两个算法是PlanSweeping和PatchMatch两种算法。在平面Sweeping
算法中用的比较多的是SGM算法。OpenMVS框架实现这两种算法,可以通过参数控制测试这两种算法的效
果对比。我们这章节主要讲SGM和PatchMatch两种算法的具体实现。

OpenMVS 中实现的SGM是通过对图像做校正,在视差层面下进行计算的(匹配关系由上面的三角测量转
换),视差图可以与深度图相互转换。该算法也可不用对图像校正直接计算深度图(匹配关系由上面提到的
对极约束来转换)。PatchMatch是直接计算深度图。

3.1 数据准备

OpenMVS输入是图像和对应的相机内参和外参,在数据准备阶段第一步是剔除无效的、未标定的、被废弃
的图像;第二步是给每个参考图像选择所有有用的邻域帧,这个邻域帧就是我们用来做匹配的帧,合适的选
择策略可以提升重建效果所以这步非常重要;最后就是基于马尔科夫随机场(MRF)优化,为每个参考图像
选择一个全局最佳的邻域视图。

3.1.1 邻域帧选择

选择策略:共视点 在两个图像 的夹角 , 在两个图像中分辨率的相似性 , 在两个图像中覆盖的


面积最小值 ,分数计算如下式:

思考1:选择这三个条件的原因?

a.两个view的靠的越近,越不能提供一个足够大的baseline来重建高精度模型,因此,通过共视点夹角
来间接判断两个view的baseline是否足够大;

b.两个图像的分辨率如果差别比较大,立体匹配时是有问题的。所以选择邻域帧,与当前帧分辨率是否
一致也是一个重要的因素;
c.重建时,图像的分辨率越高重建的效果越好,故以共视点覆盖的图像面积也作为重要参考条件。
思考2:第一个参数计算公式 如何理解?

角度阈值 默认10,角度低于这个值分数越低,2次方目的是为增强角度下降带来的影响。这个公式
中并没有对角度远大于10做限制,原因是特征点计算时已经对大角度处理过了,角度比较大时是没有
共视特征点的。

参考论文Multi-View Stereo for Community Photo Collections

3.1.2 全局最佳邻域帧选择

在我们上一步计算中,每张图像都选出 个邻域帧,我们现在需要给每张图像选择一个最佳邻域
来求解深度图。故现在求解的问题是:

每个view(node)都有n个邻域(label),优化目标是给每个node选择一个label使得整体能量最小。这
个label就是我们最终给每个view分配的最佳邻域帧。这个问题就是马尔科夫随机场的labeling问题(能量优
化问题),其原理我们后续在纹理贴图讲解给每个face选最佳view的时候统一介绍,本节只介绍如何调用。

这个能量最小优化问题能量函数构造如下:

Markov Random Field能量函数:

公式中 是标签(label), 是节点(node)。

:之前计算的score,用平均score归一化后的值

:惩罚两个node的label相同的情况即不鼓励任意两个的view的邻域相同。

求解方案:

方案一: TRW:Tree-reweighted Message Passing

方案二: BP:Belief Propagation

参考论文: convergent tree-reweighted message passing for energy minimization

3.2 深度图计算算法1: SGM/tSGM(Semi-Global Matching)


3.2.1 算法流程介绍:

1. 深度图初始化
2. 匹配代价计算
3. 代价聚合
4. 视差图获取
5. 视差图优化后处理

3.2.2 SGM算法原理详解

3.2.2.1 深度图初始化

a. Delaunay 三角化

Delaunay 三角化是一种三角化方法。具有如下性质:

网格中的最小角最大化;

任意三角形的外接圆内不含三角形以外的顶点;

三角化的网格是点云的凸包;

最大化所有三角面片的内切圆的平均值;
....

参考原理:https://en.wikipedia.org/wiki/Bowyer%E2%80%93Watson_algorithm

代码实现:

c++: https://github.com/Bl4ckb0ne/delaunay-triangulation

python: from scipy.spatial import Delaunay

b.稀疏点投影到对应帧,得到稀疏深度图,然后三角化,将三角化内平面插值得到完整的深度图。
3.2.2.2 匹配代价计算

文献[1]中介绍的SGM的代价计算是基于互信息(Mutual Information,MI)的匹配测度计算算法来计算匹
配代价,互信息是一种对影像明暗变化不敏感的相关性测度。但由于原理复杂且计算需要迭代效率比较低,
在实际应用中,更简单有效的方法如Census变换,故在此不再介绍MI。

Census变换:

1.使用像素邻域内的局部灰度差异将像素灰度转换为比特串即为census值

2.基于Census变换的匹配代价计算方法是计算左右影像对应的两个像素的Census变换值的汉明
(Hamming)距离(两个比特串的对应位不相同的数量:先进行异或运算,再统计运算结果中1的个数)

3.2.2.3 代价聚合

采用全局立体匹配算法,即找到每个像素的最优视差使得整体能量最小。能量方程如下:

这是一个二维优化问题,为了提高优化效率,SGM将问题转化为使用一维路径聚合的方式来近似二维
最优,提高效率的同时也保证了效果。

SGM能量方程如下公式:

式中, 为匹配代价,第二项和第三项是平滑项,我们期望的是视差是连续的。所以如果当前像素 与
邻域像素 视差相差比较小(1个像素)我们会给一个比较小的惩罚 ,如果大于一个像素则给一个大
的惩罚 。但是实际场景中肯定会有一些视差不连续区域相差比较大(比如:前景和背景)如图示:

为了处理这种情况,我们对 进行调整:

思考:为什么这样调整第二个惩罚项?

如果像素和它的邻域像素亮度差很大,那么该像素很可能是位于视差非连续区域,则一定 程度上允
许其和邻域像素的视差差值超过1个像素,对于超过1个像素的惩罚力度就适当减 小一点。
具体求解过程中,SGM路径代价聚合的思路:

将像素所有视差下的匹配代价进行像素周围所有路径上的一维聚合得到路径下的路径代价值,然
后将所有路径代价值相加得到该像素聚合后的匹配代价值。

一维聚合路径示意图(图中各个箭头方向就是聚合各个路径):

某一维路径 代价计算公式如下:

式子中

则最终代价值(所有路径之和):

3.2.2.4 视差计算

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

3.2.2.5 视差优化

视差一致性检查

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

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

与SGM的区别主要是在代价聚合的时候:

1.使用金字塔图像计算视差(由粗糙到精细即从低分辨率到高分辨率计算匹配代价)

2.每个像素的视差范围都不同,只在真值附近搜索大大减少搜索范围和内存占用,如下图

每个像素的视差范围计算方法:

如果当前像素的视差值 无效,在搜索窗口 =31, 反之 =7

以当前像素为中心,窗口大小 搜索所有有效视差存储在 中, 的大小是 ,中值是 ,


最大值 ,最小值 :

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

参考文献:[1]. Stereo Processing by Semi-global Matching and Mutual Information

[2]. SURE: Photogrammetric Surface Reconstruction from Imagery

代码框架:

图像校正 1.StereoRectifyImages

稀疏点初始化depth 2.TriangulatePoints2DepthMap depth转视差图 Depth2DisparityMap

计算每个像素的视差搜索范围 3.Disparity2RangeMap

sgm.match

立体匹配求视差 4.Match 代价计算 census计算/WZNCC 聚合 Ld

视差一致性检查 5.ConsistencyCrossCheck

亚像素视差计算 6.RefineDisparityMap

3.3 深度图计算方法2-PatchMatch

PatchMatch算法原理:

以下图为例, 是一对图像的中心, 是 上的一个像素点,在该点的 上找到一个平面使


得与邻域帧 的聚合代价最小,这个平面( )就是我们要重建的曲面的切平面。
3.3.1 深度计算流程

1. 深度图初始化
2. Patch初始化
3. 深度图传播优化
4. 深度图获取与优化

3.3.2 PatchMatch算法详解

3.3.2.1 深度图初始化

与SGM中深度图初始化一致,不再赘述。

3.3.2.2 patch初始化

利用上述初始化的深度图,我们初始化每个像素的patch平面(用3D点 和法向量 表示, )。


以下图为例,平面是在相机坐标系下就是曲面的切平面。

平面参数 计算方式:

式中, 是相机内参, 是像素点坐标, 是 点的深度图


法向量 计算:

上式中,是用以 为中心的球坐标系计算。

代价计算时,减少计算量的小技巧推导:
3.3.2.3 深度图传播优化

迭代传播是重头戏,它的基本思想是把初始的所有视差平面中的正确的视差平面传播至同一视差平面内的其
他像素。算法执行多次迭代,每次迭代执行四个步骤:(1)空间传播(Spatial Propagation)(2)视图传
播(View Propagation)(3)时序传播(Temporal Propagation)。偶数次迭代,从图像左上角像素沿行
方向传播至右下角像素;奇数次迭代则和偶数次迭代传播顺序相反,即从右下角像素沿行方向传播至左上角
像素。

1.空间传播:相邻像素很可能在同一平面,查找当前像素 的邻域像素 的平面 是否更适合p。如果


) 则把 作为 的新平面。在偶次迭代时, 是 的左上边像素,奇数次迭代时, 是 的
右下方像素。

2.视图传播: 在邻域帧对应位置的像素 '的平面一般应该是比较相似的。所以把 的平面转换到当前帧下


比较, 是否小于 ,若是,则替换当前平面。

3.时序传播

视频序列相邻两帧同一位置在同一个平面的可能性比较大。所以也可以比较下取代价更小的作为 的平面。

4.随机分配

在每次传播后,对当前像素的平面在一定范围内随机生成一个调整量( ) ,找代价最小的那个

平面。可以加快找找到真实的平面。

传播过程中,判断当前像素的平面如果是邻域像素的patch平面匹配代价是否更小,计算使用邻域平面时当
前像素的位置对应的深度代码推导:
3.3.2.4 深度图优化

深度一致性检查:判断图像I与邻域的共视区域的深度是否一致

实现方法:把图像 中的点 ,投影到世界坐标系下,反投影到对应邻域帧 上.

得到深度值 ,与邻域帧 上的深度 进行比较如果与至少k个邻域的深度比较接近则认为p


点是个正确点。
3.3.3 参考文献与代码框架

参考文献:[1].Accurate Multiple View 3D Reconstruction Using Patch-Based Stereo for Large-


Scale Scenes.

[2].PatchMatch Stereo - Stereo Matching with Slanted Support Windows

代码框架:

三角网格划分 TriangulatePointsDelaunay

depth初始化 1.InitDepthMap 三角网格划分插值 TriangulatePoints2DepthMap

patch准备 PreparePixelPatch 栅格化插值 RasterizeTriangle

3.EstimateDepthMap confidence初始化 2.ScoreDepthMapTmp patch计算 FillPixelPatch

confidence计算 ScorePixel 计算匹配代价 ScorePixelImage

深度图迭代传播优化 3.EstimateDepthMapTmp 传播优化 ProcessPixel

3.4 深度图融合

与refine一样计算 ,如果 ,则 在 是被挡住的点,从 的深度图中删除该点,


如 。如果 ,则 在 是重复的点如 ,也将其从 的深度图中删除。其它情况
保留其深度如 。
3.5 SGM与PatchMatch对比思考

思考:PatchMatch相对之前的SGM,Plane Sweeping等方法精度更高的原因?

大多深度重建算法代价匹配时,使用的是非常经典的窗口模型:Fronto-parallel windows(如下图
示),它的含义是立体相机正前方与极线校正后的像平面平行的窗口,同时也和校正正后每个相机的相
机坐标系Z轴垂直。特点是窗口内所有点的深度是一样的,这种场景实际很少见。基于此,学者们探究
出新的窗口模型Slanted Support Windows,该倾斜窗口更加贴合重建的曲面,更加符合常见的各种
场景。

Fronto-parallel windows基于整像素视差,而Slanted support windows基于子像素视差。如Q点,局


部表面的视差值不是整数值,如果是Fronto-parallel windows模型,只能匹配整像素视差(Fronto-
parallel windows一般采用一元二次拟合来得到子像素精度),而Slanted support windows直接使用
亚像素位置的窗口,可以更好的贴合Q处的表面。
4. 曲面重建
4.1 四面体网格(Delaunay Tetrahedralization)介绍

主要参考文档https://doc.cgal.org/latest/Triangulation_3/index.html

定义:四面体网格划分是将点云的凸包分割成四面体,四面体的顶点就是点云的所有点。四面体就是指
由四个不共面的点组成的几何形状。

常用术语:

由上图左一所示,一个四面体(cell)组成:四个顶点(vertex),四个面(face),6个边
(edge)。多个四面体间的关系是要么不相交,要么共享一个共同的facet(2 face)、edge或
vertex。

为了处理四面体,以一个辅助顶点(无限远)作为第四个顶点infinite vertex,与凸包上的面连接得
到一个新的四面体被称为 infinite cell ,这样,每个面恰好与两个cell相关联,凸壳边界上的特殊
情况很容易处理。

4.2 最小割/最大流(Minimum Cut/Max Flow)

参考论文:Interactive Graph Cuts for Optimal Boundary & Region Segmentation of Objects in N-
D Images

最小割算法(Minimum Cut)是图像分割的经典算法之一,常在"Graph Cut"算法中被使用。最小割最


大流算法是指在一个有向的图中,能够从源点(source)到达汇点(terminal)的最大流量等于如果
从图中剪除就能够导致网络流中断的边的集合的最小容量和。即在任何网络中,最大流的值等于最小割
的容量。

以论文中的图像分割为例,上图中边的粗细代表能量(权重)大小,图c中虚线切割的边的能量(权
重)之和是最小的。

最小割

如下图1所示,是一个有向带权图,共有4个顶点和5条边。每条边上的箭头代表了边的方向,每
条边上的数字代表了边的权重。
图论中对图的表示方式,其中V表示顶点(vertex)所构成的集合,E表示边(edge)所构成的集合。顶
点V的集合和边的集合E构成了图G(graph)

以上图为例,图中顶点s表示源点(source),顶点t表示终点(terminal),从源点s到终点t共有3条路
径:
s -> a -> t

s -> b -> t

s -> a -> b-> t

现在要求剪短图中的某几条边,使得不存在从s到t的路径,并且保证所减的边的权重和最小。解
答:剪掉边”s -> a”和边”b -> t”。

图中已经不存在从源点到终点的路径,所割掉的边的权重值之和为5,是所有的切割方式中权重值
最小的,像这样的切割方法我们将其称之为最小割。

最大流

如图所示,假如顶点s源源不断有水流出,边的权重代表该边允许通过的最大水流量,顶点t流入
的水流量最大是多少?

我们可以从顶点s到顶点t的3条路径着手分析,从源点s到终点t共有3条路径:
s -> a -> t:流量被边”s -> a”限制,最大流量为2

s -> b -> t:流量被边”b -> t”限制,最大流量为3

s -> a -> b-> t:边”s -> a”的流量已经被其他路径占满,没有流量

所以,顶点t能够流入的最大水流量为:2 + 3 = 5。

这就是最大流问题。所以,图1的最大流为:2 + 3 = 5。
可以发现图中的最小割和最大流都为5,经过数学证明可以知道,图的最小割问题可以转换为最大
流问题。

通常使用graph-cut求解最小割最大流问题。用的比较多的是 Yuri Boykov and Vladimir


Kolmogorov 在2004年提出的一种基于增广路径的求解最大流最小割的算法An Experimental
Comparison of Min-Cut/Max-Flow Algorithms for Energy Minimization in Vision,作者也提供
了源码http://vision.csd.uwo.ca/code/maxflow-v3.01.zip。网上也有有很多相关源码实现
https://vision.cs.uwaterloo.ca/code/

4.3 三维曲面重建

参考文献:
[1]Multi-View Reconstruction Preserving Weakly-Supported Surfaces,

[2]Exploiting Visibility Information in Surface Reconstruction to Preserve Weakly Supported


Surfaces

原理简介

旨在根据每个点的可视信息,采用上述Delaunay Tetrahedralization和graph-cut算法不仅重建出
正常部分曲面,更能重建Weakly-Supported(下图绿色部分) 曲面。该算法的核心是通过检测
Weakly-Supported Surfaces对t-edges 进行调整,重建正确曲面。

利用Delaunay Tetrahedralization和graph-cut算法重建曲面原理是:如下图所示,我们将所有点
划分成四面体网格,通过每个点的可视信息计算每个cell的权重s-t,利用最小割方法找到权重最
小的分割面(face)这些face就是我们要重建的曲面。即:

最小割:s(source)表示曲面外面,t(sink)表示曲面内部。node是四面体(cell),edge是两个
cell共享的那个三角面。cut的有向边(从标记为s的node到标记为t的node)就是重建的
surface。

Weakly Supported Surfaces理论

Weakly Supported Surfaces介绍:


若支持的曲面指的是下图中绿色区域,直观讲就是曲面上点云比较少的部分,通常重建时由
于遮挡或者深度恢复等原因有些曲面恢复的点的确会比较少,常规的重建算法比如泊松重建
都是基于点云拟合得到。
如果点比较少,很难恢复有效的曲面。所以作者在论文中提出了在上述基本方法的基础之上
恢复这些稀疏点表示的曲面部分。

Weakly Supported Surfaces检测

采用的方法是,如下图最后一个图(与上图对应)所示,每个区域的数字表示多少个相机能
看到论文中也称Free-space support。

虚线圆圈是遮挡区域,我们可以通过Free-space support的跳变(由非0到0的变化)来找到
遮挡区域(Weakly Supported Surfaces)。

Mesh重建算法步骤

代码框架

 
CGAL::spatial_sort

四面体网格划分 delaunay

delaunay.insert

DenseReconstruction 权重计算 infoCells

曲面提取 graph

算法步骤

四面体网格划分

重建过程是逐点插入的,插入过程中我们会计算每个顶点在每个view上的权重αvis,这个值反
映的是输入点云在点的γ范围内的点的个数。

权重s计算

每个edge 被cam-point分割的所有点的 权重和,权重是根据距离该点的距离计算的,越


靠近权重越小。

t计算

在cam-point方向上位于point后面一段 距离上的四面体其t值加

调整t的值,用来重建Weakly Supported Surfaces


如果不调整t的值,因为:

根据最小割原理:

所在的面是最小能量。所以重建的面是橙色部分,显然是不符合的。所以我们可以先检测出弱支持
曲面。方法是检测Free-space support的跳变,代码中实现的方法主要是参考文献[2]。

跳变检测方法:

首先计算两个参数:

如果 &&

graph-cut求解最小割即重建曲面
5. Mesh Refinement
5.1 什么是Mesh Refinement

提升重建的三维模型效果

实现的方法

光度一致性

Laplace正则项

轮廓线约束
5.2 Mesh预处理

mesh中如何判断点在边界?

one-ring :相邻一圈。p的one-ring中 face、顶点指图中标识部分四个面五个顶点。

找边界点,如果点不在在边界则它的one-ring的所有点[p1-p5],在遍历[f1-f5]的所有点时,这些
点都应该被访问两次(例如,p4点会被f4,f3访问)。反之在边界如下图,p4,p2只会分别被f4,f1
访问,只有一次。

代码实现
mesh的网格细分功能
网格细分策略:判断每个face是否需要被细分,如果需要则在其(红色三角面)三个边中点(黄
色点)插入新点,则该face被分成四个,与它共享边的三个face各变成两个(绿色是新增的边)

三角形内一点的重心坐标定义

给定三角形的三点坐标A, B, C,该平面内一点 可以写成这三点坐标的线性组合形式:

用克拉默法则求解线性方程组:

克拉默法则
Face的法线计算

积分图计算

对于一幅灰度图像,积分图像中的任意一点(x,y)的值是指从图像的左上角到这个点的所构成的矩
形区域内所有的点的灰度值之和:I表示积分图像,G表示原始图像。则 I(x,y)=sum(G(i,j)),其中
0<=i<=x,0<=j<=y.
 

5.3 Refinement通用框架介绍

网格优化算法是通过最小化在网格模型上所定义的目标函数,来调整模型上每个顶点 的位置。

数据项

主要是基于光度一致性测量
正则项

保证mesh的平滑
可选项
轮廓一致性测量
主要是保证mesh与轮廓保持一致
目标函数求解

梯度下降法通常是最优化的方法,其中每个顶点在每次迭代中的移动
是由目标函数的梯度决定的
假设 是mesh上的顶点,目标函数梯度计算如下:

实际计算过程中,光度一致性项的梯度不会根据 分别计算三次,而是只是沿着顶点法线方向计
算一次,光度一致性梯度是投影到法线上的,节省计算量。另一方面是因为有时候 会正交于
曲面,所以只用其在法向量方向的投影。

利用梯度下降法迭代优化直至收敛

参考论文
https://carlos-hernandez.org/papers/hernandez_cviu04.pdf
http://fcv2011.ulsan.ac.kr/files/announcement/441/PAMI-2012%20High%20Accuracy%20an
d%20Visibility-Consistent%20Dense%20Multiview%20Stereo.pdf

 
5.4 OpenMVS中使用的refine框架介绍

目标函数

对上述目标函数用梯度下降法进行优化。
光度一致性测量
采用NCC(Normalized Cross Correlation)简化版

拉普拉斯正则化

上式子中, 是 的邻域, 是拉普拉斯, 是Bi-Laplacian, 是权重。

5.5 光度一致性梯度推导

迭代优化过程:

正则项直接利用Laplace。光度一致性的梯度推导如下:

根据链式法则
推导第一项

已知:

令: ,

则:

对 求导:

第二项

该项就是计算图像的xy两个方向的梯度

第三项

顶点 投影到图像 上的相机坐标是 ,像素坐标是 则投影关系如下:

矩阵形式:

将上述合并成投影矩阵形式:

将上述矩阵展开:
令 则:

将上式求导结果写成矩阵形式:

最终在顶点上的调整量:
6. 纹理贴图
6.1 原理介绍
6.1.1 基础知识

彩色纹理网格模型

分两类,一类是彩色顶点网格,一类是彩色贴图网格

彩色顶点网格:网格顶点带有颜色,三角形的颜色由网格顶点颜色插值得到。网格的色彩分
辨率等于顶点分辨率。如下图上所示。

彩色贴图网格:网格的三角形的颜色对应于图像的一个三角片。网格的色彩分辨率等于图像
的色彩分辨率。如下图下所示。

纹理贴图是彩色贴图网格的生成技术,指将2D 图像映射到3D几何模型上,形成物体的色彩信息,如下
图。

纹理贴图关键技术
一是给每个三角面选择合适的视图;

二是由于不同视角下图像的亮暗程度不一样且位姿可能有偏差导致网格的纹理贴图在不同图片之间,也
还会有一些色差,因此需要做颜色融合,消除这些色差。如下图:
颜色校正分为局部校正和全局校正:

贴图制作

主要是计算网格顶点和图像像素的对应,简称点像对应。有了网格,图片以及点像对应信息,就可以制
作出纹理贴图,如下图所示。网格的三角形颜色信息直接存储到纹理贴图上,纹理贴图可以看作是原始
图片剪碎后组合到一块得到的。

点像对应的计算

点像对应是指网格顶点和图像像素的对应。大致可以分为下面几类:

图片是随意拍摄的,或者丢失了图像和网格的关系信息。这类情况需要用户手动创建点像对应信
息。比如一些半自动的方法,用户手动选择一些特征点的对应,程序自动计算出其它部分的点像
对应;
网格和图片有相机参数对应,可以通过相机参数来计算对应关系;
网格对应的点云有点像对应,可以通过投影的方式把点云的点像对应投影到网格上。
文献:Let There Be Color!Large-Scale Texturing of 3D Reconstructions:

https://www.gcc.tu-darmstadt.de/media/gcc/papers/Waechter-2014-LTB.pdf

6.1.2 Face View的选择

马尔可夫随机场

通俗解释:

马尔可夫随机场(Markov Random Field)包含两层意思。

马尔可夫性质:它指的是一个随机变量序列按时间先后关系依次排开的时候,第N+1时刻的分布
特性,与N时刻以前的随机变量的取值无关。拿天气来打个比方。如果我们假定天气是马尔可夫
的,其意思就是我们假设今天的天气仅仅与昨天的天气存在概率上的关联,而与前天及前天以前
的天气没有关系。其它如传染病和谣言的传播规律,就是马尔可夫的。
随机场:当给每一个位置中按照某种分布随机赋予相空间的一个值之后,其全体就叫做随机场。
我们不妨拿种地来打个比方。其中有两个概念:位置(site),相空间(phase space)。“位置”
好比是一亩亩农田;“相空间”好比是种的各种庄稼。我们可以给不同的地种上不同的庄稼,这就
好比给随机场的每个“位置”,赋予相空间里不同的值。所以,俗气点说,随机场就是在哪块地里
种什么庄稼的事情。
马尔可夫随机场:拿种地打比方,如果任何一块地里种的庄稼的种类仅仅与它邻近的地里种的庄
稼的种类有关,与其它地方的庄稼的种类无关,那么这些地里种的庄稼的集合,就是一个马尔可
夫随机场。

马尔可夫随机场在视觉中的应用(多标签(labeling)问题)

马尔可夫随机场解决labeling问题 :当前状态只与上一个有关与上上及上上其它没有关系。在图像中可以
理解为只与邻域有关系与邻域之外的其它像素相互独立。

经典应用是图像分割:从聚类角度讲,就是一个图像聚类问题,把具有相同性质的像素点设置为一类。
也就是一个标签分类问题,比如把一副图像分割成4类,那么每一个像素点必定属于这四类中的某一
类,假设四类为1,2,3,4类,那么分割就是给每个像素点找一个标签类。

立体匹配(把每个视差层看作一个label,寻找最佳label使得全局代价最小)

马尔可夫随机场能量优化问题求解(给每个结点选择一个最优标签)

多labeling问题求解目标是给每个节点分配一个最佳标签使得全局代价最小。
基本概念

边缘概率:
BP(Belief Propagation)

置信度传播算法利用结点与结点之间相互传递信息而更新当前整个MRF的标记状态,是基于MRF的一
种近似计算。该算法是一种迭代的方法,可以解决概率图模型概率推断问题,而且所有信息的传播可以
并行实现。经过多次迭代后,所有结点的置信度不再发生变化,就称此时每一个结点的标记即为最优标
记,MRF也达到了收敛状态。对于无环环路的MRF,BP算法可以收敛到其最优解。
BP算法的两个关键过程:(1)通过加权乘积计算所有的局部消息;(2)节点之间概率消息在随机场
中的传递。

原文链接:https://blog.csdn.net/aspirinvagrant/article/details/40862237

通俗解释
原文链接:http://blog.csdn.net/qq_23947237/article/details/78385110

http://blog.csdn.net/qq_23947237/article/details/78387894
https://blog.csdn.net/qq_23947237/article/details/78389188

 
利用LBP求解face的最优视图view算法步骤

我们用在给face选择最佳视图上,结点是face,label是视图的id。核心是将概率计算转换为能量最小化计算。

MRF图
MRF公式

式中:变量Y和X分别为观察节点和隐藏节点,i为face索引,j为节点 的邻近节点。参考上面的MRF
图。

能量函数基本上总结了给定face Y和一些label(视图)X的代价值。目标是找到产生最小代价的label X(每


个face有一个最佳视图)。能量函数包含:数据代价和平滑代价。

DataCost

每个节点(face)datacost 是用face投影到图像上图像梯度幅值表示的
SmoothCost

采用potts模型:节点间的平滑约束是用相邻label尽可能一致实现的,如果label相同且不为0则
cost=0,其它为一个常量。

用LBP求解上述MRF能量函数(参考:http://nghiaho.com/?page_id=1366#LBP)

具体如何解能量函数呢?我们可以使用蛮力并尝试所有的组合吗?让我们看看假如我们的mesh有10000
个face,每个face能被6个视图看到,这就给了我们6^10000组合…嗯,我的量子计算机在哪里?所以找
精确解是不可能的,但如果我们能找到近似解,那我们就很幸运了。loop belief propagation (LBP)算
法是众多能找到MRF近似解的算法之一(Graph cut, ICM…)。
最初的信念传播算法是Pearl(https://www.aaai.org/Papers/AAAI/1982/AAAI82-032.pdf)在1988年
提出的,该算法可以应用于一般的图,那些包含循环的图,因此名字中有“loopy”。然而,并不能保证
收敛。

LBP是一种消息传递算法。只有在接收到所有传入消息,不包括从目标节点到自身的消息( )
后,节点才会将消息传递给相邻节点。下面显示了一个从 传递到 的消息示例。节点 等待节点
A、B、C、D的消息,然后再将消息发送给节点 。提醒一下,它不会将消息从 发送。

算法步骤

消息messages初始化
前面我提到过,节点在发送之前必须等待所有传入的消息。这在带有循环的图上就有点像鸡
生蛋还是蛋生鸡的问题,因为从技术上讲,每个节点都将永远等待,没有任何东西会被发
送。为了解决这个问题,我们将所有消息初始化为某个常量,为所有节点提供它们需要处理
的传入消息。初始化常数通常是0或1,这取决于所选择的能量公式。

迭代:消息在MRF周围传递,消息messages更新

消息更新算法:Min-Sum – message update 。最小和是一个最小化问题,因为我们试图找


到最小的成本,最小和更新如下所示:

归一化

The belief for min-sum

6.1.3 纹理Patch的构建
6.1.4 全局纹理接缝颜色校正(Global Seam Leveling)

算法步骤:

求解每个顶点的校正量

式中 指的是顶点的颜色值, 是顶点颜色校正量。公式中第一项确保调整后的颜色到接缝的左
边 和它的右边 尽可能相似。第二项最小化在同一个patch中相邻顶点的
颜色调整量;

将上述优化函数写成矩阵形式:

式中 是2式中的 , 是稀疏矩阵,值是 ±1,用来从 取正确的 和


求解:

故 是稀疏对称半正定矩阵。故3式是大于0的,对3式求导找0值点得到的 就是我们
要求解的值。求导结果如下:

上式就是我们常见的 ,用 中的共轭梯度法求解 。关于共轭梯度法参考博客:http


s://zhuanlan.zhihu.com/p/178461470或者别的

求解过程中细节补充:

以上图为示例, , 的计算是从接缝的相邻两顶点 插值得到

关于稀疏矩阵 , ,假设我们模型就是上图中,有6个顶点,分成两个patch。则A为例
推导如下:
矩阵 的推导同 大家自行推导。

同一个patch中每个face覆盖的纹理区域内的颜色校正值根据重心坐标从三个顶点的校正值上进行
插值得到。进而得到所有patch的颜色校正值;
将校正值应用到纹理patch上,完成全局颜色校正。

6.1.5 局部纹理接缝颜色校正(Local Seam Leveling)

泊松融合原理

论文:[Poisson Image Editing]https://www.cs.jhu.edu/~misha/Fall07/Papers/Perez03.pdf

泊松融合方程推导参考:

https://zhuanlan.zhihu.com/p/68349210
https://blog.csdn.net/u011534057/article/details/68922319

原理简介

泊松图像处理不仅可以用于图像融合,还可以用于风格迁移、插入透明物体、局部亮度/颜色调制
等。我们本次主要讲图像的融合效果如下图:
泊松方程

在满足一定边界的条件下让待求解二维函数 在区域 中的梯度场与参考梯度场 尽可能相似,边


界条件就是函数值 在边界上与目标图像 的的取值相等,这就是所谓的狄利克雷边界条件。用
数学方式表示就是:

则可得泊松方程:

是散度,即梯度的梯度。

离散形式求解
纹理贴图中泊松融合

由于全局融合并不能消除局部接缝,因此我们需要对接缝处附近进行颜色校正使得patch间过渡自然,
我们使用泊松融合来消除接缝差异,跟上述唯一不同的是我们不会校正整个patch的颜色值而是在边界
往里选一个mask区域(下图浅蓝色区域)仅校正这部分图像的颜色。所以我们边界有两个(深蓝色,
红色)。其余计算与上述相同。

深蓝色是patch边界其颜色值取左右两patch的颜色均值,边界顶点,取包含其所有patch在该点颜色均
值。泊松融合时,边界条件是深蓝色和红色边界。这两个边界的颜色值是锁定的,只调整蓝色区域。

 
6.1.6 纹理图(Texture Atlas)生成

6.2 代码框架
6.2.1 代码流程图

1.提取每个点包含的faces ListVertexFaces

2.提取每个face能看到的所有视图 ListCameraFaces

给每个face选择一个view FaceViewSelection 3.构建无向图 Graph

4.计算最优view LBPInference

5.计算texture patch TexturePatch

TextureMesh

1.接缝处顶点和边的计算 CreateSeamVertices

2.全局纹理颜色校正 GlobalSeamLeveling

生成纹理图 GenerateTexture

3.局部纹理颜色校正 LocalSeamLeveling 泊松融合 PoissonBlending

4.生成纹理图集 textureDiffuse

代码讲解示意图

纹理patch:

 
7. 三维重建拓展1-基于RGBD重建
基于RGBD重建一般指对直接获取的RGB信息和对于深度信息Depth进行曲面重建,与我们前面不同的是深
度信息是通过结构光,TOF等获取的,是主动式测量。我们无需像MVS那样先计算位姿再计算深度图然后重
建,RGBD是直接进行曲面重建,位姿计算是包含在曲面重建过程中的。当然MVS也可以得到稠密重建的结
果即Depth后使用RGBD的算法进行曲面重建。

7.1 RGBD的获取

可以获取RGBD信息的我们一般称为深度相机即RGB-D Camera。

深度相机(RGB-D Camera ):可以直接获取被测对象的三维信息(深度图)的相机。

深度相机主要分为结构光和ToF:目前比较主流的就是ToF相机,以Kinect为例Kinect v1是采用结构光方
案,Kinect v2采用ToF方案。

7.2 经典开源框架

最经典的RGB-D重建算法即为帝国理工的Newcombe等人在2011年提出的KinectFusion。

后续有Kintinuous,ElasticFusion,ElasticReconstruction,DynamicFusion,InfiniTAM,
BundleFusion等
综述:State of the Art on 3D Reconstruction with RGB‐D Cameras

KinectFusion:

BundleFusion:
7.2.1 KinectFusion

不足:

位姿漂移

内存占用大

KinectFusion: Real-time dense surface mapping and tracking

7.2.2 BundleFusion

特点

GPU实时鲁棒跟踪

解决漂移现象

去除时域根据依赖

无需loop closure检测
输入

帧之间对应关系匹配

Local+Global分层优化
动态更新

Bundlefusion: Real-time globally consistent 3d reconstruction using on-the-fly surface


reintegration
8. 三维重建拓展2-基于深度学习的重建
8.1 单帧图像重建Mesh
8.1.1 人脸重建

传统的3DMM是从2D人脸图像的3D人脸扫描中学习的,并由两组PCA基函数表示。由于训练数据的类型和
数量,以及线性基础,3DMM的表示能力是有限的。所以提出了Nonlinear-3DMM,更好地表达人脸信息。

端到端3D人脸重建方法,是近年新起的方法;它们绕开像3DMM的人脸模型,设计自己的3D人脸表示方
法,采用CNN结构进行直接回归,端到端地重建3D人脸。

基于3DMM重建
Nonlinear 3D Face Morphable Model,

On Learning 3D Face Morphable Model from In-the-wild Images,

2DASL…

端到端重建
VRNet, PRNet…

8.1.1.1 3DMM重建简介

3DMM是从2D人脸图像的3D人脸扫描中学习的,并由两组PCA基函数表示。

3DMM(3D Morphable Model)可形变模型:任意一张人脸图像都可根据如下公式重建;

常用模型:Basel Face Model(BFM),Surrey Face Model(SFM), Large Scale Facial Model (LSFM)。

8.1.1.2 基于3DMM重建-Nonlinear 3D Face Morphable Model

在不采集三维人脸扫描数据的情况下,从大量无约束的人脸图像中学习非线性3DMM模型。在给定人脸图像
作为输入的情况下,网络编码器估计投影、形状和纹理参数。两个解码器作为非线性3DMM分别从形状和纹
理参数映射到三维形状和纹理。利用投影参数、三维形状和纹理,设计了一种新的解析可微绘制层来重建原
始输入人脸。整个网络是端到端培训,只有薄弱的监督。
特点

1.学习了一个非线性3DMM模型,它比传统的线性模型具有更大的表示能力;

2.弱监督学习:利用大量没有三维扫描的二维图像,共同学习模型和模型拟合算法。

网络结构

3D Face Reconstruction from A Single Image Assisted by 2D Face Images in the Wild

8.1.1.3 基于3DMM重建-2DASL

最新的方法通常旨在学习基于CNN的3D人脸模型,该模型从2D图像中回归3D可变形模型(3DMM)的系
数,以呈现3D人脸重建或稠密的人脸对齐。然而,由于三维标注训练数据的不足,极大地限制了这些方法的
性能。为了解决这一问题,本文提出了一种新的二维辅助自监督学习(2DASL)方法,该方法可以有效地利
用具有噪声路标信息的二维人脸图像,从而大大提高三维人脸模型的学习效率。具体来说,2DSAL以稀疏的
二维人脸标志为补充信息,提出了四种新的自监督方案,将二维标志和三维标志的预测看作是一个自映射过
程,包括二维和三维标志的自预测一致性、二维标志预测的周期一致性和二维标志预测的自评性基于地标预
测的3DMM系数预测。使用这四种自监督方案,2DASL方法显著地减轻了对传统的成对2D-to-3D注释的要
求,并且在不需要任何额外3D注释的情况下,给出了更高质量的3D人脸模型。

网络结构:自监督模型,克服3D标注数据不足问题

3D Face Reconstruction from A Single Image Assisted by 2D Face Images in the Wild

8.1.1.4 端到端重建-PRNet

以端到端的方式解决了人脸对齐和三维人脸的问题,使其一起完成,而且不受低维解空间的限制。

为了直接回归三维面部结构和密集排列,开发了一种新的表示方法,称为UV位置图,它记录了三维人
脸的位置信息,并与UV空间上每个点的语义紧密对应
为了训练,提出了一个权重掩码,它将不同的权重分配给位置图上的每个点并计算加权损失。论文展示
这个设计有助于提高网络的性能。

最终提供了一个运行速度超过100FPS的轻量级框架直接从单个二维图像中获得三维人脸重建和对齐结
果面部图像。

网络结构

Joint 3D Face Reconstruction and Dense Alignment with Position Map Regression Network

8.1.2 人体,物体重建

物体,人体重建-IF-NETS
效果

https://virtualhumans.mpi-inf.mpg.de/ifnets/

人体重建

PIFU
PIFUHD

https://shunsukesaito.github.io/PIFuHD/

https://shunsukesaito.github.io/PIFu/

8.2 基于深度学习的Depth Estimate(MVS)


8.2.1 MVS(Multi-View Stereo)-经典深度学习开源框架

MVSNet-必读经典
P-MVSNet - 从pixel-wise拓展到patch-wise cost volume
Unsupervised MVSNet - 无监督网络
Fast-MVSNet - 速度快
JDACS-MS - 无监督MVS网络效果较好
PatchMatchNet - 有监督MVS网络效果较好

8.2.2 MVSNet

输入是任意位姿的多张图像,且多张图片之间的关系需要被整体考虑。

网络结构:
MVSNet: Depth Inference for Unstructured Multi-view Stereo

8.2.3 JDACS-MS

自监督三维重建方法都是基于颜色一致性假设,即匹配点具有相同的颜色。然而这一假设在自然场景下却难
以成立,因为不同视角图像之间天然存在的光照差异等干扰,导致匹配点间具有不同的颜色。这可能会导致
自监督信号失效,无法有效地起到监督作用,我们称其为颜色一致性歧义问题。针对这一问题,他们团队在
自监督训练框架中引入协同分割和数据增强策略:通过协同分割挖掘多视角之间的共有抽象语义,并设计了
一个语义一致性损失;通过将自监督训练拓展为双阶段,引入数据增强一致性损失。

网络结构

Self-supervised Multi-view Stereo via Effective Co-Segmentation and Data-Augmentation

8.2.4 PatchMatchNet

一种基于传统PatchMatch算法的高效multi-view stereo框架,综合性能和memory是目前效果最好的。

网络结构

PatchmatchNet: Learned Multi-View Patchmatch Stereo

8.3 深度图相关评测网站

单目/Stereo相关测评网站介绍1

https://vision.middlebury.edu/stereo/eval3/
单目/Stereo相关测评网站介绍2

http://www.cvlibs.net/datasets/kitti/eval_stereo_flow.php?benchmark=stereo

单目/Stereo相关测评网站介绍3
室外场景:https://www.eth3d.net/low_res_two_view

8.4 SOTA论文

各个领域的好的开源的论文集合

https://paperswithcode.com/sota
8.5 数据集网站集合

kitti: http://www.cvlibs.net/datasets/kitti/

NYU: https://cs.nyu.edu/~silberman/datasets/

ScanNet: http://www.scan-net.org/

DTU: https://roboimagedata.compute.dtu.dk/
 

You might also like