xiaoxiao-1's Blog

踔厉奋发,极致无憾!

0%

openMVG命令行用法

openMVG使用

三维重建有两个比较完善的开源软件:colmap和openMVG。前者不用多说,提供了ui界面,各个功能做的也很完善,但是代码量巨大,可读性很差。OpenMVG 全称 Open Multiple View Geometry,是法国人 Pierre Moulon 读博期间开源的一个 C++ 库。但是比较遗憾的是没有提供gui界面,所以执行sfm的各个步骤需要使用命令行进行,这里是使用openMVG的记录。

openMVG的docs网址如下:

https://openmvg.readthedocs.io/en/latest/

这个docs应该是好久没更新了,跟最新版本的openmvg的很多参数都对不上

openMVG的pipelines

  1. Image listing
  2. Image description computation
  3. Corresponding images and correspondences computation
  4. SfM solving (2 methods)

Image listing

1
$ openMVG_main_SfMInit_ImageListing -i [] -d [] -o []

如果你使用的dockerfile编译的镜像,那么openMVG_main_SfMInit_ImageListing/opt/openMVG_Build/Linux-x86_64-RELEASE/文件下下面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
必须的参数:
-i 图片位置
-d 相机传感器数据库(在/opt/openMVG/src/software/SfM/../../openMVG/exif/sensor_width_database/sensor_width_camera_database.txt)
-o 输出数据位置
可选参数:
[-f|–focal] (value in pixels)
[-k|–intrinsics] Kmatrix: “f;0;ppx;0;f;ppy;0;0;1”
[-c|–camera_model] Camera model type:
1: Pinhole
2: Pinhole radial 1
3: Pinhole radial 3 (default)
[-g|–group_camera_model]
0-> each view have it’s own camera intrinsic parameters
1-> (default) view can share some camera intrinsic parameters
1
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_SfMInit_ImageListing -d /opt/openMVG/src/software/SfM/../../openMVG/exif/sensor_width_database/sensor_width_camera_database.txt -i /home/devil/10_11_subdataset/rgb/ -o /home/devil/10_11_subdataset/output/ -k "665.5152;0;457.4575;0;665.5152;316.95375;0;0;1" -c 1 

这个任务是创建一个 sfm_data.json 文件,描述所使用的图像数据集。这个结构化文件为每个图像列出了一个称为视图的对象。该视图存储图像信息和列表:

  1. 图像名称
  2. 图像大小
  3. 内部摄像机校准信息(内在参数)(如有)。

Image description computation

1
$ openMVG_main_ComputeFeatures -i [..\matches\sfm_data.json] -o [...\matches]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
必须的参数:

[-i|–input_file] 第一步输出的文件(sfm_data.json)
[-o|–outdir path] 图像描述符存放的位置

可选的参数:

[-f|–force: 强制重新计算数据]
0: (默认)重新加载先前计算的数据(在您终止进程并希望继续计算时很有用)
1: 在更改命令行参数后有用,强制重新计算并保存。

[-m|–describerMethod]
用于描述图像的方法:
SIFT:(默认),
AKAZE_FLOAT:具有浮点描述符的AKAZE,
AKAZE_MLDB:具有二进制描述符的AKAZE。

[-u|–upright]
是否使用直立特征
0: (默认,具有旋转不变性)
1: 提取直立特征(方向角 = 0°)。

[-p|–describerPreset]
用于控制Image_describer配置的参数:
NORMAL,
HIGH,
ULTRA:!!可能会消耗大量时间!!。

Generate Image Pair

1
openMVG_main_PairGenerator -i [] -o []
1
2
3
4
5
6
7
8
9
10
11
[-i|--input_file]         SfM_Data文件
[-o|--output_file] 存储成对信息的输出文件

[可选]
[-m|--pair_mode] mode 成对生成模式
EXHAUSTIVE: 构建所有可能的成对。[默认]
CONTIGUOUS: 为连续的图像构建成对(与 --contiguous_count 参数一起使用)
[-c|--contiguous_count] X 连续连接的数量
X: 将0与(1->X)匹配,...]
2: 将0与(1,2)匹配,1与(2,3)匹配,...
3: 将0与(1,2,3)匹配,1与(2,3,4)匹配,...

example

1
2
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_PairGenerator  -i /home/devil/10_11_subdataset/output/sfm_data.json -o /home/devil/10_11_subdataset/output/matchs/pairs.bin -m CONTIGUOUS -c 2

compute Matchs

上面是提取了特征点,然后需要对特征点进行匹配。

1
$ openMVG_main_ComputeMatches -i [..\matches\sfm_data.json] -o [...\matches]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
必需参数:

[-i|–input_file] SfM_Data文件
[-o|–out_dir path] 储存假设匹配和几何匹配的路径
[-p|--pair_list] 上个步骤得到的pairs

可选参数:
[-f|–force: 强制重新计算数据]
0: (默认)重新加载先前计算的数据(在您终止进程并希望继续计算时很有用)
1: 在更改命令行参数后有用,强制重新计算并重新保存。

