Colmap三维重建详解与使用方法

news2024/11/16 19:54:19

图片捕获过程,请遵循以下指导方针以获得最佳重建结果:

1 捕捉具有良好纹理的图像。避免使用完全没有质感的图片(例如,白色的墙或空桌子)。如果场景本身没有足够的纹理,你可以放置额外的背景对象,如海报等。

2 在相似的照明条件下捕获图像。避免高动态范围的场景(例如,背对太阳有阴影的照片或透过门/窗拍摄的照片)。避免在有光泽的表面上拍摄。

3 捕捉高视觉重叠的图像。确保每个物体至少在3张图片中看到,重叠图片越多越好。

4 围绕同一个物体进行不同的角度捕捉图像,不要只旋转相机从同一位置拍摄图像。同时,尽量从一个相对相似的角度拍摄足够多的图片。注意,更多的图像不一定更好,可能会导致缓慢的重建过程。如果你使用视频作为输入,考虑下采样帧率。

概述

基于图像的三维重建传统上首先使用运动结构(Structure-from-Motion)恢复场景的稀疏表示和输入图像的姿态。这个输出然后作为多视图立体几何(Multi-View Stereo的输入,以恢复场景的密集表示。

SFM是通过一系列有重叠的且不同视角的图片重建出物体的三维结构(稀疏点云),并且输出相机的内外参数,内参指的是将真实空间的三维点通过内参矩阵转换为相机图片上的二维点,外参包含相机在切换不同视角时的平移和旋转信息。

通常情况下,运动结构系统将这一过程分为三个阶段:

1 特征检测与提取

2 特征匹配和几何验证

3 结构与运动重建

多视图立体几何(MVS)采用SfM的输出来计算图像中每个像素的深度和法向信息。在3D点云中融合多幅图像的深度图和法向图,然后生成场景的密集点云。利用融合点云的深度和法向信息,泊松曲面(Poisson),三角剖分(delaunay)重建等算法可以恢复场景的三维曲面几何。

实施:

COLMAP创建一个新项目必须包含存储数据库的位置以及包含输入图像的文件夹。可以将整个项目设置保存到配置文件中,项目配置文件中保存存储数据库和图像文件夹的绝对路径信息。整个项目的目录结构如下:

第一步:特征检测/提取

特征检测/提取在图像中找到稀疏的特征点,并使用数值描述符(128维向量)描述特征点。主要使用SIFT特征提取方法。

jpge图像的头部保存了EXIF信息 里面包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及GPS全球定位系统数据、缩略图等,COLMAP可以从嵌入式EXIF信息中自动提取焦距信息。

提取到的特征信息如下:

NUM_FEATURES代表一张图像提取到多少个特征点,x,y代表特征点的坐标, scale代表尺度(即相机距离物体远近的比例),ORIENTATION代表特征点的梯度方向, D_1…D_128代表特征描述符的128维向量,所有提取的数据都将存储在数据库文件中。

其中X, Y, SCALE, ORIENTATION为浮点数,D_1…D_128为0…255范围内的值。

例如,一张图片有4个特征:

第二步:特征匹配和几何验证。

特征匹配首先匹配图像对,下面列出图像匹配的几种策略。其次再将匹配后的图像上的特征点进行匹配,利用特征点的128维描述符向量的相似性度量进行特征点匹配。

图像对匹配算法:

穷尽匹配(Exhaustive Matching):如果数据集中的图像数量相对较低(最多数百个),那么这种匹配模式应该足够快,并能获得最佳的重构结果。在这里,每个图像都与其他图像进行匹配,而块大小决定同时从磁盘加载到内存中的图像数量。

序列匹配(Sequential Matching):由一个摄像机。在这种情况下,连续的帧具有视觉重叠,不需要用尽全力地匹配所有的图像对。而是将连续捕获的图像相互匹配。

空间匹配(Spatial Matching):这种匹配模式将每个图像与它的空间近邻进行匹配。COLMAP还会从EXIF中提取GPS信息,并使用它进行空间最近邻居搜索。

传递性匹配(Transitive Matching):这种匹配模式利用已有特征匹配的传递关系,生成更完整的匹配图。如果一个图像A匹配到一个图像B,而B匹配到C,那么这个匹配器会尝试直接将A匹配到C。

建立图像对之后,在参考图像中的一个特征点,如何从目标图像中的所有特征点中找出与之相对应的特征点。如果使用暴力计算法,计算每一对特征点的相似距离,如果特征的描述符向量的维度和特征点的数量较多的话,暴力法是不可取的。需要使用KD树算法建立一个搜索树,基于KD树最邻近查找算法,方便特征点进行快速匹配。

由于sift提取的特征点和描述子在匹配过程中可能会存在误匹配的情况,所以需要将错误的匹配点对剔除。几何校验是筛除一些误匹配的特征点。几何校验是指利用对极几何进行约束

对极几何:空间中的一点与两张图片相机的光心,三者围成一个极平面,极平面与两张图片相交形成两条极线,对极几何约束是指,空间点X在摄像机1的成像平面中的像素点x,与之相匹配的摄像机2的成像平面中的像素点 x' 一定落在极线上。

公式约束为: x'的转置 × F × x =0 ;F为基础矩阵,F可以通过8对匹配的特征点联立方程组求得 分解F矩阵可以求得相机的内参矩阵。 

几何约束方法:随机选取图像对的8对匹配点,使用归一化八点算法求解基础矩阵F,然后统计满足对极几何关系的点对数量,在设定的次数内重复上述步骤,选取满足条件的点对数量最多的匹配为精化匹配结果。

第三步:稀疏重构

首先初始化主要是指选取两张匹配的图像,设定其中一张图像的位姿为单位阵,然后通过它们之间的匹配点对估计出E矩阵,将E矩阵分解获得另一张图像的位姿。在估计出两张图像的位姿后,就可以通过三角化(triangulation)来生成三维点。

然后进行增量式重建:

1 获取下一最佳匹配图像(匹配点对数量最多)

2 利用匹配的特征点估计出E矩阵(本质矩阵),估计图像位姿

3 进行三角化生成三维空间点,三角化是利用两个匹配的图像坐标图像位姿以及相机的内参矩阵,求得匹配点的三维点坐标。

4 对所有已生成的三维点和已估计出的位姿,使用ceres库进行ba(bundle adjustment)优化。通过最小化重投影误差实现剔除误差过大的点

5 最后对所有数据进行ba优化 即全局优化

第四步:稠密重建

在重建场景的稀疏表示和输入图像的相机姿势后,MVS现在可以恢复更密集的场景几何。COLMAP有一个集成的密集重建管道,可以为所有的配准图像生成深度和法向图,将深度和法向图融合到一个将稀疏点云融合成密集点云,最后使用泊松(Poisson)或三角剖分(Delaunay)重建方法从融合的点云中估计出一个密集曲面。

稠密重建分为:

1 是还原图像,去除图像的畸变

2 是计算深度图和法向图

3 将深度和法向图融合成到点云里

4 点云网格划分形成曲面

colmap命令行执行过程

初始数据为图像文件和数据库文件

图像文件包含128张jpg图像

1 特征提取 利用特征提取算法提取每一张图片的特征点并获得特征点的描述符

2 穷尽匹配 匹配每一张图片与其他所有图片的特征点,并进行几何校验。

3 稀疏重建

首先使用两张图片,将第一张图片的位姿记为单位阵,通过匹配的特征点利用本质矩阵求得另一张图像位姿,通过估计基础矩阵得到相机的内参矩阵,利用两个匹配的图像坐标和图像位姿以及相机的内参矩阵,进行三角化生成三维空间点。接着使用ba(bundle adjustment)优化生成的三维点,通过最小化重投影误差实现剔除误差过大的点。然后每增加一张图片,重复进行估计图像位姿、三角化、ba优化、全局ba优化等步骤。直至添加完所有图片

稀疏重建效果

4 稠密重建

(1) 图像去畸变,还原未失真的图片

(2)计算深度和法向图

立体匹配后生成的深度图

立体匹配后生成的法向图

(3)在稀疏点云中融合多幅图像的深度图和法向图,然后生成场景的密集点云。

稠密点云效果如下:

(4)使用三角剖分算法进行曲面重建,重建效果如下:

参考网址:

https://www.ctyun.cn/developer/article/416012493463621

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1242886.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux常用命令指南以及shell脚本编程

常用快捷键 Tab键补齐命令CtrlA键光标移动到最前CtrlE键光标移动到最后CtrlU键清空当前输入的内容上/下键切换之前输入的命令 文件操作 cd test进入test目录cd…返回上一个目录cd.停留在当前目录 .代表当前目录ls显示当前文件夹下面的所有文件/文件夹等ls -all显示当前文件夹…

柯桥生活日语学习,打工人的日语你会吗?

打工人在日语里有几种说法: アルバイト 这是最常用的称呼,直接对应中文的“打工”。 例句: 学生の頃はスーパーでアルバイトをしていた。(我学生时代在超市打过工。) バイト これはアルバイトの略称でよく使われる。(这是アルバイト的简称,也很常用。) 例句: バイト先が決…

gitea仓库镜像同步至gitlab

1、参考文档:仓库镜像 | Gitea Documentation 2、错误一:账号密码错误问题 解决方法: 出现以上错误为第三步用户名(Oauth2应用名称)或者密码(Gitlab个人访问令牌)错误。 1)如下图1…

