提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
最近看有关三维重构的文章,做一些总结。这里的三维重建是指从运动的视频或者图像中重建出物体三维结构。
基本原理就是相机围绕着物体转,从不同角度抓拍,得到多方位的图像,然后进行如下操作。我们以COLMAP举例,该软件是开源的,可以进行相关三维重建的处理。
一、COLMAP是什么?
COLMAP 是一种通用的运动结构 (SfM) 和多视图立体 (MVS) 管道,具有图形和命令行界面。它为有序和无序图像集合的重建提供了广泛的功能。该软件是在新的 BSD 许可下获得许可的。最新的源代码可在GitHub 上获得。COLMAP 建立在现有作品的基础上,在 COLMAP 中使用特定算法时,请同时引用源代码中指定的原始作者。
基于MVS的三维重建技术流程包括以下步骤:数据采集,稀疏重建,深度图估计和稠密重建。
二、数据准备
2.1、数据采集
手机或者相机绕物体拍一周,每张的角度不要超过30°(保证有overlap区域)。2.2、数据组织
假设采集到的图像集如下:
我们将多角度拍摄的图片组织为colmap的工程格式:
/path/to/project/...
+── images
│ +── image1.jpg
│ +── image2.jpg
│ +── ...
│ +── imageN.jpg
三、重构
3.1、提取图像特征
从图像中提取到特征值。
./colmap feature_extractor \
--database_path $DATASET_PATH/database.db \ # 输出:特征点保存至数据库database.db
--image_path $DATASET_PATH/images # 输入:多视图图像
3.2、特征点匹配
./colmap exhaustive_matcher \
--database_path $DATASET_PATH/database.db # 输入输出:数据库文件database.db
输出:提取到的特征点也存放到数据库中。
3.3、稀疏重建(SfM)
使用SFM进行稀疏重建。SFM,(Structure From Motion,从运动中恢复结构),是一种从一组不同视角下拍摄的无序或有序影像中恢复场景三维结构和相机姿态的技术。
input: 一组图片
output: 场景粗糙的3D形状(稀疏重建), 还有每张图片对应的相机参数。
mkdir $DATASET_PATH/sparse # 新建sparse文件夹
./colmap mapper \
--database_path $DATASET_PATH/database.db \ # 输入:数据库文件database.db
--image_path $DATASET_PATH/images \ # 输入:多视图图像
--output_path $DATASET_PATH/sparse # 输出:`sparse`文件夹
输出结果sparse文件夹如下所示
└── sparse # 稀疏重建结果
└── 0
├── cameras.bin # 相机内参
├── images.bin # 相机位姿
├── points3D.bin # 稀疏3D点
└── project.ini
3.4、深度图估计
深度图估计,目的是恢复参考影像的深度信息。深度估计结束后,可以得到“photometric”和“geometric”下的深度图和法向量图。在深度图估计之前要进行图像去畸变操作。
mkdir $DATASET_PATH/dense # 新建dense文件夹
./colmap image_undistorter \
--image_path $DATASET_PATH/images \ # 输入:多视图图像
--input_path $DATASET_PATH/sparse/0 \ # 输入:sparse文件夹
--output_path $DATASET_PATH/dense \ # 输出:dense文件夹
--output_type COLMAP \ # 参数:输出格式
--max_image_size 2000 # 参数:最大图像尺寸
输出结果dense文件夹如下所示:
└── dense
├── images
│ ├── 100_7100.JPG
│ ├── 100_7101.JPG
│ ├── ...
│ └── 100_7110.JPG
├── run-colmap-geometric.sh
├── run-colmap-photometric.sh
├── sparse
│ ├── cameras.bin
│ ├── images.bin
│ └── points3D.bin
└── stereo
├── consistency_graphs
├── depth_maps
├── fusion.cfg
├── normal_maps
└── patch-match.cfg
3.5、稠密重建(MVS)
使用MVS进行稠密重建。MVS即多视图立体几何,目的是在相机位姿已知的前提下,逐像素的计算图像中每一个像素点对应的三维点,得到场景物体表面密集的三维点云。
输入:多视角图像、相机位姿
输出:稠密点云
./colmap patch_match_stereo \
--workspace_path $DATASET_PATH/dense \ # 输入输出:dense文件夹
--workspace_format COLMAP \ # 参数:工作区格式
--PatchMatchStereo.geom_consistency true
稠密重建的结果:为每张图像估计depth_map和normal_map
└── dense
├── images # resize之后的图像
│ ├── 100_7100.JPG
│ ├── 100_7101.JPG
│ ├── ...
│ └── 100_7110.JPG
├── run-colmap-geometric.sh
├── run-colmap-photometric.sh
├── sparse
│ ├── cameras.bin
│ ├── images.bin
│ └── points3D.bin
└── stereo
├── consistency_graphs
├── depth_maps
│ ├── 100_7100.JPG.geometric.bin
│ ├── 100_7100.JPG.photometric.bin
│ ├── ...
│ ├── ...
│ ├── 100_7110.JPG.geometric.bin
│ └── 100_7110.JPG.photometric.bin
├── fusion.cfg
├── normal_maps
│ ├── 100_7100.JPG.geometric.bin
│ ├── 100_7100.JPG.photometric.bin
│ ├── ...
│ ├── ...
│ ├── 100_7110.JPG.geometric.bin
│ └── 100_7110.JPG.photometric.bin
└── patch-match.cfg
3.6、融合
./colmap stereo_fusion \
--workspace_path $DATASET_PATH/dense \ # 输入:dense文件夹
--workspace_format COLMAP \ # 参数:工作区格式
--input_type geometric \ # 参数:输入类型
--output_path $DATASET_PATH/dense/fused.ply # 输出:fused.ply文件
四、可视化
4.1、稀疏重建结果可视化
使用model_converter将sparse文件夹中的bin文件转为txt文件。使用COLMAP GUI对稀疏重建结果进行可视化
4.2、深度图、法向图可视化
4.3、稠密重建结果可视化
总结
从运动图像进行三维重建,就是通过特征提取、特征匹配、稀疏重建、深度图估计、稠密重建和融合几个步骤组成。其中还有很多细节问题本文没提及,本文只是梳理了一个主要框架和主流程,其他的可以去查找资料。参考
本文参考了:
三维重建:colmap安装与使用
多视图几何三维重建实战系列之COLMAP
三维重建笔记——稠密重建
SFM 与MVS的区别
CCCV2017讲习班笔记-基于图像的大规模场景三维重建(上)