[-r|-ratio](这个参数是比值测试需要的,即最近邻距离和次近邻距离的比值,越小越严格)
(最近邻距离比,默认值为0.8)。
使用0.6更为严格 => 提供更少的误报。


[-n|–nearest_matching_method]
AUTO: 从区域类型自动选择,
对于基于标量的描述符,您可以使用:
BRUTEFORCEL2: 基于标量的区域描述符的BruteForce L2匹配,
ANNL2: 基于标量的区域描述符的近似最近邻L2匹配,
CASCADEHASHINGL2: L2级联哈希匹配,
FASTCASCADEHASHINGL2: (默认)。
使用预计算的哈希区域的L2级联哈希匹配,(比CASCADEHASHINGL2更快但使用更多内存)。
对于基于二进制的描述符,您必须使用:
BRUTEFORCEHAMMING: 二进制区域描述符的BruteForce Hamming匹配,

[-c|--cache_size]
Use a regions cache (only cache_size regions will be stored in memory)
If not used, all regions will be load in memory.
[Pre-emptive matching:]
[-P|--preemptive_feature_count] <NUMBER> Number of feature used for pre-emptive matching

examples

1
2
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_ComputeMatches -i /home/devil/10_11_subdataset/output/sfm_data.json -p /home/devil/10_11_subdataset/output/matchs/pairs.bin -r 0.7   -o /home/devil/10_11_subdataset/output/matchs/matchs.bin

Match Filter

1
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_GeometricFilter -i []   -m []   -o []
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
必须的参数:
[-i|--input_file] SfM_Data文件
[-m|--matches] (输入) 匹配文件名
[-o|--output_file] (输出) 过滤后的匹配文件名

[可选]
[-p|--input_pairs] (输入) 成对文件名
[-s|--output_pairs] (输出) 过滤后的成对文件名
[-f|--force] 强制重新计算数据
[-g|--geometric_model]
(通过鲁棒模型估计进行成对对应关系过滤):
f: (默认)基本矩阵,
e: 本质矩阵,
h: 单应矩阵.
a: 具有角度参数化的本质矩阵,
u: 具有角度参数化的直立本质矩阵,
o: 正交本质矩阵.
[-r|--guided_matching] 使用找到的模型改善成对的对应关系.
[-c|--cache_size]
使用区域缓存(仅将 cache_size 个区域存储在内存中)
如果不使用,将加载所有区域到内存中。

examples

1
2
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_GeometricFilter  -i /home/devil/10_11_subdataset/output/sfm_data.json -m /home/devil/10_11_subdataset/output/matchs/matchs.bin -o /home/devil/10_11_subdataset/output/matchs/matches.f.bin -g h  

注意filter最后的输出一定得是matches.f.bin matches.f.txt matches.e.bin matches.e.txt

Incremental SfM

1
$ openMVG_main_IncrementalSfM -i Dataset/matches/sfm_data.json -m Dataset/matches/ -o Dataset/out_Incremental_Reconstruction/ -s [] 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
[必需]
[-i|--input_file] SfM_Data场景的路径
[-m|--match_dir] 匹配文件对应于提供的SfM_Data场景的路径
[-o|--output_dir] 存储输出数据的路径
[-s|--sfm_engine] 用于重建的SfM引擎类型
INCREMENTAL : 逐步添加图像到2视图种子
INCREMENTALV2 : 逐步添加图像到2或N视图种子(实验性的)
GLOBAL : 全局初始化旋转和平移
STELLAR : n-uplets局部运动细化 + 全局SfM

[可选参数]


[通用]
[-M|--match_file] 要使用的匹配文件的路径(例如 matches.f.txt 或 matches.f.bin)
[-f|--refine_intrinsic_config] 内部参数优化选项
ADJUST_ALL -> 优化所有现有参数(默认)
NONE -> 内部参数保持为常数
ADJUST_FOCAL_LENGTH -> 仅优化焦距
ADJUST_PRINCIPAL_POINT -> 仅优化主点位置
ADJUST_DISTORTION -> 仅优化畸变系数(如果有的话)
-> 注意:选项可以通过 '|' 组合
ADJUST_FOCAL_LENGTH|ADJUST_PRINCIPAL_POINT
-> 优化焦距和主点位置
ADJUST_FOCAL_LENGTH|ADJUST_DISTORTION
-> 优化焦距和畸变系数(如果有的话)
ADJUST_PRINCIPAL_POINT|ADJUST_DISTORTION
-> 优化主点位置和畸变系数(如果有的话)
[-e|--refine_extrinsic_config] 外部参数优化选项
ADJUST_ALL -> 优化所有现有参数(默认)
NONE -> 外部参数保持为常数
[-P|--prior_usage] 启用运动先验的使用(例如 GPS 位置)(默认:false)

[引擎特定]


