使用Colmap及MeshLab进行传统三维重建

Colmap安装


参考我的另一篇博客

流程概述


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

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

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

1 特征检测与提取

2 特征匹配和几何验证

3 结构与运动重建

62F04787-5D3D-4638-AF5A-862CE30B48B4.png

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

数据采集


参考:多视角三维重建(MVS)数据采集
在本次试验中我们共使用了113张照片,分别拍摄于早中晚不同的时间,使用设备为移动手机。

Colmap GUI操作


1. 准备工作

  1. 创建工程目录Project1
  2. 在其中创建images目录并存放原始图像
  3. 运行colmap gui,点击file - New Project弹出Project窗口
  4. 在Database行点击New,在Project1目录中创建database-pj1.db文件用于存储原始图片地址、特征匹配等数据
  5. Images行点击Select选择场景原始图片所在目录
  6. 最后点击save 初始的目录结构为:
    在这里插入图片描述

2. 特征提取

此步骤进行对应点搜索,可以理解为全局特征匹配 点击processing - Feature Extraction

  • 选择Parameters from EXIF:从EXIF中提取相机内参(一般采集到的影响都携带EXIF文件)
  • 其他参数暂且默认 然后点击Extract进行特征提取
    在这里插入图片描述

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

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

提取到的特征信息如下:

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

其中X, Y, SCALE, ORIENTATION为浮点数,D\_1D\_1280255范围内的值。
在这里插入图片描述

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

在这里插入图片描述

3. 特征匹配

点击processing - Feature Matching,参数全部选用默认,然后点击Run进行特征匹配

这个步骤结束之后会自动生成场景图匹配矩阵(以不同视图之间同名特征数为权重,以不同视图为图节点的图结构)

从右侧的Log中可以看到这两步的输出

在这里插入图片描述

特征匹配首先匹配图像对,下面列出图像匹配的几种策略。其次再将匹配后的图像上的特征点进行匹配,利用特征点的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,然后统计满足对极几何关系的点对数量,在设定的次数内重复上述步骤,选取满足条件的点对数量最多的匹配为精化匹配结果。

4. 增量式建模

点击reconstruction - start reconstruction进行一键式增量迭代重建

此步骤逐渐增加视角,并进行迭代优化重投影误差 目的是计算不同视图的相机参数、得到场景的稀疏点云和确定不同视图与点云间的可视关系 最后可以得到场景的稀疏点云和各个视角的相机姿态

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

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

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

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

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

在这里插入图片描述

以第49张图像(39个视角)为例

  • 已有点云576个
  • 首先进行姿态估计(Pose Refinement Report)
  • 再进行BA优化:整体稀疏点云融合测量点149个,滤除测量点32个
  • 再进行三角测量(Retriangulation)
  • 最后再进行迭代全局的BA优化,优化已有相机的姿态和三维稀疏点云坐标
==============================================================================
Registering image #39 (49)
==============================================================================

  => Image sees 576 / 991 points

Pose refinement report
----------------------
    Residuals : 1132
   Parameters : 8
   Iterations : 7
         Time : 0.0134351 [s]
 Initial cost : 0.535158 [px]
   Final cost : 0.462099 [px]
  Termination : Convergence

  => Continued observations: 540
  => Added observations: 73

Bundle adjustment report
------------------------
    Residuals : 24684
   Parameters : 2030
   Iterations : 21
         Time : 0.501096 [s]
 Initial cost : 0.374389 [px]
   Final cost : 0.367663 [px]
  Termination : Convergence

  => Merged observations: 149
  => Completed observations: 27
  => Filtered observations: 32
  => Changed observations: 0.016853

Bundle adjustment report
------------------------
    Residuals : 24690
   Parameters : 2000
   Iterations : 3
         Time : 0.0764892 [s]
 Initial cost : 0.430376 [px]
   Final cost : 0.427614 [px]
  Termination : Convergence

  => Merged observations: 10
  => Completed observations: 1
  => Filtered observations: 0
  => Changed observations: 0.000891

==============================================================================
Retriangulation
==============================================================================

  => Completed observations: 9
  => Merged observations: 186
  => Retriangulated observations: 0

稀疏重建效果
在这里插入图片描述

深度图估计与优化


Colmap中代价构造、累积、估计和优化是封装在一起的,利用GEM模型进行求解 主要分为四个步骤:匹配代价构造 -> 代价累积 -> 深度估计 -> 深度图估计

这里的原理暂时省略,多视图几何三维重建实战系列之COLMAP

稠密重建

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

稠密重建分为:

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

2 是计算深度图和法向图

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

4 点云网格划分形成曲面

1. 图像去畸变

点击reconstruction - dense reconstruction,在稠密重建窗口中点击select选择文件存放位置,然后点击undistortion即可去除图像畸变
在这里插入图片描述

带有畸变的图像会导致边缘有较大的时差估计误差,因此在深度图估计之前,使用光学一致性和几何一致性联合约束构造代价匹配

dtu数据集和之前配置成针孔模型已经隐含无畸变 如果使用自采集数据集需要更改相机模型为带畸变参数的相机模型

2. 深度估计

在稠密重建窗口中点击stereo进行场景深度估计 深度估计结束后可以得到photometricgeometric下的深度图和法向量图