【攻防世界-misc】pure_color

1.方法一:用画图工具打开图片,将图片拷贝至虚拟机win7桌面, 点“属性”,颜色设置为“黑白”, 出现flag值。 2.方法二:使用Stegsilve打开,分析图片 将图片打开,按左右键查找&#xff…

Linux常用基础命令及重要目录,配置文件功能介绍

目录 一,Linux常用必备基础命令 1,网络类命令 2,文件目录类命令 3,操作类命令 4,关机重启命令 5,帮助命令 6,查看显示类命令 7,命令常用快捷键 二,Linux重要目录…

【Linux】:消息队列和信号量

信号 一.消息队列1.原理2.消息队列的各种接口1.创建消息队列2.释放消息队列3.发送和接收信息 二.信号1.概念2.各种接口1.创建信号量2.销毁信号量3.对信号量进行操作 三.一个现象 一.消息队列 1.原理 这种消息队列被称为system V标准。 可以使用ipcs -q来查询消息队列&#xff…

Jmeter+influxdb+grafana监控平台在windows环境的搭建

原理:Jmeter采集的数据存储在infuxdb数据库中,grafana将数据库中的数据在界面上进行展示 一、grafana下载安装 Download Grafana | Grafana Labs 直接选择zip包下载,下载后解压即可,我之前下载过比较老的版本,这里就…

