使用COLMAP进行三维重构
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、COLMAP是什么?
- 二、数据准备
- 2.1、数据采集
- 2.2、数据组织
- 三、重构
- 3.1、提取图像特征
- 3.2、特征点匹配
- 3.3、稀疏重建(SfM)
- 3.4、深度图估计
- 3.5、稠密重建(MVS)
- 3.6、融合
- 四、可视化
- 4.1、稀疏重建结果可视化
- 4.2、深度图、法向图可视化
- 4.3、稠密重建结果可视化
- 总结
- 参考
前言
最近看有关三维重构的文章,做一些总结。这里的三维重建是指从运动的视频或者图像中重建出物体三维结构。
基本原理就是相机围绕着物体转,从不同角度抓拍,得到多方位的图像,然后进行如下操作。我们以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讲习班笔记-基于图像的大规模场景三维重建(上)
使用COLMAP进行三维重构相关推荐
- 【三维重建】三维重构基础知识、三维数据、重建流程
文章目录 1.在计算机内生成三维信息 三维图像重构: 四个坐标系 坐标系转换 内参矩阵 外参矩阵 图像采集设备的标定方法: 2.相关概念 (1)彩色图像和深度图像 (2)PCL (3)点云数据(PCD ...
- 基于Android的红外测温设计,基于Android的红外三维重构移动APP设计与实现
摘要: 物体的冷热程度主要依据温度来衡量,在科学进步的过程中也研制出很多测量物体温度的设备,非制冷型红外热成像仪就是应用最为广泛的一种.非制冷型红外热像仪是一种快速测量,非接触式的测温方法,而且成本非 ...
- 双目三维重建_【光电视界】简单介绍双目视觉三维重构
今日光电 有人说,20世纪是电的世纪,21世纪是光的世纪:知光解电,再小的个体都可以被赋能.欢迎来到今日光电! ----与智者为伍 为创新赋能---- 1.三维重构 1.1.三维重构到底 ...
- 包裹点云位姿估计_基于点云位姿平均的非合作目标三维重构
基于点云位姿平均的非合作目标三维重构 李宜鹏 ; 解永春 [期刊名称] <空间控制技术与应用> [年 ( 卷 ), 期] 2020(046)001 [摘要] 针对在轨非合作目标 , 提出一 ...
- 三维重构 c++_桐柏3d打印模型生产厂家【博通三维】-博通三维
桐柏3d打印模型生产厂家[博通三维] 无锡博通三维科技有限公司是一家依逆向工程为主要综合性设计公司,公司服务项目有产品工业设计.蓝光三维扫描.激光抄数.零部件微细度检测.产品复杂曲面C检测.规格零部件 ...
- 双目视觉三维重构(一)————简介
CSDN中关于立三维重构的介绍层出不穷,CNKI中也有各类综述对三维重构进行总结,撰写这篇博客仅作为本人对该类博客.论文的总结学习,加深自身学习的印象.作为学习的笔记.如有错误的地方,欢迎指正. 1. ...
- 极线几何关系、极点、极线,三维重构,k-d树的特征匹配方法
1. 试画图说明极线几何关系,并指出极点.极线所在,解释极线约束. 基线:左右像机光心连线: 极平面:空间点,两像机光心决定的平面: 极点:基线与两摄像机图像平面的交点: 极线:极平面与图像平面交线 ...
- 心脏三维重构的调研报告
最近导师让做一个关于心脏的三维重构报告,查阅了很多的资料,这一块感觉还是比较冷门的,所以更新一下,希望能够帮助后来的童鞋~~~ 1.调研背景 1.1背景介绍 近年来,CT.CR.DR.MRI. US. ...
- 电镜三维重构中多构象的辨别方法
多构象问题是冷冻电镜三维重构的难题之一.同种颗粒可能会有多种不同的形态,有些形态甚至是连续变化的,因此利用中央截面定理从多种构象混合的二维单颗粒中重构多种构象是很困难的. 想要区分不同构象,最简单的思 ...
最新文章
- 使用WinPcap和libpcap类库读写pcap文件(002)PCAP文件格式
- Apache httpd设置HTTPS双向认证
- bean的scope
- SAP UI5 Web Component的图标实现
- php文件上传漏洞waf,文件上传绕过WAF
- 谷歌18年博士生奖研金出炉,八位入选华人学生均毕业于国内高校
- linux高级命令组合
- 在windows服务器开启php的gd库出错
- .net加载失败的程序集重新加载
- 前端项目总结与分享(PPT整理)
- 数据仓库常见建模方法与大数据领域建模实例综述
- 标准粒子群算法(PSO)
- echarts配置项图文介绍——xAxis
- 面包屑导航 组件<el-breadcrumb>
- 工作进入第七年,开始幻想四十岁的生活
- wifi爆破学习记录
- Hash算法解决冲突的方法
- 【AIS学习】08:6比特ASCII码表
- CCF-CSP 小中大 C语言
- 纯CSS实现带返回顶部右侧悬浮菜单
热门文章
- 金纳米颗粒上装载DNA四面体|金核(75-100nm左右)sio2壳层(3-5nm)产品描述/信息/详情
- #Paper Reading# Stochastic Optimization of Sorting Networks via Continuous Relaxations
- Android NFC的应用
- 【C++】Vscode 中使用CMakeLists(推荐)构建C++项目:项目结构、各个文件夹的作用、从编码到debug
- 联想服务器AR系列,联想正式发布AR一体机:晨星AR
- Protein-protein interaction site prediction through combining local and global features 文章梳理
- win7计算机无法最大化,win7系统窗口老是以最大化显示且不能还原的具体方法
- 利用命令行实现图片转换等操作--ImageMagick
- 原生微信小程序使用class 三元运算符实现多选案例
- mysql随机生成中文姓名_mysql 随机生成姓名函数,及模拟大量测试数据