[INCREMENTAL]
[-a|--initial_pair_a] 第一张图像的文件名(不包括路径)
[-b|--initial_pair_b] 第二张图像的文件名(不包括路径)
[-c|--camera_model] 对于未知内部参数的视图的相机模型类型:
1: 旁孔模型
2: 旁孔模型径向1
3: 旁孔模型径向3(默认)
4: 旁孔模型径向3 + 切向2
5: 鱼眼模型
[--triangulation_method] 三角测量方法(默认=3):
0: 直接线性变换
1: L1_角度
2: LINFINITY_角度
3: INVERSE_DEPTH_WEIGHTED_MIDPOINT
[--resection_method] 重定位/姿态估计方法(默认=3):
0: 直接线性变换 6点 | 不使用内部数据
1: P3P_KE_CVPR17
2: P3P_KNEIP_CVPR11
3: P3P_NORDBERG_ECCV18
4: UP2P_KUKELOVA_ACCV10 | 2点 | 直立相机


[INCREMENTALV2]
[-S|--sfm_initializer] 选择SfM初始化方法:
'EXISTING_POSE'-> 从现有sfm_data相机姿态初始化重建
'MAX_PAIR'-> 从具有最多匹配的成对初始化重建
'AUTO_PAIR'-> 使用自动选择的成对初始化重建
'STELLAR'-> 使用'stellar'初始化重建
[-c|--camera_model] 对于未知内部参数的视图的相机模型类型:
1: 旁孔模型
2: 旁孔模型径向1
3: 旁孔模型径向3(默认)
4: 旁孔模型径向3 + 切向2
5: 鱼眼模型
[--triangulation_method] 三角测量方法(默认=3):
0: 直接线性变换
1: L1_角度
2: LINFINITY_角度
3: INVERSE_DEPTH_WEIGHTED_MIDPOINT
[--resection_method] 重定位/姿态估计方法(默认=3):
0: 直接线性变换 6点 | 不使用内部数据
1: P3P_KE_CVPR17
2: P3P_KNEIP_CVPR11
3: P3P_NORDBERG_ECCV18
4: UP2P_KUKELOVA_ACCV10 | 2点 | 直立相机


[GLOBAL]
[-R|--rotationAveraging]
1 -> L1最小化
2 -> L2最小化(默认)
[-T|--translationAveraging]:
1 -> L1最小化
2 -> 对弦距离平方和的L2最小化
3 -> SoftL1最小化(默认)
4 -> LiGT:从旋转和匹配中获取的线性全局平移约束
[STELLAR]
[-G|--graph_simplification]
-> NONE
-> MST_X
-> STAR_X
[-g|--graph_simplification_value]
-> 数量(默认:5)

Convert SfM

1
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_ConvertSfM_DataFormat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
必须的参数
[-i|--input_file] 输入SfM_Data场景的路径
[-o|--output_file] 输出SfM_Data场景的路径
.json, .bin, .xml, .ply, .baf

[用于导出部分数据的选项(默认情况下导出所有数据)]

可用于json/bin/xml格式
[-V|--VIEWS] 导出视图
[-I|--INTRINSICS] 导出内部参数
[-E|--EXTRINSICS] 导出外部参数(视图姿势)
[-S|--STRUCTURE] 导出结构
[-C|--CONTROL_POINTS] 导出控制点

script

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 初始化输入
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_SfMInit_ImageListing -d /opt/openMVG/src/software/SfM/../../openMVG/exif/sensor_width_database/sensor_width_camera_database.txt -i /home/devil/10_11_subdataset/rgb/ -o /home/devil/10_11_subdataset/output/ -k "665.5152;0;457.4575;0;665.5152;316.95375;0;0;1" -c 1

# 提取图片特征
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_ComputeFeatures -i /home/devil/10_11_subdataset/output/sfm_data.json -o /home/devil/10_11_subdataset/output/matchs

# 根据特征生成匹配对
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_PairGenerator -i /home/devil/10_11_subdataset/output/sfm_data.json -o /home/devil/10_11_subdataset/output/matchs/pairs.bin -m CONTIGUOUS -c 2

# 进行匹配
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_ComputeMatches -i /home/devil/10_11_subdataset/output/sfm_data.json -p /home/devil/10_11_subdataset/output/matchs/pairs.bin -r 0.7 -o /home/devil/10_11_subdataset/output/matchs/matches.bin

# 错误匹配剔除
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_GeometricFilter -i /home/devil/10_11_subdataset/output/sfm_data.json -m /home/devil/10_11_subdataset/output/matchs/matchs.bin -o /home/devil/10_11_subdataset/output/matchs/matches.f.bin -g h

# 增量式SfM
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_SfM -s INCREMENTAL -i /home/devil/10_11_subdataset/output/sfm_data.json -m /home/devil/10_11_subdataset/output/matchs -o /home/devil/10_11_subdataset/output/reconstruction

# 输出格式转换
/opt/openMVG_Build/Linux-x86_64-RELEASE/openMVG_main_ConvertSfM_DataFormat -i /home/devil/10_11_subdataset/output/reconstruction/sfm_data.bin -o /home/devil/10_11_subdataset/output/export/sfm_data.json