COLMAP简明教程 重建 转化深度图 导出相机参数 导入相机参数 命令行
COLMAP简明教程 导入指定参数 命令行 导出深度图
COLMAP是经典的3D重建、SfM、深度估计开源工作,配置和安装按下不表,本文主要从命令行的角度,对COLMAP的基本用法做教程,并备收藏和笔记。
对指定图像进行重建和深度估计
准备好一些多视角图像,放入一个文件夹中,如下所示:
├── images/├── 0.png├── 1.png......├── 12.png
如果图像是针孔相机拍摄的,就在根目录下执行以下命令:
colmap feature_extractor --database_path database.db --image_path images --ImageReader.camera_model PINHOLE
colmap exhaustive_matcher --database_path database.db
mkdir sparse
colmap mapper --database_path database.db --image_path images --output_path sparse
mkdir dense
colmap image_undistorter --image_path images --input_path sparse/0 --output_path dense --output_type COLMAP
colmap patch_match_stereo --workspace_path dense --workspace_format COLMAP --PatchMatchStereo.geom_consistency true
colmap stereo_fusion --workspace_path dense --workspace_format COLMAP --input_type geometric --output_path dense/fused.ply
colmap poisson_mesher --input_path dense/fused.ply --output_path dense/meshed-poisson.ply
colmap delaunay_mesher --input_path dense --output_path dense/meshed-delaunay.ply
这些命令分别用于提取图片特征、特征匹配、稀疏重建、去畸变、稠密重建、点云构建、mesh
文件构建。如果图像不是针孔相机拍摄的,请自行更改colmap feature_extractor
命令。
在执行完这些命令后,可以得到如下目录结构:
├── dense/├── images/├── sparse/├── stereo/
├── images/
├── sparse/├── 0/
其中在dense
文件夹下还有几个.ply
文件,是COLMAP得到的mesh
场景重建结果,可以用MeshLab
等软件打开观看重建结果。
转化深度图格式
在dense\stereo\depth_maps
文件夹下有很多.bin
文件,这些文件是COLMAP得到的深度图,COLMAP官方代码库提供了多种方式将其转化为彩色的可视的深度图,如这份代码。
基于此代码,我提供一份代码,用于将.bin
文件转化为灰度的单通道图像,符合大家一般对深度图的认知:
import argparse
import numpy as np
import os
import struct
from PIL import Image
import warnings
import oswarnings.filterwarnings('ignore') # 屏蔽nan与min_depth比较时产生的警告camnum = 12
fB = 32504;
min_depth_percentile = 2
max_depth_percentile = 98
depthmapsdir = '.\\dense\\stereo\\depth_maps\\'
outputdir = '.\\dense\\stereo\\depth_maps\\'def read_array(path):with open(path, "rb") as fid:width, height, channels = np.genfromtxt(fid, delimiter="&", max_rows=1,usecols=(0, 1, 2), dtype=int)fid.seek(0)num_delimiter = 0byte = fid.read(1)while True:if byte == b"&":num_delimiter += 1if num_delimiter >= 3:breakbyte = fid.read(1)array = np.fromfile(fid, np.float32)array = array.reshape((width, height, channels), order="F")return np.transpose(array, (1, 0, 2)).squeeze()def bin2depth(i, depth_map, depthdir):# depth_map = '0.png.geometric.bin'# print(depthdir)# if min_depth_percentile > max_depth_percentile:# raise ValueError("min_depth_percentile should be less than or equal "# "to the max_depth_perceintile.")# Read depth and normal maps corresponding to the same image.if not os.path.exists(depth_map):raise fileNotFoundError("file not found: {}".format(depth_map))depth_map = read_array(depth_map)min_depth, max_depth = np.percentile(depth_map[depth_map>0], [min_depth_percentile, max_depth_percentile])depth_map[depth_map <= 0] = np.nan # 把0和负数都设置为nan,防止被min_depth取代depth_map[depth_map < min_depth] = min_depthdepth_map[depth_map > max_depth] = max_depthmaxdisp = fB / min_depth;mindisp = fB / max_depth;depth_map = (fB/depth_map - mindisp) * 255 / (maxdisp - mindisp);depth_map = np.nan_to_num(depth_map) # nan全都变为0depth_map = depth_map.astype(int)image = Image.fromarray(depth_map).convert('L')# image = image.resize((1920, 1080), Image.ANTIALIAS) # 保证resize为1920*1080image.save(depthdir + str(i) + '.png')for j in range(camnum):binjdir = depthmapsdir + str(j) + '.png.' + 'geometric' + '.bin'# binjdir = depthmapsdir + str(j) + '.png.' + 'photometric' + '.bin'if os.path.exists(binjdir):read_write_dense.bin2depth(j, binjdir, outputdir)
这份代码可以把depthmapsdir
的.bin
文件转化成.png
图片并保存到outputdir
,具体参数大家可以自行调整。
注意在代码中,depth_map
其实就已经把.bin
文件变成COLMAP估计得的距离了,这份代码和官方代码思路一样,都是把估计得的距离值的2百分位数至98百分位数范围内的值保存下来,其他值替换掉。
在得到depth_map
后,大家可以自定义自己喜欢和需要的可视化方法。我这里是用fB
可视化为视差图了,大家根据需要自己更改代码,这里仅作参考。
导出估计得的相机参数
在根目录下运行命令:
colmap model_converter --input_path dense/sparse --output_path dense/sparse --output_type TXT
即可把dense/sparse
文件夹中的.bin
格式的文件转化为.txt
格式的文件。
其中cameras.txt
文件中保存的是内参,形如:
# Camera list with one line of data per camera:
# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# Number of cameras: 30
1 PINHOLE 1920 1080 1987.52 2254.34 960 540
2 PINHOLE 1920 1080 2039.08 2320.3 960 540
...
这里的MODEL
是跟之提取特征时选的相机模型一致的。每行的6个数字中,除了图像长宽之外分别是图像对应的相机内参矩阵中的fx
,fy
,cx
,cy
,具体含义参见这里。
另一个文件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: 30, mean observations per image: 86.566666666666663
1 0.927395 0.0306001 -0.367019 -0.065565 5.03061 -0.487973 2.93529 1 0.png
1617.59 4.99193 -1 1831.38 5.76693 -1 1527.2 9.43552 -1 1490.19 10.4907 -1 367.424 11.5043 -1 775.228 11.182 637 1653.98 11.5989 -1 1896.38 11.4442 -1 30.5403 16.7052 -1 52.5616 18.6398 -1 7.04345 21.7672 1467 7.04345 21.7672 -1 43.2921 23.8136 -1 133.284 24.7492 -1 1249.04 24.1695 -1 3.80868 26.8114 -1 157.906 26.5587 75 173.966 27.2299 -1 22.0715 28.2147 -1 72.7796 29.7689 -1 278.952 29.9326 841 81.3182 30.1362 -1 1242.21 30.9173 -1 1242.21 30.9173 -1 1608.52 30.874 -1 110.63 32.399 -1 110.63 32.399 -1 178.573 32.1621 -1 178.573 32.1621 639 852.426 33.4657 76 201.459 34.3237 640 201.459 34.3237 -1 44.155 35.6634 -1 44.155 35.6634 -1 65.9694 37.3953 -1 65.9694 37.3953 -1 92.186 37.6702 -1 92.186 37.6702 -1 489.638 37.2811 -1 1014.71 37.6817 -1 165.665 40.7318 -1 80.8138 43.304 -1 200.238 43.746 -1 401.959 44.322 -1 473.235 44.9557 -1 473.235 44.9557 -1 5.5055 46.3413 -1 26.7574 47.175 1453 506.037 47.7838 -1 506.037 47.7838 -1 628.451 47.4269 -1 148.813 51.3945 -1 308.002 52.2475 642 71.4106 53.5389 -1
...
每张图像有两行,第一行是对应相机外参,七个浮点数中的QW
,QX
,QY
,QZ
是四元数的形式,可以转换为旋转矩阵或者其他形式,转化办法可参考这里,注意几个参数调用顺序,与COLMAP给的顺序是不同的。
而TX
,TY
,TZ
可直接构成外参中的t
矩阵。
注意,COLMAP提供的相机参数的含义与这里定义的相同。
导入相机参数进行重建和深度估计
有时候用COLMAP做批量重建和深度估计,需要使用统一的相机参数,这个时候就需要统一导入相同的一组相机参数。这里介绍使用导入的相机参数的方法,和使用导入的参数重建、深度估计的方法。
准备一个cameras.txt
,很容易,在得到上一步的cameras.txt
的基础上,只需要把最前面的三行删掉就好了:
1 PINHOLE 1920 1080 1987.52 2254.34 960 540
2 PINHOLE 1920 1080 2039.08 2320.3 960 540
...
再准备一个images.txt
,也容易,在得到上一步的images.txt
之后,最前面的三行删掉,并且只保留每台相机的第一行:
1 0.927395 0.0306001 -0.367019 -0.065565 5.03061 -0.487973 2.93529 1 0.png2 0.938886 0.0294343 -0.338403 -0.0557617 4.86882 -0.403504 2.77603 2 1.png...
每台相机后面都要空一行,注意。
然后准备一个完全空的points3D.txt
,将cameras.txt
,images.txt
和points3D.txt
放入新建的created\sparse
文件夹中,形成如下目录:
├── images/├── created/├── sparse/├── cameras.txt├── images.txt├── points3D.txt
├── images/├── 0.png├── 1.png......├── 12.png
然后在根目录下运行以下命令:
colmap feature_extractor --database_path database.db --image_path images
colmap exhaustive_matcher --database database.db
mkdir triangulated/sparse
colmap point_triangulator --database_path database.db --image_path images --input_path created/sparse --output_path triangulated/sparse
mkdir dense
colmap image_undistorter --image_path images --input_path triangulated/sparse --output_path dense
colmap patch_match_stereo --workspace_path dense --workspace_format COLMAP --PatchMatchStereo.geom_consistency true
colmap stereo_fusion --workspace_path dense --output_path dense/fused.ply
colmap model_converter --input_path dense/sparse --output_path dense/sparse --output_type TXT
即可完成重建。然后参考前面的步骤进行深度图转换即可。
如果你的相机参数不是从COLMAP得到的,就需要自己转换参数形式了,其实也容易,参考上面的几个文件的解读即可。
COLMAP简明教程 重建 转化深度图 导出相机参数 导入相机参数 命令行相关推荐
- 《Python简明教程》第10章在Windows下利用Haozip命令行备份文件
在<Python简明教程>第10章中的备份程序使用的是在Linux下压缩命令.由于本人没安装Linux系统,为了实现例子10.1,便需要一个带命令行的压缩程序.国产好压软件刚好带有命令行, ...
- mysql怎么用命令行导出sql文件_使用mysql命令行导出sql_MySQL
bitsCN.com 使用mysql命令行导出sql 其实很简单,只需2个步骤,首先进入mysql命令行,输入:use 数据库名,其次输入:source test.sql 就可以把Test表的数据全部 ...
- mysql语句导出数据库文件_通过Mysql命令行语句来导入、导出数据库文件
Mysql命令行导出数据库: 1.首先我们通过命令行进入到mysql安装目录的bin目录下,比如我输入的命令行为: cd C:\Program Files\MySQL\MySQL Server 5.5 ...
- 达梦数据库代码导出_达梦数据库常见问题-命令行工具-导入导出工具
1.导入dmp文件出现各种初始化参数不一致的警告 (页大小不匹配,restore error code:-8210:CASE_SENSIVE参数不匹配.大小写参数不一致,大小写区分属性不匹配,rest ...
- Linux系统下MySQL导出数据库和导入数据库的命令
一.MySQL导出数据库用mysqldump命令 注意mysql的安装路径,即此命令的路径,如果你只要查询mysql的运行文件所在地址,直接用下面的命令就可以了,再切换到mysql的运行文件的路径 w ...
- wondows10使用vcpkg编译colmap的教程(带suitesparse)
编译环境 Windows10+cmake+vs2017+cuda10.1+qt5.12.9-windows-x86+boost1.64.0+cgal4.11+ceres+colmap3.6-maste ...
- Windows下用命令行导出导入MySQL数据库
方法1:添加"系统环境变量".我的电脑>属性>高级>环境变量,在"系统变量"栏目下找到 path 双击编辑.先添加:(分号),再添加MySQL ...
- Python教程:命令行参数处理
sys模块 sys模块代表了Python解释器,主要用于获取和Python解释器相关的信息,其中 sys.argv 可以获取命令行参数 在Python交互式解释器中可以先导入sys模块 import ...
- mysql命令行进行数据导入和导出
背景 开发过程中经常会遇到数据库迁移&备份等操作.可以采用客户端或者命令行来进行数据备份和导入操作,由于目前可视化客户端比较多,操作比较简单,目前暂时不做介绍.下面主要是将linux下使用命令 ...
- mysq命令行导出sql_MySQL命令行导出、导入数据库,备份数据库表
MySQL导出数据库/数据表 1.首先,将你MySQL安装目录,例如C:\Program Files\MySQL\MySQL Server 5.7\bin添加到你的系统环境变量PATH中: 2.导出数 ...
最新文章
- 福利 | 大数据新媒体平台面向清华校内师生开放!
- origin中文版散点图拟合曲线_「测试狗」Origin入门教程:如何进行单段及多段线性拟合...
- logstash 利用drop 丢弃过滤日志
- SQL Server--用户自定义函数
- 简历要避开哪些坑,资深面试官告诉你!
- 工作157:动态路由
- Controller层使用@value注解获取不到properties属性值
- Auto type deducing
- matlab中patch函数的用法
- black-box优化——第一篇:基础BBO算法
- 支付宝上线新功能:家长们放心了!
- linux使用running网卡ping,Linux CentOS 7 IP地址配置及网络问题排查
- Karabiner Elements使用技巧分享,帮您简单修改使用键位
- DNN群宗旨--QQ群(DNN山海经):56782274
- idea 运行jmeter源码_JMeter知识系列(2)JMeter连接MongoDB
- 大一c语言选择题库及答案,c语言选择题(大一c语言编程题库)
- ColorUI开发手册(适用于后端同学使用)
- 51单片机2个按钮逻辑设计http://www.51hei.com/bbs/forum.php?mod=viewthreadtid=165521page=1#pid720113
- MLP-Mixer简介和一些想法
- 【c语言】多项式求和