jjzjj

Colmap 实用教程 —— 整体介绍

GondorFu 2024-07-12 原文

https://colmap.github.io/index.html

工程文件结构

+── images # 对应重建图片数据集
│   +── image1.jpg
│   +── image2.jpg
│   +── ...
+── sparse # 稀疏重建结果
│   +── 0
│   │   +── cameras.bin
│   │   +── images.bin
│   │   +── points3D.bin
│   +── ...
+── dense # 稠密重建结果
│   +── 0
│   │   +── images # 去畸变图像
│   │   +── sparse
│   │   +── stereo
│   │   +── fused.ply # 稠密点云
│   │   +── meshed-poisson.ply
│   │   +── meshed-delaunay.ply
│   +── ...
+── database.db # 图像提取的特征相关信息
+── project.ini # 项目信息文件

重建图像采集要求

  • 获取丰富纹理的图像。避免完全无纹理的区域,比如白墙和空的桌子。如果物体本身没有足够的背景,可以考虑增加待纹理的背景。
  • 图像的光照条件尽可能保持一致。避免高的动态范围,比如逆光图片或者透过门窗的图片。同时避免有光泽的表面的镜面反射。
  • 图像之间具有较高的视觉重叠。确保每个物体至少在三张图像中可见,而且越多越好。
  • 从不同视角获取图像。不要维持位置不变只旋转相机,即每次拍照后都要移动一段距离。同时,尽量从相对相似的角度获得足够的图像。不过并不是更多的图像就更好,这可能会导致重建过程缓慢。如果使用视频作为输入,请考虑对帧速率进行下采样。

相机模型

Colmap 实现了不同的相机模型。不过如果相机内参未知,最好还是使用最简单的相机模型,其已经能够很好的解决畸变效应。

  • SIMPLE_PINHOLE, PINHOLE:适用于已知无畸变的图像。两个模型分别对应于一个统一焦距和两个分离焦距。不过即使是无畸变图像,Colmap 还是会尝试使用更复杂的相机模型去优化相机内参。
  • SIMPLE_RADIAL, RADIAL:适用于内参位姿且每张图像来自于不同的相机标定,比如互联网图像。两个模型都是 Opencv 模型的简化版本,分别使用一个和两个参数只建模了径向畸变。
  • OPENCV, FULL_OPENCV:适用于已知标定参数的情况。如果多张图像共享内参,可以使用 Colmap 进行进一步优化;不过如果每张图像具有不同的内参,自动估计大概率会失败。
  • SIMPLE_RADIAL_FISHEYE, RADIAL_FISHEYE, OPENCV_FISHEYE, FOV, THIN_PRISM_FISHEYE:适用于鱼眼镜头,同时所有其他的模型都不能真正地建模鱼眼镜头的畸变。其中 FOV 被 Google Tango 项目采用(必须确保不要将 omega 初始化为 0)

特征提取与匹配

特征提取

Colmap 可以使用 GPU 或者 CPU 提取 SIFT 特征。GPU 版本需要一个额外的显示器,因此 CPU 版本更适合于服务器使用。通常情况下,GPU版本是性能更佳。因为它具有定制的特征检测模式,在高对比度图像的情况下,该模式通常会产生更高质量的特征。

如果希望导入现有特征,每张图像必须具有一个对应的 text 文件,像 /path/to/image1.jpg and /path/to/image1.jpg.txt 这样。对应文件内容如下

NUM_FEATURES 128
X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128
...
X Y SCALE ORIENTATION D_1 D_2 D_3 ... D_128

4 128
1.2 2.3 0.1 0.3 1 2 3 4 ... 21
2.2 3.3 1.1 0.3 3 2 3 2 ... 32
0.2 1.3 1.1 0.3 3 2 3 2 ... 2
1.2 2.3 1.1 0.3 3 2 3 2 ... 3

特征匹配

Colmap 提供了多样的特征匹配方式,不同的匹配方式有不同的适用场景。

  • exhaustive_matcher:针对少量图像(几百张量级),可以获得足够快且最好的重建结果。它将每张图像与其余所有图像进行匹配,不过 block size 可能限制同时加载到内存中的图像数量。
  • sequential_matcher:针对顺序采集的视频图像,由于相邻帧存在视觉上的重叠且没有必要进行完全匹配,它只匹配视频流中的相邻帧。同时,这种匹配方式能够基于 vocabulary tree 进行回环检测。最后,帧之间的前后关系由图像文件名给定,与数据集中的存储顺序无关。
  • vocab_tree_matcher:针对大量图像(几千帧量级),可以通过提供 vocabulary tree 从而快速检索视觉上最相近的图像进行匹配。
  • spatial_matcher:针对能够提供准确定位信息的图像,可以通过对应图像采集时的 GPS 信息从而仅匹配空间位置上相近的图像。
  • transitive_matcher:基于传递规则使用已有的特征匹配关系确定更完全的匹配图,即 A 与 B 匹配,B 与 C 匹配,那将直接匹配 A 和 C。
  • Custom Matching:通过 text 文件指定图像的匹配关系,如果是导入的特征可以进一步指定两张图像之间特征的匹配关系。