这一步很慢而且资源消耗比较大

在这里插入图片描述

之后点击红框里的这些就可以观察光学一致性photometric和几何一致性geometric后的depth map和normal map

在这里插入图片描述
在这里插入图片描述

Colmap会利用光学一致性同时估计视角的深度值和法向量值,并利用几何一致性进行深度图优化


3.稠密重建

点击Fusion即可进行基于深度图融合的稠密重建

在这里插入图片描述

重建后会在dense中生成ply模型文件

可视化显示


Meshlab

安装MeshLab进行显示

Colmap GUI

或者采用Colmap GUI官方的可视化方法,点击File - Import model from...,选择生成的fused.ply即可打开查看融合后的点云效果;不过meshed-poisson.ply无法打开,还是要使用Meshlab

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

在这里插入图片描述

<think>好的,用户遇到了COLMAP打开文件时闪退的问题,我需要帮他找到可能的原因和解决方案。首先,我得回想一下常见的软件闪退原因,比如兼容性问题、依赖库缺失、文件损坏、硬件资源不足或者配置错误等。 用户之前提到了在Windows下编译安装COLMAP时遇到了Boost库的问题,现在可能相关依赖没有正确安装,导致运行时闪退。比如Boost库或其他依赖库版本不兼容或者安装不完整,可能会在程序启动时崩溃。 另外,用户提到导入fused.ply文件可以打开,但meshed-poisson.ply无法打开,这说明可能是特定文件格式的问题。如果用户现在尝试打开的是meshed-poisson.ply,可能需要检查文件是否损坏,或者COLMAP是否支持该格式。不过,用户现在的问题是一打开文件就闪退,可能不是特定文件的问题,而是软件本身的问题。 接下来,可能的解决步骤包括检查系统兼容性,比如是否满足COLMAP的Windows版本要求,是否安装了最新的显卡驱动,因为COLMAP依赖CUDA加速。如果驱动过旧,可能导致崩溃。 然后,检查依赖库是否完整。用户之前编译安装可能缺少某些运行时依赖,比如Visual C++ Redistributable包或者CUDA工具包。需要确认这些是否已正确安装。 另外,用户可能在编译时某些选项没有正确配置,比如没有启用必要的功能或链接了错误的库版本。重新编译并确保所有依赖库正确安装可能有效。 还有可能是文件路径问题,比如路径中包含中文或特殊字符,导致程序无法正确读取文件而崩溃。建议用户尝试将文件放在纯英文路径下,并确认路径没有空格或特殊符号。 此外,查看日志文件是诊断问题的关键步骤。COLMAP应该会生成日志文件,用户需要找到日志的位置,检查其中的错误信息,比如缺少DLL文件或其他运行时错误。 如果以上方法无效,可以尝试使用预编译的二进制版本,避免编译过程中的潜在问题。或者使用Meshlab等其他软件打开文件,但用户的问题在于COLMAP本身,所以可能需要进一步调试。 最后,考虑硬件资源是否足够,比如内存不足可能导致处理大文件时闪退。关闭其他程序释放资源,或者使用简化后的数据测试是否仍然崩溃。 总结下来,解决方案可能包括检查依赖库、更新驱动、验证文件路径、查看日志、使用预编译版本以及检查硬件资源等步骤。</think>关于COLMAP打开文件闪退问题的解决方案,请按以下步骤排查: 1. **检查系统兼容性** - 确认操作系统为Windows 10/11且版本不低于1903 - 确保已安装最新显卡驱动(NVIDIA显卡需安装CUDA 11.0+) - 验证系统环境变量PATH是否包含Visual Studio 2019运行时库路径 2. **依赖库完整性验证** ```powershell # 执行依赖库检查命令 vcpkg list | findstr "boost eigen flann ceres gflags glew glog qt5" ``` 若输出显示有缺失库,需重新执行: ```powershell vcpkg install colmap --triplet x64-windows ``` 3. **文件路径规范** - 将待打开文件存放路径改为全英文(如`D:\colmap_data\project`) - 路径层级不超过3层 - 文件名不含特殊符号(建议仅使用字母、数字和下划线) 4. **日志分析** 在`C:\Users\[用户名]\AppData\Local\Temp\colmap.log`中查找关键错误: - 若出现`Failed to load DLL: gflags.dll`,需将vcpkg安装目录的`installed\x64-windows\bin`加入系统PATH - 若出现`CUDA error`,执行`nvidia-smi`验证CUDA状态 5. **预编译版本测试** 访问[COLMAP Releases](https://github.com/colmap/colmap/releases)下载: ```markdown 推荐选择`COLMAP-3.8-windows-cuda.zip`版本 解压后直接运行bin目录下的colmap.bat ``` 6. **硬件资源监控** - 打开任务管理器观察内存占用 - 处理大场景时建议内存≥32GB - 点云文件超过1GB时尝试使用: ```bash colmap gui --max_image_size 2000 ``` [^1]: 编译依赖问题可能导致运行时库缺失,建议通过vcpkg完整安装所有依赖项 [^2]: 点云文件兼容性问题可尝试导出为.ply格式时选择ASCII编码而非二进制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ajaxm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值