完整的 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. 只要肯下功夫,十岁也能学得会的 Docker 精简版!

    目录 一.Docker简介 1.1 什么是Docker 1.2 Docker中包括三个基本的概念 1.3 Docker组件 1.4 安装Docker 二.Docker常用命令 三.应用部署 3.1 m ...

  2. .Net Core 审计日志实现

    前言: 近日在项目协同开发过程中出现了问题,数据出现了异常:其他人员怀疑项目数据丢失程序存在问题.于是通过排查程序提供的审计日志最终还原了当时操作及原因. 可见审计日志在排查.定位问题是相当有用的,那 ...

  3. Windows权限维持

    前言 最近终于不是那么忙了,有时间静下心来学点知识,这篇文章自起稿到发布,用时近三周,其中有近一周的时间在迷茫在焦躁,甚至怀疑.否定自己.网上的表哥们个顶个儿的优秀,于是就给自己很大的压力,所以那一个 ...

  4. 如何对项目中的问题进行分析——FPGA失败案例小结

    本人最近在做一个小项目,自己取名叫做<基于zedboard的千兆以太网底层设计>,一般我都是写好各模块的verilog代码,确定模块没bug后再做整个系统级联,之后直接先进行综合看看有没有 ...

  5. 高并发redis分布式锁

    1.方法一 2方法二

  6. [LeetCode]234. Palindrome Linked List判断回文链表

    重点是: 1.快慢指针找到链表的中点.快指针一次走两步,慢指针一次走一步,分清奇偶数情况. 2.反转链表.pre代表已经反转好的,每次将当前节点指向pre /* 快慢指针得到链表中间,然后用206题方 ...

  7. 单细胞分析实录(4): doublet检测

    最近Cell Systems杂志发表了一篇针对现有几种检测单细胞测序doublet的工具的评估文章,系统比较了常见的例如Scrublet.DoubletFinder等工具在检测准确性.计算效率等方面的 ...

  8. java异常相关说明(printStackTrace,fillInStackTrace等)

    我们在实际场景中很容易catch(Exception e) 简单粗暴 这样写代码有几个问题 1.你无法细分具体异常 因为有时需要针对不同异常 产生不同的应对行为 2.直接exception 往往不会包 ...

  9. 伯俊BOS2.0店铺收入对账功能设计

    一.客户需求 通过导入银行POS机流水,将流水与ERP系统的零售付款数据进行对比,统计差异! 二.功能设计 1.新增"POS机号对应表单",用于维护POS机与erp店仓对应 2.新 ...

  10. VoltDB成功入选CNCF Landscape云原生数据库全景图

    近日,VoltDB正式入选 CNCF Landscape(可能是目前其中唯一的关系型分布式内存数据库).此次VoltDB 进入 CNCF Landscape,意味着 VoltDB 正式成为了 CNCF ...