数据库格式 —— database.db

database.db 文件中存储着以下关系表:

  • cameras:包含相机内参,通过 ID 索引
  • images:包含相机外参,通过 ID 索引
  • keypoints:检测到的关键点
  • descriptors:对应关键点的描述符
  • matches:特征匹配结果
  • two_view_geometries:几何验证结果

重建结果

稀疏重建

+── sparse # 稀疏重建结果
│   +── 0
│   │   +── cameras.bin
│   │   +── images.bin
│   │   +── points3D.bin

 其中既可以通过二进制文件表示,也可以通过 text 文件表示,其中具体内容细节如下:

  • cameras.bin\cameras.txt:
# Camera list with one line of data per camera:
#   CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# Number of cameras: 3
1 SIMPLE_PINHOLE 3072 2304 2559.81 1536 1152
2 PINHOLE 3072 2304 2560.56 2560.56 1536 1152
3 SIMPLE_RADIAL 3072 2304 2559.69 1536 1152 -0.0218531

最后的相机参数依赖不同的 distortion model,其中 2559.81 1536 1152 分别表示焦距和 principal point 的像素位置。

  • images.bin\images.txt:
# Image list with two lines of data per image:
#   IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
#   POINTS2D[] as (X, Y, POINT3D_ID)
# Number of images: 2, mean observations per image: 2
1 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180141.JPG
2362.39 248.498 58396 1784.7 268.254 59027 1784.7 268.254 -1
2 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180142.JPG
1190.83 663.957 23056 1258.77 640.354 59070

第一行中的 QW, QX, QY, QZ 为图像拍摄时相机的外参的四元数(使用 Hamilton 假设,符合 Eigen 中的定义),TX, TY, TZ 为对应外参的平移向量。

第二行每三个数表示一个图像关键点,其中前两个值 X,Y 分别对应关键点在图像中的像素坐标,第三个值 POINT3D_ID 为对应关键点对应的三维重建点 ID,-1 表示没有对应三维点。

  • points.bin\points.txt:
# 3D point list with one line of data per point:
#   POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)
# Number of points: 3, mean track length: 3.3334
63390 1.67241 0.292931 0.609726 115 121 122 1.33927 16 6542 15 7345 6 6714 14 7227
63376 2.01848 0.108877 -0.0260841 102 209 250 1.73449 16 6519 15 7322 14 7212 8 3991
63371 1.71102 0.28566 0.53475 245 251 249 0.612829 118 4140 117 4473

ERROR 为三维点的综合重投影误差;TRACK[] 每两个数表示三维点对应的一个图像二维特征点,分别对应图像 ID 和 这张图像的二维特征点 ID。 

稠密重建

+── images # 去畸变图像
│   +── image1.jpg
│   +── image2.jpg
│   +── ...
+── sparse # 基于去畸变图像的稀疏重建结果
│   +── cameras.txt
│   +── images.txt
│   +── points3D.txt
+── stereo # 立体重建的结果
│   +── consistency_graphs
│   │   +── image1.jpg.photometric.bin
│   │   +── image1.jpg.geometric.bin
│   │   +── image2.jpg.photometric.bin
│   │   +── image2.jpg.geometric.bin
│   │   +── ...
│   +── depth_maps # 图像每个像素点的深度图
│   │   +── image1.jpg.photometric.bin
│   │   +── image1.jpg.geometric.bin
│   │   +── image2.jpg.photometric.bin
│   │   +── image2.jpg.geometric.bin
│   │   +── ...
│   +── normal_maps # 图像每个像素点的法线贴图
│   │   +── image1.jpg.photometric.bin
│   │   +── image1.jpg.geometric.bin
│   │   +── image2.jpg.photometric.bin
│   │   +── image2.jpg.geometric.bin
│   │   +── ...
│   +── patch-match.cfg
│   +── fusion.cfg
+── fused.ply # fusion 的结果
+── meshed-poisson.ply # poisson mesh 的结果 
+── meshed-delaunay.ply # delaunay mesh 的结果
+── run-colmap-geometric.sh # 基于几何的稠密重建代码
+── run-colmap-photometric.sh # 基于视觉的稠密重建代码

The consistency graph defines, for all pixels in an image, the source images a pixel is consistent with. (没理解 o_0)。