【git】pip install git+https://github.com/xxx/xxx替换成本地下载编译安装解决网络超时问题

目录 🌑🌑 背景 🌒 🌒作用 🌔🌔 问题 🌔🌔解决方案 🌙方法一 🌙方法二 🌝🌝我的解决方案 整理不易,欢迎一键三连…

Exception in thread “消费者“ java.lang.IllegalMonitorStateException

这两天学习生产者消费者模型的时候,使用Java线程来实现,出现了一个问题“Exception in thread "消费者" java.lang.IllegalMonitorStateException”,并且,线程不结束。报错图片如下: 那我们怎么解决呢&…

品牌小红书koc投放策略分享,纯干货!

作为中国具有影响力的时尚美妆社交平台,小红书与其充满活力的用户群体成为品牌寻找优质KOC合作的理想平台。本文伯乐网络传媒将探讨品牌如何利用小红书的KOC投放策略,实现更广泛的市场覆盖和更有效的品牌营销。 一、明确目标受众与KOC合作需求 在开始策…

创新建筑形式:气膜体育馆助力校园体育设施革新

体育场馆在校园中扮演着重要的角色,是学生们进行体育锻炼、比赛和各类体育活动的场所。传统的室内体育馆建设往往需要大量资金和漫长的建设周期,但随着气膜体育馆的崭露头角,校园体育设施的面貌正迎来一场革新。 快速搭建,灵活性极…

2023亚太杯数学建模APMCM竞赛C题思路讲解:基于ARIMA与机理模型进行预测

本文针对6大问题,从多角度分析了我国新能源电动汽车发展形势与前景。文中针对不同问题,采用了层次分析法、时间序列模型、机理模型、回归模型等数学方法。并结合实例数据,对相关模型进行求解,以量化预测了新能源电动汽车在政策驱动、市场竞争、温室气体减排等多个方面的潜在贡献…

这样写Allure生成测试报告,学会直接涨薪5k

Allure是一个开源的测试报告生成框架,提供了测试报告定制化功能,相较于我们之前使用过pytest-html插件生成的html格式的测试报告,通过Allure生成的报告更加规范、清晰、美观。 pytest框架支持使用Allure生成测试报告,接下来让介绍…

低代码开发与IT开发的区别

目录 一、含义不同 二、开发门槛不同 三、两者之间的区别 1、从技术特征来看 2、从目标开发者来看 四、低代码平台使用感受? (1)自定义模块,满足不同的业务需求 (2)工作流引擎,简化复杂流程的管…

什么是数据确权?

在数字化时代,数据已经成为一种新型资产,”新的石油“,具有巨大的价值,未来世界经济竞争一定程度上是数字经济的竞争,而非工业的竞争。数据相关法律制度,尚且还不完整,推动数字经济的发展&#…

OpenAI 曾收到 AI 重大突破警告;半独立的 OpenAI 比与微软合并更好丨 RTE 开发者日报 Vol.91

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

leetcode (力扣) 97. 交错字符串(动态规划)

文章目录 题目描述思路分析完整代码 题目描述 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: s s1 s2 … sn t …

Linux应用开发基础知识——I2C应用编程(十二)

前言: I2C(Inter-Integrated Circuit BUS)是集成电路总线,是目前应用最广泛的总线之一,最初由PHILIPS(现为NXP)设计。它使用多主从架构,主要用于连接低速周边设备。I2C总线在硬件物理…

Linux基础命令4

find查找操作 1.文件名 上图中,一共有4个部分,分别是find,搜索路径,-name,文件名 find加上文件的路径(也就是要查找的文件在根目录下的usr目录下的bin目录底下) 加上 -name 加上文件名&a…

斐波那契数列数列系列问题详解

斐波那契数列数列是我们学习递归的入门问题,是一种非常经典的题型,也衍生出了一些更复杂的题型,这一节就让我们彻底理解斐波那契数列系列问题。 一、概念介绍 1、什么是斐波那契数列? 斐波那契数列(Fibonacci sequenc…