一份colmap tutorial的阅读笔记(更新中)——Windows版本

一、colmap的安装

1.1 Windows下安装

很简单,下载,双击,打开即可,官网地址:

COLMAP - Structure-From-Motion and Multi-View Stereo (demuc.de)https://demuc.de/colmap/如果电脑有NVIDIA显卡可以使用cuda版本,也可以不使用显卡安装no-cuda版本,如果没有NVIDIA显卡就使用no-cuda版本

d3f7cc573f5e40df92f093eccc8f1b95.png

解压以后双击打开

a948410789e4423c8733444e6fb4cd03.png

二、使用

先准备好数据,可以在官网下载一个,注意,图片数量越大越需要好的硬件(显卡或者cpu),链接:

Datasets — COLMAP 3.9-dev documentationhttps://colmap.github.io/datasets.html

2.1快速开始

就是直接把图片重建成三维模型,只需要注意两点,一个是图片的路径,另一个是模型要保存的路径。在colmap界面依次点:Reconstruction > Automatic Reconstruction,点击以后会弹出来这个窗口,看图操作即可开始一个简单的三维重建过程!

939477cd05f34570aa4a4779b15ed81e.png

53bca20a94494fd495a39bdac4fbca4d.png

好的,现在重建开始!你的命令行/终端里面会依次自动显示类似以下信息,事实上,这就是一般的SFM重建过程,只不过一般咱们是分开执行罢了,这里因为使用了 Automatic Reconstruction所以是自动执行的。这个过程会持续一段时间,如果你的电脑显卡或者cpu比较好,会快一些。

ca92d5d574b3441f959b6a7cd7e1270d.png

37ac4d6ab5b848bcac84fef8796f4a5e.png

5bdbe23a17434aedae5e62c4071678bf.png

完成重建:这里提示导入重建的稀疏模型以进行可视化。这些模型还被导出到工作空间中的 sparse 下的子文件夹中。点击ok即可

520e7cd591804de2991ade4b7002a872.png

然后又提示:如果想可视化一个稠密点云,依次点击File > Import model from 路径来导入,如果想查看这个稠密点云构建的mesh,可以安装meshlab来查看它,点击ok,再附上meshlab的官网:

MeshLabhttps://www.meshlab.net/833b2eaf84f8425782f94a3080c66a50.png

可以看到,构建好的稀疏点云如下

50eb95adb8c64ecaac94d33a839c6c29.png

 tips1 colmap里面输入的路径不要出现中文,否则报错!!!

11051e3054d14c9cb0666d4053ede426.png

tips2 完成重建以后,不管是稀疏重建(sparse reconstruction)还是稠密重建(dense reconstruction)都会是同一个目录样式,来自官网的截图:

298dbe61aed1486686c092e5ece7288c.png

2.2三维重建的基本方法——从运动到结构SFM(Structure-from-Motion)

33a61c6555744dd3b7dd0ffe5c627b2c.png

pipeline包括3个步骤:特征提取(feature extraction)>特征匹配(feature matching)>运动结构重建(Structure and motion reconstruction)

如果使用你自己拍摄的图片进行重建,为了使重建效果更好,在拍摄的过程中需要注意几个技巧:

  • 拍摄具有良好纹理的图像。避免完全无纹理的图像 (例如,白墙或空桌子)。如果场景包含的内容不足 纹理本身,您可以放置其他背景对象,例如 海报等

  • 相似的照明条件下捕获图像。避免高动态 范围场景(例如,带有阴影或图片的太阳照片 通过门/窗)。避免在有光泽的表面上出现镜面反射。

  • 捕获具有高度视觉重叠的图像。确保每个对象都是 至少可以看到 3 张图像 - 图像越多越好。

  • 不同角度捕获图像。不要从 仅通过旋转相机即可实现相同的位置,例如,在每次旋转后走几步 拍摄。同时,尝试从相对相似的图像中获得足够的图像 观点。请注意,图像越多不一定越好,可能会导致 重建过程缓慢。如果您使用视频作为输入,请考虑 对帧速率进行下采样。

2.3 多视立体(几何)Multi-View Stereo(geometry)

MVS首先利用SFM的重建的稀疏点云计算图片上每一个像素的深度和法线,然后混合了深度和法线以后生成对应的稠密点云,具体使用的算法比如泊松表面重建,更多MVS方法参考

Bibliography — COLMAP 3.9-dev documentationhttps://colmap.github.io/bibliography.html#schoenberger16mvs

2.4正式开始——image数据放置有规定

COLMAP 假设所有输入图像都在一个输入目录中,并且可能嵌套有子目录。它递归地考虑存储在其中的所有图像目录,也就是说,COLMAP 会默认处理一个文件夹下所有的图片,无论这个文件夹下只有图片,还是有很多子文件夹(图片在子文件夹下)。图片之外的其他文件会自动忽略,首先我们来新建这个project,点击file,选择new project,在相应的位置输入路径即可,按图提示操作,图片位置和database应该在同一个文件夹底下。