有关Colmap 实用教程 —— 整体介绍的更多相关文章

  1. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  2. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  3. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  4. 在VMware16虚拟机安装Ubuntu详细教程 - 2

    在VMware16.2.4安装Ubuntu一、安装VMware1.打开VMwareWorkstationPro官网,点击即可进入。2.进入后向下滑动找到Workstation16ProforWindows,点击立即下载。3.下载完成,文件大小615MB,如下图:4.鼠标右击,以管理员身份运行。5.点击下一步6.勾选条款,点击下一步7.先勾选,再点击下一步8.去掉勾选,点击下一步9.点击下一步10.点击安装11.点击许可证12.在百度上搜索VM16许可证,复制填入,然后点击输入即可,亲测有效。13.点击完成14.重启系统,点击是15.双击VMwareWorkstationPro图标,进入虚拟机主

  5. hadoop安装之保姆级教程(二)之YARN的配置 - 2

    1.1.1 YARN的介绍 为克服Hadoop1.0中HDFS和MapReduce存在的各种问题⽽提出的,针对Hadoop1.0中的MapReduce在扩展性和多框架⽀持⽅⾯的不⾜,提出了全新的资源管理框架YARN. ApacheYARN(YetanotherResourceNegotiator的缩写)是Hadoop集群的资源管理系统,负责为计算程序提供服务器计算资源,相当于⼀个分布式的操作系统平台,⽽MapReduce等计算程序则相当于运⾏于操作系统之上的应⽤程序。 YARN被引⼊Hadoop2,最初是为了改善MapReduce的实现,但是因为具有⾜够的通⽤性,同样可以⽀持其他的分布式计算模

  6. ruby - 在 RUBY 上的 PADRINO 框架上使用 RSPEC 进行测试的教程 - 2

    我是Ruby新手,并被要求在我们的新项目中使用它。我们还被要求使用Padrino(Sinatra)作为后端/框架。我们被要求使用Rspec进行测试。我一直在寻找可以指导在Padrino上使用RspecforRuby的教程。我得到的主要是引用RoR。但是,我需要RubyonPadrino。请在任何入门/指南/引用/讨论等方面指导我。如有不妥之处请指正。可能是我没有针对我的问题搜索正确的词/短语组合。我正在使用Ruby1.9.3和Padrinov.0.10.6。注意:我还提到了SOquestion,但它没有帮助。 最佳答案 我没用过Pa

  7. 区块链入门教程(6)--WeBASE-Front节点前置服务安装 - 2

    文章目录1.任务背景2.任务目标3.相关知识点4.任务实操4.1安装配置JDK4.2启动FISCOBCOS4.3下载解压WeBASE-Front4.4拷贝sdk证书文件4.5启动节点4.6访问节点4.7检查运行状态5.任务总结1.任务背景FISCOBCOS其实是有控制台管理工具,用来对区块链系统进行各种管理操作。但是对于初学者来说,还是可视化界面更友好,本节就来介绍WeBASE管理平台,这是一款微众银行开源的自研区块链中间件平台,可以降低区块链使用的门槛,大幅提高区块链应用的开发效率。微众银行是腾讯牵头设立的民营银行,在国内民营银行里还是比较出名的。微众银行参与FISCOBCOS生态建设,一定

  8. H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档) - 2

    目录H2数据库入门以及实际开发时的使用1.H2数据库的初识1.1H2数据库介绍1.2为什么要使用嵌入式数据库?1.3嵌入式数据库对比1.3.1性能对比1.4技术选型思考2.H2数据库实战2.1H2数据库下载搭建以及部署2.1.1H2数据库的下载2.1.2数据库启动2.1.2.1windows系统可以在bin目录下执行h2.bat2.1.2.2同理可以通过cmd直接使用命令进行启动:2.1.2.3启动后控制台页面:2.1.3spring整合H2数据库2.1.3.1引入依赖文件2.1.4数据库通过file模式实际保存数据的位置2.2H2数据库操作2.2.1Mysql兼容模式2.2.2Mysql模式

  9. ruby-on-rails - rails 教程 : Putting flash messages in partial yields error "undefined method ` each' for nil:NilClass"? - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:FlashMessagesinPartials(Rails3)我正在做MichaelHartl的Railstutorial和listing7.26将flash消息添加到应用程序布局:...">...这很好用。但是,我试图通过在我的部分文件夹中创建一个_flash.html.erb来清理这段代码...">-->...并且比使用......在我的应用程序布局中,我的所有Rspec测试开始失败,每个测试都显示以下消息:Failure/Error:before{visitsignup_path}ActionView:

  10. ruby-on-rails - Ruby on Rails 教程 - 5.26 - Sublime Text "Unable to Save"新文件 "spec/support/utilities.rb" - 2

    我正在使用SublimeText2,同时遵循MichaelHartl的RubyonRails教程。可以在http://ruby.railstutorial.org/book/ruby-on-rails-tutorial找到我所指的教程的具体部分。(ctrl+F“list5.26”)。我能够创建规范/支持文件。但是,在尝试创建spec/support/utilities.rb文件时,我收到消息“无法保存~/rails_projects/sample_app/spec/support/utilities.rb”。有人知道为什么会这样吗?SublimeText论坛上有人似乎遇到了完全相同的问

随机推荐