完整的 multi view stereo pipeline 会有以下步骤

  1. structure from motion(SfM)==> camera parameters, sparse point cloud

  2. multi view stereo(MVS)==>depth map, dense point cloud

  3. surface reconstruction(SR)==>poisson or delauny reconstruction, mesh

  4. texture mapping(TM)==>get mesh with texture

COLMAP整体流程如下图所示

COLMAP重建过程主要步骤

COLMAP 兼容好几种不同的相机模型,我们在使用时可以对相机模型进行限制以获得最好的效果。

如果提前不知道相机内参,最好使用包含畸变系数的模型,默认为 SIMPLE_RAIDIAL

如果已知相机没有畸变或畸变影响很小,建议使用 SIMPLE_PINHOLE 模型。

可供选择的模型分别为

SIMPLE_PINHOLE, PINHOLE, SIMPLE_RADIAL, RADIAL, OPENCV, FULL_OPENCV, 

SIMPLE_RADIAL_FISHEYE, RADIAL_FISHEYE, OPENCV_FISHEYE, FOV, THIN_PRISM_FISHEYE

不同模型含义及参数如下表所示,详见 Camera Models

Camera Models

Pinhole_camera_model

camera_calibration_and_3d_reconstruction

Structure from Motion


运动恢复结构流程如下图所示

运动恢复结构主要步骤

运动恢复结构的目的是求解相机参数,需要把所有输入图片放到一个文件夹下。按如下步骤依次进行。

图像特征提取

相机内参已知的情况下我们可以直接通过命令行参数 ImageReader.camera_params 传给 COLMAP。

a. 相机内参已知

$ colmap feature_extractor \
--database_path ./database.db \
--image_path images \
--ImageReader.camera_model SIMPLE_PINHOLE \
--ImageReader.camera_params "1813.3334,1920,1080" \
--SiftExtraction.max_image_size 3840

其中 camera_params 为 std::string 类型,不同的模型有对应的表示方式。参数及含义参考上面表格中的各种相机模型。

b. 相机内参未知

$ colmap feature_extractor \
--database_path ./database.db \
--image_path images \
--ImageReader.camera_model SIMPLE_PINHOLE \
--SiftExtraction.max_image_size 3840

其中 database_path 设置工程数据文件的保存路径

image_path 设置输入图像所在文件夹路径

camera_model 设置相机模型

max_image_size 设置为大于图像最大边所对应的分辨率的值

图像特征匹配

$ colmap exhaustive_matcher --database_path $DATASET_PATH/database.db

其中 database_path 设置为特征点检测时工程数据文件保存的路径。

相机位姿求解与优化

$ mkdir $DATASET_PATH/sparse

$ colmap mapper \
--database_path $DATASET_PATH/database.db \
--image_path $DATASET_PATH/images \
--output_path $DATASET_PATH/sparse \
--Mapper.ba_refine_principal_point true

模型转换与参数读取

在进行稀疏重建之后,model 默认会被导出到 bin 文件中,因为这样比较紧凑,节省空间,可以使用 COLMAP 的模型转换功能将其转换成 txt 文件。

注意下面的指令中 input_pathoutput_path 是文件所在文件夹的路径,而不是单个文件路径。

$ colmap model_converter \
--input_path $DATASET_PATH/sparse/0 \
--output_path $DATASET_PATH/sparse \
--output_type TXT

a. 相机内参 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

b. 相机外参,包含旋转和平移,以及每张图片中特征点在图像中的二维坐标及其对应的三维稀疏点索引images.txt 格式如下,注意这里的旋转保存为单位四元数形式,与 Eigen::Quaterniond 格式相同

# 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

c. 稀疏三维点云中三维空间点的信息 points3D.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

如果需要进一步 rectify, 可以把参数输入到 OpenCV 的 stereoRectify() 函数中,之后 initUndistortRectifyMap() , 最后使用 remap() 函数进行重映射 从而得到矫正的结果。

Dense Reconstruction


利用前面的步骤求得的相机参数进行稠密重建,由 PatchMatch 求解单视角对应的深度图和法向图,同时根据需要对深度图和法相图进行滤波。

图像畸变矫正

$ mkdir $DATASET_PATH/dense

$ colmap image_undistorter \
--image_path $DATASET_PATH/images \
--input_path $DATASET_PATH/sparse/0 \
--output_path $DATASET_PATH/dense \
--output_type COLMAP \
--max_image_size 3840

立体块匹配

$ colmap patch_match_stereo \
--workspace_path $DATASET_PATH/dense \
--workspace_format COLMAP \
--PatchMatchStereo.max_image_size 3840 \
--PatchMatchStereo.window_radius 9 \
--PatchMatchStereo.geom_consistency true \
--PatchMatchStereo.filter_min_ncc 0.07

对于纹理不是特别丰富的场景,建议增加 windows_radius 以及降低 filter_min_ncc 来提升深度值求解的准确度。

Mesh and Texutre Map


点云融合

$ colmap stereo_fusion \
--workspace_path $DATASET_PATH/dense \
--workspace_format COLMAP \
--input_type geometric \
--output_path $DATASET_PATH/dense/fused.ply

表面网格重建

$ colmap poisson_mesher \
--input_path $DATASET_PATH/dense/fused.ply \
--output_path $DATASET_PATH/dense/meshed-poisson.ply $ colmap delaunay_mesher \
--input_path $DATASET_PATH/dense \
--output_path $DATASET_PATH/dense/meshed-delaunay.ply

—————— END ——————

本文作者 :phillee

发表日期 :2021年1月27日

