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
Image listing
Image description computation
Corresponding images and correspondences computation
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 文件,描述所使用的图像数据集。这个结构化文件为每个图像列出了一个称为视图的对象。该视图存储图像信息和列表:
图像名称
图像大小
内部摄像机校准信息(内在参数)(如有)。
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 /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