b981fc0056ca470a9b533c6ffbac345e.png

关于database,在自己填入名字确定以后,colmap会自己生成一个database.db文件:

b1f4f3611c894b9b8151e36be39e11c3.png

创建好项目文件以后他应该长这样:project.ini是在保存这个project时手动输入名称的一个配置文件

3961dc0c58ab4478a23611071a7e0f14.png

在正式开始之前,我们假定你了解计算机视觉的基础,比如,图像的特征点,以及图像之间的特征点匹配。

2.5第一步——特征提取(feature extraction

依次点击:Processing > Extract features,会弹出一个菜单,如图

f4a3a911b0984a8e9006050f9332d71e.png

camera model是相机模型,一般都是针孔相机(pinhole),opencv里面也是针孔相机模型,如果你的图片是同一个相机拍的,那么就选择shared for all images,也就是所有照片都共享一个相机模型参数,如果是多个相机拍的,就选下面一项shared for sub-folder。

另外,如果你在提取特征过程中打断了这个进程,那么在下次重新运行这个project提取特征时,会在之前已经提取的特征基础上继续该工作,应该是特征提取结果会自己保存。

图中什么是EXIF:其实就是包含相机内参的一堆参数信息

EXIF(Exchangeable Image File Format)是一种标准格式,用于存储数码照片和音频文件中的元数据。这些元数据包括拍摄照片时的设置和情况,如相机型号、拍摄时间、ISO设置、快门速度、光圈、焦距、是否使用闪光灯等信息。此外,如果设备支持GPS功能,EXIF数据还可以包含地理位置信息,如拍摄地点的经度、纬度和海拔高度。

这些信息可以被不同的软件和服务读取和使用,例如图片编辑软件、图片浏览器和地理标记服务等。在3D重建和摄影测量软件如COLMAP中,EXIF中的这些信息(特别是相机参数和GPS数据)可能被用来帮助确定图像之间的位置关系和世界坐标,从而提高重建的精确性和实用性。

提取结束以后,他的命令行/终端里面会显示:

60f36d2bb7ca49a697d3b7d413baaef6.png

colmap界面里也会有:

95c846b2e64749ba8158524bad9c9e1b.png

2.6第二步——特征匹配(feature matching)

这一步有多种选项:

41f01bfaf33b407f8ffaf2546ff91432.png

再这里一一介绍一下:

(1)穷尽匹配(Exhaustive Matching)

其实就是一个数据集里面,两个两个互相匹配,这种匹配方式结果较为精确,但是缺点也很明显,假如你的数据集有5000张图片,两两匹配要匹配多少次?没错一共是[(4999+1)×4999]/2次,毫无疑问非常耗时间,因此,Exhaustive Matching只是适合用于几百张图(<1000)的数据集。

(2)词树匹配(Vocabulary Tree Matching)

每个图像使用空间重新排名的词树与视觉最近邻的图片进行匹配,这种模型可以处理数量很大的数据集(>=1000),这个词树匹配模型是预训练的,模型下载地址:

COLMAP - Structure-From-Motion and Multi-View Stereo (demuc.de)https://demuc.de/colmap/(3)序列匹配(Sequential Matching)

这个方法是一个内置的循环检测,每第N个图片与其视觉最近邻(小问题:视觉最近邻是不是说RGB)的图片进行匹配,这个方法主要针对于序列数据,没错,说的就是你——视频,在视频连续帧之间,是有视觉重叠的,因此没有必要再去做两两匹配!序列匹配是基于词树Vocabulary Tree模型的,需要先下载好预训练的模型视频和帧的概念:视频是由一系列连续的图像(称为帧)组成的。视频的帧率(Frames Per Second,FPS)指的是每秒钟播放的图像数量。例如,一个视频以30帧每秒(30 FPS)的速率播放,意味着每秒钟会有30张图片在屏幕上连续播放

另外,需要注意Sequential Matching的文件夹内,图片命名是有规定的,需要以连续的形式: ( image0001.jpg, image0002.jpg, etc.),个人觉得这里应该把视频拆成帧来提取图片的,根据时间线来定义、命名文件名及其顺序 。

ffmpeg具有拆帧成图的功能,有python第三方库以及应用:安装通过pip install ffmpeg或者sudo apt-get install ffmpeg

(4)空间匹配(Spatial Matching)

每个图像和他空间上最近邻的图像进行匹配,默认情况下,COLMAP从EXIF中提取GPS信息,用于空间最近邻搜索。

(5)传递匹配(Transitive Matching)

通过匹配算法找到每对图像之间的初始匹配点对,然后使用已存在特征匹配的传递关系来生成更完整的匹配图。如果图像 A 与图像 B 匹配,而图像 B 与图像 C 匹配,则此匹配器将尝试直接将 A 与 C 匹配

(6)自定义(Custom )

用户自己指定要匹配的单个影像对或导入单个要素匹配。

在视力中,我们数据集中有128张图片,所以选择的是Exhaustive Matching:

d7aa0aa4841444afa8aabb51cb1c45f1.png

与前面的特征提取相同,如果你在特征匹配过程中打断了这个进程,那么在下次重新运行这个project特征匹配时,会在之前已经匹配的特征基础上继续该工作,应该是特征匹配结果会自己保存。

2.7稀疏重建(sparse reconstruction)

ok!完成了前面两步,就可以开始稀疏重建了,依次点击Reconstruction > Start Reconstruction即可开始,等着他结束就可以了,下面是完成的稀疏点云:

4f15091a4fcd452caa34d0c760bb577f.png

里面的bundle ajustment直观地讲其实就是一个迭代优化的过程,可以最大数量地把图片和3D模型对应起来,具体可以看这位老哥的解释:

Bundle Adjustment简述_bundle adjustemnt-CSDN博客https://blog.csdn.net/OptSolution/article/details/64442962?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171353365916800197053276%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=171353365916800197053276&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-64442962-null-null.142%5Ev100%5Epc_search_result_base9&utm_term=bundle%20adjustment&spm=1018.2226.3001.4187保存模型:依次点击File > Export model,选择要保存的文件夹即可

保存点云:依次点击File > Export model as,在弹出的菜单中选择.ply格式,取个文件名就完了。

56b949c5bf8b48d2999bca480b171c69.png

tips3:可以调整一下每一个点的大小,看起来效果更加好一点

5f718f5d19ef44cc9075178abd0e7c5b.png

bc0bf204e60147ab813a58ed73f8bf7b.png

2.8导入与导出

(1)导出

建好模型需要导出来保存,就是上面稀疏重建最后那里的步骤,另外,上面的导出是.bin格式,还能换格式导出,依次点击File > Export model as text,这样就会转换成.txt格式,插一句嘴,转换是为了做其他模型的输入,比如,3D Gaussian Splatting就需要输入稀疏点云。导出这里有点麻烦!!!还是重新总结一下:

保存project:就是File > save project手动输入名称的一个配置文件,会生成文件名.ini的配置文件

保存模型:依次点击File > Export model,选择要保存的文件夹即可,这会把模型保存为3个文件:image.bin,camera.bin,point3D.bin

保存点云:依次点击File > Export model as,在弹出的菜单中选择.ply格式,取个文件名就完了。

(2)导入

File >Import model,导入包含image.bin,camera.bin,point3D.bin,或者这些文件的txt格式的文件夹,一般情况下这三个文件保存在sparse下

File >Import model from,导入.ply文件。

2.9稠密重建(dense reconstruction)

(1)稠密重建总体方法

colmap集成了基于MVS由稀疏点云到稠密点云的pipeline,具体是根据稀疏点云和相机pose计算深度和法线然后混合深度图和法线图到具有归一化信息的稠密点云, 最后利用poison表面重建方法估计一个稠密表面出来。Delaunay reconstruction是跟poison表面重建类似的方法

(2)具体步骤与执行

点击Reconstruction > dense reconstruction,首先选择重建好的稀疏点云进来,然后选择好workspace也就是输出稠密点云的路径

然后正式进入稠密重建流程:

56fa5246eaa14bfe8f9bdeefbb3cd4c3.png

1.Undistorted去畸变

2.利用stereo计算深度以及法线

 确实很费时间:4050的显卡用了88分钟

828887c875984a3fa36581cdb3e522fa.png

3.把深度和法线数值fuse到点云里面,变成稠密点云,还可以选择把稠密点云变成mesh,然后选择poison进行稠密表面重建

fusion完成以后:

6bee97440c0749afbb5ee8f3c66402dc.png

界面内提示可视化方式:

00bdb26328514e9795d72e3cf5c0782a.png

泊松mesh:

05672377789e4d0eac1ef4f6ffad96fc.png

完成mesh

98990696bb60479896793d6a430b6b41.png

可以看到文件夹内有两个.ply文件,一个是直接用深度图和归一化fuse的点云。另一个是poison mesh

28effcaa06054701bfad676a6e53f4c1.png

点云:

82d9f8b93ac24535bd624bfca7fc0384.png

colmap中查看这个点云:

ae2e9581eccd4308b33577cee68757ab.png

poison mesh

901bad5aec8247e69b3fd225757fdcc4.png

4.note:计算深度时有可能卡住,如果显存不够程序可能会崩溃,避免此类问题可以参考FAQ:
Frequently Asked Questions — COLMAP 3.9-dev documentationhttps://colmap.github.io/faq.html#faq-dense-memory5.normal结果在colmap内不可见,但是可以在MeshLab中查看:Render > Show Normal/Curvature,类似,稠密的mesh只能在其他软件中查看,比如MeshLab

6.colmap除了普通的mvs进行稠密重建以外,还有其他方法进行,比如CMVS,PMVS等,具体的执行不介绍了,以及对于大量图片的重建,可能需要先用cmvs进行聚类等等,不具体介绍了。

2.10Database Management

可以修改图像,相机,匹配信息,通过Processing > Manage database,通过Show image ,Overlapping images来查看每一张图的特征与匹配信息,双击修改,点击save才能修改成功。说明database文件就是记录图像,相机,匹配信息的一个文件。3781c7326c604b9bbb66ac34206465f8.png

2.11命令行与终端

COLMAP的大部分特性都可以从图形界面和命令行界面访问,这两个界面都嵌入在同一个可执行文件中。可以直接将选项作为命令行参数提供,也可以提供.ini项目配置文件,其中包含使用--project_path path/to/project.ini。要启动GUI应用程序,请执行colmap gui或直接将项目配置指定为colmap gui --project_path path/to/project.ini避免GUI中乏味的选择。要列出命令行中可用的不同命令,请执行colmap help例如,要从命令行运行特征提取,必须执行colmap feature_extractor. The图形用户界面和命令行界面部分提供有关可用命令的详细信息。

目前只有Windows版本的实例,Ubuntu中的终端实例,请看我的另一篇,Ubuntu版本

 

 

 

  • 25
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 很高兴能够为您服务。Colmap和OpenMVS是两种三维重建技术,Colmap使用稠密图估计技术来提取图像的结构和视差图,而OpenMVS则使用深度估计技术,它使用更复杂的算法来处理图像,可以提高重建的准确度。 ### 回答2: COLMAP和OpenMVS是两种常用的三维重建软件工具,它们在图像处理、特征匹配、三维点云生成等方面有着各自的特点。 COLMAP是一个开源的三维重建软件,主要用于结构化重建。它能够使用大量的图像来构建三维场景,并生成高质量的点云和稠密地图。COLMAP使用视觉几何技术,包括特征提取、特征匹配和相机姿态估计等,以及三角测量和非线性优化等算法来进行三维重建。COLMAP的特点是准确性高、稠密度好,但对于大规模场景处理速度较慢,对于计算资源有一定要求。 OpenMVS是一个用于多视图密集重建的开源软件。它基于图像处理和计算几何算法,能够从来自不同角度的图像生成细致的三维模型。OpenMVS的特点是处理速度快、对于大规模数据处理也比较高效。它通过多视图稠密重建、稀疏点云三角化和纹理映射等算法来实现三维重建。OpenMVS适用于需要对大规模数据进行快速重建的情况。 综上所述,COLMAP和OpenMVS都是常用的三维重建软件工具,它们在特点和适用场景上有些区别。COLMAP适用于对结构化场景进行准确重建,而OpenMVS适用于对大规模数据进行快速重建。选择使用哪种软件工具应根据具体的需求和项目要求来决定。同时,COLMAP和OpenMVS都有各自的优点和局限性,可以根据具体情况选择使用或结合使用,以得到更好的三维重建结果。 ### 回答3: Colmap和OpenMVS是两种用于三维重建的计算机视觉工具。其Colmap是一个用于密集三维重建和相机定位的开源软件包,而OpenMVS是一个用于稠密三维重建的工具。 Colmap主要用于从一组相片生成稀疏重建结果,并且可以使用这些结果进行稠密三维重建。它使用SIFT或者其他特征提取算法来提取图像的特征点,并通过这些特征点来计算相机的姿势。然后,Colmap通过对特征点进行三角化,重建相机姿势和特征点的3D位置来生成稀疏点云。接下来,可以使用这些点云来生成稠密的三维重建结果。Colmap具有较高的精度和鲁棒性,适用于从大规模图像集合进行三维重建。 OpenMVS是一个专门用于稠密三维重建的工具。它接受稀疏点云和图像作为输入,然后通过将图像投影到点云上来生成稠密点云。OpenMVS采用了特定的密集重建算法,可以精确地重建物体的表面形状和纹理信息。此外,OpenMVS还提供了更多的后处理和可视化工具,以优化和改进重建结果。 Colmap和OpenMVS具有各自的特点和优势。Colmap对于从大型图像集合进行稀疏重建非常强大,而OpenMVS则更专注于产生高质量的稠密重建结果。两者可以搭配使用,通过先用Colmap生成稀疏点云,再输入给OpenMVS生成稠密点云,从而实现更全面和精细的三维重建。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值