使用COLMAP进行三维重构

2023-11-17

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

最近看有关三维重构的文章,做一些总结。这里的三维重建是指从运动的视频或者图像中重建出物体三维结构。
基本原理就是相机围绕着物体转,从不同角度抓拍,得到多方位的图像,然后进行如下操作。我们以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讲习班笔记-基于图像的大规模场景三维重建(上)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用COLMAP进行三维重构 的相关文章

  • 仅需一个样本即可定制个性化的SAM

    Personalize Segment Anything Model with One Shot https arxiv org pdf 2305 03048 pdf https github com ZrrSkywalker Person
  • 解决opencv读取(保存)不了路径为中文名的图片办法

    读取图片 img cv2 imdecode np fromfile inputpath dtype np uint8 1 保存图片 cv2 imencode jpg rotated img 1 tofile outpath jpg 按自己需
  • Opencv学习笔记(三)线性及非线性滤波

    大纲 1 滤波综述 2 方框滤波 3 均值滤波 4 高斯滤波 5 中值滤波 6 双边滤波 一 滤波综述 图像的滤波指的是在尽量保证图像细节特征的的情况下对图像中的噪声进行抑制 又因为图像的能量大部分集中在低频或者中频的区域 图像大部分区域是
  • 【图像压缩】QOI图像格式详解

    最近听说一种图像格式比较流行 想起我曾经是做图像压缩的emmmm 就来研究一下 QOI Quite OK Image Format 很好的图像格式 git链接 能快速地无损压缩图像 原理也非常简单 没有各种变换 直接空域处理 而无损压缩 自
  • 用MATLAB实现人脸识别

    1 人脸识别技术的细节 一般来说 人脸识别系统包括图像提取 人脸定位 图形预处理 以及人脸识别 身份确认或者身份查找 系统输入一般是一张或者一系列含有未确定身份的人脸图像 以及人脸数据库中的若干已知身份的人脸图像或者相应的编码 而其输出则是
  • opencv畸变校正的两种方法

    opencv中畸变校正有两种方法 1 undistort 直接进行畸变校正 void cv undistort InputArray src 原始图像 OutputArray dst 矫正图像 InputArray cameraMatrix
  • 图像特征提取技术

    目 录 前 言 基于颜色的特征提取 1 颜色空间 2 直方图以及特征提取 基于纹理的特征提取 1 灰度共生矩阵 2 tamura纹理 基于深度神经网络的图像处理 前 言 图像特征提取属于图像分析的范畴 是数字图像处理的高级阶段 本文将从理论
  • 计算机图形学---常用颜色模型汇总(RGB,CMY,HSV)

    本文整理自西安交通大学软件学院祝继华老师的计算机图形学课件 请勿转载 文章目录 常用颜色模型 RGB颜色模型 CMY颜色模型 HSV颜色模型 常用颜色模型 颜色模型 某个三维颜色空间中的一个可见光子集 包含某个颜色域的所有颜色 用途 在某个
  • Sequential Modeling Enables Scalable Learning for Large Vision Models

    目录 一 论文速读 1 1 摘要 1 2 论文概要总结 二 论文精度 2 1 论文试图解决什么问题 2 2 论文中提到的解决方案之关键是什么 2 3 论文提出的架构和损失函数是什么 2 4 用于定量评估的数据集是什么 代码有没有开源 2 5
  • 人工智能机器人:未来生活的智能伙伴

    导言 随着人工智能的不断进步 智能机器人正逐渐走入人们的日常生活 成为了生活和工作中的得力助手 本文将深入探讨人工智能机器人的发展趋势 关键技术以及对未来生活的影响 人工智能和机器人技术的迅猛发展正在深刻地改变我们的生活和工作方式 本文将深
  • 软件测试/人工智能丨常见的计算机视觉的业务场景有哪些?计算原理和测试指标

    计算机视觉在各种业务场景中都有广泛的应用 以下是一些常见的计算机视觉的业务场景 以及与之相关的计算原理和测试指标 图像识别和分类 业务场景 识别图像中的对象 场景或模式 如物体识别 人脸识别 计算原理 使用卷积神经网络 CNN 等深度学习模
  • 软件测试/人工智能丨计算机视觉场景下如何开展相关测试活动

    计算机视觉测试涉及验证计算机视觉系统的性能 准确性和鲁棒性 以确保其在实际应用中的有效性 以下是在计算机视觉场景下开展相关测试活动的一些建议 图像数据集测试 数据集多样性 使用多样化的图像数据集进行测试 确保计算机视觉系统能够处理不同场景
  • 软件测试/人工智能丨计算机视觉场景中,如何处理视频/图片数据并进行测试

    在计算机视觉中 处理视频和图片数据并进行测试是一个关键的任务 以下是一些常见的步骤和方法 处理图片数据 数据加载 使用图像处理库 例如OpenCV PIL 加载图像数据 将图像转换为模型所需的格式 通常是矩阵 预处理 标准化图像 将图像像素
  • 【思扬赠书 | 第1期】教你如何一站式解决OpenCV工程化开发痛点

    写在前面参与规则 参与方式 关注博主 点赞 收藏 评论 任意评论 每人最多评论三次 本次送书1 3本 取决于阅读量 阅读量越多 送的越多 思扬赠书 第1期活动开始了 机器视觉 缺陷检测 工业上常见缺陷检测方法 方法一 基于简单二值图像分析
  • 什么是“人机协同”机器学习?

    人机协同 HITL 是人工智能的一个分支 它同时利用人类智能和机器智能来创建机器学习模型 在传统的 人机协同 方法中 人们会参与一个良性循环 在其中训练 调整和测试特定算法 通常 它的工作方式如下 首先 对数据进行人工标注 这就为模型提供了
  • 互操作性(Interoperability)如何影响着机器学习的发展?

    互操作性 Interoperability 也称为互用性 即两个系统之间有效沟通的能力 是机器学习未来发展中的关键因素 对于银行业 医疗和其他生活服务行业 我们期望那些用于信息交换的平台可以在我们需要时无缝沟通 我们每个人都有成千上万个数据
  • 详解数据科学自动化与机器学习自动化

    过去十年里 人工智能 AI 构建自动化发展迅速并取得了多项成就 在关于AI未来的讨论中 您可能会经常听到人们交替使用数据科学自动化与机器学习自动化这两个术语 事实上 这些术语有着不同的定义 如今的自动化机器学习 即 AutoML 特指模型构
  • 友思特分享 | CamSim相机模拟器:极大加速图像处理开发与验证过程

    来源 友思特 机器视觉与光电 友思特分享 CamSim相机模拟器 极大加速图像处理开发与验证过程 原文链接 https mp weixin qq com s IED7Y6R8WE4HmnTiRY8lvg 欢迎关注虹科 为您提供最新资讯 随着
  • 图像分割-Grabcut法(C#)

    版权声明 本文为博主原创文章 转载请在显著位置标明本文出处以及作者网名 未经作者允许不得用于商业目的 本文的VB版本请访问 图像分割 Grabcut法 CSDN博客 GrabCut是一种基于图像分割的技术 它可以用于将图像中的前景和背景分离
  • 图像分割-Grabcut法

    版权声明 本文为博主原创文章 转载请在显著位置标明本文出处以及作者网名 未经作者允许不得用于商业目的 本文的C 版本请访问 图像分割 Grabcut法 C CSDN博客 GrabCut是一种基于图像分割的技术 它可以用于将图像中的前景和背景

随机推荐

  • docker下mysql镜像初始化

    目录 1 介绍 2 部署及验证 2 1 场景复现 2 2 创建dockerfile 2 3 初始化脚本 2 4 构建镜像并查看 2 5 创建容器并验证 2 6 完成 1 介绍 原理 当Mysql容器首次启动时 会在 docker entry
  • QT 多线程中使用QCanBusDevice进行PCAN通讯时,无法正常发出数据

    QT 多线程中使用QCanBusDevice进行PCAN通讯时 无法正常发出数据 前言 我一开始的代码逻辑是 PCAN开启 关闭 发送 接收这些功能整合在一个工具类中 这个工具类的对象是在主线程创建的 然后我有一个要循环定时发送的功能是独立
  • ASP.NET Core错误:Unable to cast object of type ‘System.Data.ProviderBase.DbConnectionClosedConnecting‘

    项目场景 在使用 net core开发时 经常使用数据库出现的问题 问题描述 开发ASP NET Core时遇到在经常使用数据库连接时报错误提示 Unable to cast object of type System Data Provi
  • QCefView源码优化

    QCefView项目源码的构建部分这里就不赘述了 有问题的朋友可以回到 QCefView 1 CMAKE项目 库文件生成和项目测试 查看相关介绍 本次优化主要包括以下几个部分 1 设置部分 关闭代理服务器 关闭同源策略 使用系统flash等
  • 不断完善

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 最简单的网页下载代码 import urllib2 使用urllib2模块 from sys import argv script urlo argv def down
  • 【核磁共振成像】部分傅里叶重建

    目录 一 部分傅里叶重建 二 部分傅里叶重建算法 2 1 填零 2 2 零差处理 一 部分傅里叶重建 在部分傅里叶采集中 数据并不是绕K空间中心对称收集的 而是K空间的一半是完全填充的 另一半只收集了一小部分数据 部分傅里叶采集所依据的原理
  • 公钥私钥证书与https

    公钥私钥 非对称加密 在一个过程中使用两个密钥 公共密钥用于加密信息 私用密钥用于解译加密的信息 这种加密方法称为非对称加密 也称为公钥加密 因为其中一个密钥是公开的 另一个私钥则需要自己保密 私钥签名 如果我用私钥加密一段数据 当然只有我
  • Request 获取请求数据(方法)

    1 Request 继承体系 2 Request 获取请求数据 2 1 请求行 String getMethod 获取请求方式 GET String getContextPath 获取虚拟目录 项目访问路径 request demo Str
  • java占用cpu最高的线程堆栈信息

    jstack找出占用cpu最高的线程堆栈信息 package com example demo public class Math public static final int initData 666 public int comput
  • Swagger3的使用

    本篇涉及到的swagger注解 速记 EnableSwagger2 开启swagger EnableOpenApi 开启swagger的Api功能 EnableWebMvc 是为了解决swagger和springmvc整合之后总是出现空指针
  • 解决idea打不开的两种可能性

    一 如果 IDEA 下载完成后打不开 可能是因为 dea64 exe vmoptions 文件中保留了之前版本的破译配置 注释或者删除就可以了 1 打开 C Users Administrator AppData Roaming JetBr
  • python stm32-STM32 上面跑Python

    By Derrick Wang 之前我一直在找一种方案 可以把stm32打造成一个真正的创客平台 因为传统的开发环境安装编译 眼花缭乱的工具栏和按钮并不实用于非电子类专业的爱好者设计出自己的作品 这样的高门槛把很多有兴趣者拒之门外 一个没有
  • UDP协议介绍

    UDP 是一个简单地面向数据报的运输层协议 进程的每个输出操作都正好产生一个 UDP 数据报 并组装成一份待发送的 IP 数据报 UDP 不提供可靠性 它把应用程序传给 IP 层的数据发送出去 但是并不保证他们能到达目的地 UDP数据报封装
  • [蓝桥杯] 分数 (Python 实现)

    题目 代码 b 0 a 1 for i in range 0 20 b a a 2 print d d b a 2 结果 1048575 524288
  • C++案例

    目录 一 while循环猜数组 二 水仙花数 三 for循环敲桌子游戏 四 9 9乘法表 五 一维数组 元素逆置 六 冒泡排序 七 封装一个函数 利用冒泡排序 实现对整型数组的升序排序 八 结构体嵌套结构体 九 结构体排序 一 while循
  • 哈夫曼编码最大编码长度

    概念 层数 叶子节点为待编码的数据 根为第0层 编码长度 第 L L L层数据编码后的长度为 L L L 节点概率 若节点为叶子节点 则概率为叶子所编码数据的频率
  • Linux INPUT 子系统实验

    按键 鼠标 键盘 触摸屏等都属于输入 input 设备 Linux 内核为此专门做了一个叫做 input子系统的框架来处理输入事件 输入设备本质上还是字符设备 只是在此基础上套上了 input 框架 用户只需要负责上报输入事件 比如按键值
  • Python3之异常with语句

    高级语法之异常with 语法 with 表达式1 as 变量1 表达式2 as 变量2 语句块 with的作用 使用于对资源进行访问的场合 确保使用过程中不管是否发生异常都会执行必须的 清理 操作 并释放资源 如 文件打开后自动关闭 线程中
  • 如何判断是否适合学编程?

    能问出这个问题的人 肯定是心里有点想学习编程 但是又担心自己不适合学习编程 学不会反而浪费时间 那么 如何判断自己是否适合学习编程呢 可以从如下几个方面入手 1 明确自己为什么要学编程 因为不同的编程语言适用的领域不一样 比如我认识一个做互
  • 使用COLMAP进行三维重构

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 前言 一 COLMAP是什么 二 数据准备 2 1 数据采集 2 2 数据组织 三 重构 3 1 提取图像特征 3 2 特征点匹配 3 3 稀疏重建 SfM 3 4