本文链接https://www.cnblogs.com/phillee/p/14335034.html

版权声明 :自由转载-非商用-非衍生-保持署名(创意共享3.0许可协议/CC BY-NC-SA 3.0)。转载请注明出处!

限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

COLMAP简易教程(命令行模式)的更多相关文章

  1. 好压(HaoZip)的命令行模式用法介绍

    好压压缩软件,又叫“2345好压”,是一款国产的优秀压缩软件,目前是免费的,据官网介绍,该软件永久免费.官网地址:http://haozip.2345.com/ 本文主要对该软件的命令行模式用法进行介 ...

  2. WinRAR的命令行模式用法介绍

    因工作中要对数据打包,顺便研究了下WinRAR的命令行模式,自己写了些例子,基本用法如下: 测试压缩文件准备:文件夹test_data,内部包含子文件夹,分别存放了一些*.log和*.txt文件. 测 ...

  3. 命令行模式 svn版本管理

    linux 下svn 在命令行模式下的操作安装完svn服务并配置了环境变量之后,要创建一个存放工厂(项目)的仓库repositories用于版本控制(比如我的repositories的路径为 path ...

  4. Linux 命令行模式 你需要知道的那些事

    注: 安装软件 pip install + 软件名  例如: pip install xadmin 卸载软件 pip uninstall + 软件名 例如 pip uninstall xadmin 安 ...

  5. 如何在命令行模式下查看Python帮助文档---dir、help、__doc__

    如何在命令行模式下查看Python帮助文档---dir.help.__doc__ 1.dir函数式可以查看对象的属性,使用方法很简单,举str类型为例,在Python命令窗口输入 dir(str) 即 ...

  6. Linux 开机启动方式设置 inittab 详解,开机直接进入“命令行”模式

    Linux下的 /etc/inittab 中的英文解释: This file describes how the INIT process should set up  the system in a ...

  7. Ubuntu 开机进入命令行模式

    1.修改配置 sudo vim /etc/default/grub 把 GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" 改为 GRUB_CMDL ...

  8. 命令行模式下 MYSQL导入导出.sql文件的方法

    一.MYSQL的命令行模式的设置:桌面->我的电脑->属性->环境变量->新建->PATH=“:path\mysql\bin;”其中path为MYSQL的安装路径.二.简 ...

  9. [转载] ubuntu开机直接进入命令行模式

    最近安装了ubuntu12.04来使用,每次都进入unity界面再进入命令行很不方便. 不需要界面的话,可以通过设置来开机进入命令行模式. 今天提供两中比较好的方法.经本人测试两中方法都可使用. [1 ...

随机推荐

  1. 容器编排系统k8s之Service资源

    前文我们了解了k8s上的DemonSet.Job和CronJob控制器的相关话题,回顾请参考:https://www.cnblogs.com/qiuhom-1874/p/14157306.html:今 ...

  2. 从零到一快速搭建个人博客网站(域名自动跳转www,二级域名使用)(二)

    前言 本篇文章是对上篇文章从零到一快速搭建个人博客网站(域名备案 + https免费证书)(一)的完善,比如域名自动跳转www.二级域名使用等. 域名自动跳转www 这里对上篇域名访问进行优化,首先支 ...

  3. 关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析

    关于 ReentrantLock 中锁 lock() 和解锁 unlock() 的底层原理浅析 如下代码,当我们在使用 ReentrantLock 进行加锁和解锁时,底层到底是如何帮助我们进行控制的啦 ...

  4. openstack高可用集群20-openstack计算节点宕机迁移方案

    openstack计算节点宕机迁移方案   情景一:/var/lib/nova/instances/ 目录不共享的处理方法(类似手动迁移云主机到其他节点)

  5. Sentinel滑动窗口算法

    在前面搞清楚了Sentinel的使用后,大致理了一下Sentinel的责任链,搞清楚了这个,基本就已经梳理清楚sentinel-core模块的大部分内容,顺着这条链路可以继续梳理很多东西. 知其然.知 ...

  6. [LeetCode]501. Find Mode in Binary Search Tree二叉搜索树寻找众数

    这次是二叉搜索树的遍历 感觉只要和二叉搜索树的题目,都要用到一个重要性质: 中序遍历二叉搜索树的结果是一个递增序列: 而且要注意,在递归遍历树的时候,有些参数如果是要随递归不断更新(也就是如果递归返回 ...

  7. zigzag压缩算法

    前文 Base 128 Varints 编码(压缩算法) 介绍了Base 128 Varints这种对数字传输的编码,了解到了这种编码方式是为了最大程度压缩数字的.但是,在前文里,我们只谈论到了正数的 ...

  8. TurtleBot3 Waffle (tx2版华夫)(4)笔记本与TX2的通信

    4.1. 使用vnc控制华夫Turbot3-Tx2开发板 1) 电脑端安装vnc viewer,您可以选择应用商城下载安装即可: 2) 下载后打开,键入Turbot3的ip à回车à选择连接: 3)  ...

  9. 为什么Elasticsearch不适合做数据存储?(转学习使用)

    一.问题描述 公司想尝试使用Elasticsearch来存一部分数据,以此缓解数据增长带来的对数据库的压力.在研究了一段时间后,发现Elasticsearch不适合作为数据存储使用. 二.理由如下 1 ...

  10. ElasticSearch教程——自定义分词器(转学习使用)

    一.分词器 Elasticsearch中,内置了很多分词器(analyzers),例如standard(标准分词器).english(英文分词)和chinese(中文分词),默认是standard. ...