
计算机视觉科研【免费下载链接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.项目地址https://gitcode.com/gh_mirrors/op/openMVG点击查看免费下载本指南围绕 openMVG 的 Localization 模块展开讲解如何利用openMVG_main_SfM_Localization工具把一张或多张查询图像query image定位到一份已有的 Structure from MotionSfM重建结果中输出该图像的相机位姿位置与朝向。读完本文你将掌握该工具的全部命令行参数、完整调用示例、输出文件含义以及其底层2D-3D 特征检索 鲁棒绝对位姿估计resection 光束法平差精化的实现原理可直接用于 AR 定位、机器人重定位、图像检索定位等场景。Localization 模块是什么在三维视觉工作流中定位Localization与重建Reconstruction是两种互补的任务重建从一组未知相机位姿的图像出发恢复相机参数与场景三维点Structure from Motion定位在重建结果已经存在的前提下为新到达的图像估计相机在世界坐标系下的位姿而不再重新做全量重建。openMVG 的 Localization 模块正是为后者设计它接收一份包含三维结构和相机位姿的 SfM_Data 场景例如由 SfM 流水线生成的sfm_data.bin然后尝试为查询图像建立与场景三维点之间的 2D-3D 对应通过绝对位姿估计求出查询图像的相机位姿并将结果回写进 SfM 场景。该模块的官方说明位于 docs/sphinx/rst/software/localization/localization.rst核心可执行程序为openMVG_main_SfM_Localization其源代码在 src/software/Localization/main_SfM_Localization.cpp。获取与构建工具openMVG_main_SfM_Localization属于 openMVG 的软件层software工具之一构建规则定义在 src/software/Localization/CMakeLists.txtadd_executable(openMVG_main_SfM_Localization main_SfM_Localization.cpp) target_link_libraries(openMVG_main_SfM_Localization openMVG_system openMVG_image openMVG_features openMVG_matching_image_collection openMVG_sfm openMVG_exif ${STLPLUS_LIBRARY} vlsift )从链接的库可以看出该工具依赖特征提取openMVG_features、vlsift、图像读写openMVG_image、匹配openMVG_matching_image_collection、SfM 数据结构openMVG_sfm与 EXIF 解析openMVG_exif。构建完成后可执行文件会通过install(TARGETS ... DESTINATION bin/)安装到bin/目录。命令行参数详解工具的基本调用形式如下$ openMVG_main_SfM_Localization -i [] -m [] -o [] -q []必需参数参数说明-i/--input_file输入的 SfM_Data 场景文件必须包含三维结构与相机位姿例如 SfM 流水线生成的sfm_data.bin。源码会在加载后检查GetPoses()与GetLandmarks()是否为空若为空则报错退出main_SfM_Localization.cpp。-m/--match_dir与该 SfM_Data 场景对应的匹配目录。该目录必须包含image_describer.json记录重建时使用的特征提取器类型与参数工具会据此动态恢复相同的特征提取设置见 main_SfM_Localization.cpp以及各视图的特征文件。-o/--out_dir保存定位结果相机位姿的输出目录。目录不存在时工具会自动创建main_SfM_Localization.cpp。-u/--match_out_dir新匹配查询图像的特征的存储目录若为空则直接存入match_dir目录源码中sMatchesOutDir.empty()时回退为sMatchesDir见 main_SfM_Localization.cpp。-q/--query_image_dir待定位图像的路径可以是单个图像文件也可以是包含多张图像的目录目录中还可以包含原始重建的图像工具会自动剔除已在重建中的图像只处理新增图像见下文工作流程。可选参数参数说明-r/--residual_error残差误差重投影误差容忍上限单位为像素。默认值为正无穷std::numeric_limitsdouble::infinity()源码在鲁棒估计前会将其平方后作为 AC-RANSAC 的精度阈值dPrecisionSfM_Localizer.cpp。-s/--single_intrinsics开关默认关闭。开启后工具会检查输入的 sfm_data 是否只含单个内参intrinsics若是则直接将该内参作为查询图像的内参使用若场景内参不止一个则仍视为内参未知见 main_SfM_Localization.cpp。使用该模式时还会校验查询图像尺寸是否与内参模型一致main_SfM_Localization.cpp。-e/--export_structure开关默认关闭。开启后输出 sfm_data 会一并导出三维结构ESfM_Data(ALL)关闭时只导出VIEWS、INTRINSICS、EXTRINSICSmain_SfM_Localization.cpp。-n/--numThreads线程数仅当 openMVG 以 OpenMP 方式编译、即定义了OPENMVG_USE_OPENMP时可用。为 0 时使用 OpenMP 默认线程上限。-c/--camera_model内参未知时为查询图像新建的相机模型类型默认值 3源码见 main_SfM_Localization.cpp1Pinhole2Pinhole radial 13Pinhole radial 3默认4Pinhole radial 3 tangential 2Brown5Pinhole fisheye7Spherical。-R/--resection_method绝对位姿估计resection求解器选择默认值为DEFAULT即P3P_DING_CVPR23枚举定义见 solver_resection.hpp0DLT_6POINTS直接线性变换6 点不使用内参数据1P3P_KE_CVPR172P3P_KNEIP_CVPR113P3P_NORDBERG_ECCV184P3P_DING_CVPR235UP2P_KUKELOVA_ACCV102 点适用于直立相机 upright camera。说明原官方文档localization.rst仅列出-i/-m/-o/-u/-q/-r/-s/-e/-n九个参数-c与-R是源码中实际存在但文档未收录的扩展参数本文一并补齐方便你在实战中使用。官方文档示例原文档给出如下完整调用示例以 SceauxCastle 数据集为例$ openMVG_main_SfM_Localization \ -i /home/user/Dataset/ImageDataset_SceauxCastle/reconstruction/sfm_data.bin \ -m /home/user/Dataset/ImageDataset_SceauxCastle/matches \ -o ./ \ -q /home/user/Dataset/ImageDataset_SceauxCastle/images/100_7100.JPG该示例中-i提供重建场景sfm_data.bin-m提供对应的匹配目录-o将结果输出到当前目录-q指定单张查询图像100_7100.JPG。SceauxCastle索镇城堡正是 openMVG 仓库中附带的示例数据集对应的样例图片与内参文件位于 src/openMVG_Samples/imageData/SceauxCastle图片100_7101.jpg、100_7102.jpg内参K.txt中焦距 1452.44、主点 (708, 532)。内部工作流程与源码级原理openMVG_main_SfM_Localization的完整执行流程可以划分为六个阶段全部在 main_SfM_Localization.cpp 中实现加载 SfM_Data 场景以ESfM_Data(ALL)方式读取输入场景视图、内参、位姿、结构并校验其包含三维内容恢复特征提取器从match_dir/image_describer.json中通过 cereal 反序列化动态加载重建时使用的Image_describer确保查询图像与重建图像使用完全一致的特征类型与参数加载重建视图的区域Regions通过Regions_Provider载入重建各视图的特征/描述子供后续构建检索数据库使用筛选待定位图像列出查询目录或单文件中的图像与 sfm_data 中已有视图做差集std::set_difference只处理新增图像同时通过FindCommonRootDir处理图像根路径差异必要时重写 sfm_data 中的图像路径main_SfM_Localization.cpp逐图像定位提取查询图像特征若.feat/.desc尚未生成则计算并保存到match_out_dir否则直接加载交给 localizer 估计位姿汇总与导出GroupSharedIntrinsics合并共享内参导出位姿中心点云与扩展后的 sfm_datamain_SfM_Localization.cpp。检索数据库Single 3D Track Observation Database工具默认实例化的 localizer 是sfm::SfM_Localization_Single_3DTrackObservation_DatabaseSfM_Localizer_Single_3DTrackObservation_Database.hpp它实现的是朴素但直接的检索策略Init阶段遍历场景中每个三维路标Landmark的每个观测Observation把每个观测对应的特征描述子拷贝进一个大数组landmark_observations_descriptors_同时用一个index_to_landmark_id_向量把每个描述子索引映射回所属的路标 ID从而建立描述子 → 3D 点的索引SfM_Localizer_Single_3DTrackObservation_Database.cpp随后用RegionMatcherFactory(matching::ANN_L2, ...)初始化一个基于 ANN近似最近邻L2 距离的匹配器作为检索接口。2D-3D 匹配与鲁棒位姿估计Localize阶段SfM_Localizer_Single_3DTrackObservation_Database.cpp调用MatchDistanceRatio(0.8, ...)以0.8 的距离比阈值筛选查询图像区域与数据库描述子间的疑似匹配putative matches将每个匹配映射为 3D 点坐标来自路标X与 2D 像素坐标来自查询图像区域位置若提供了已知内参且相机存在畸变则先将 2D 点去畸变get_ud_pixel以利于位姿估计调用SfM_Localizer::Localize做鲁棒绝对位姿估计。SfM_Localizer::LocalizeSfM_Localizer.cpp按solver_type分派DLT_6POINTS使用SixPointResectionSolverACKernelAdaptorResection基于像素重投影误差在不依赖内参的情况下估计完整投影矩阵 PP3P / UP2P 系列要求必须提供已知内参通过ACKernelAdaptorResection_Intrinsics将 2D 点转换为相机坐标系下的视线方向向量bearing vector再结合 3D 点求解纯位姿统一使用AC-RANSACA Contrario RANSAC实现于 robust_estimator_ACRansac.hpp做鲁棒估计最大迭代次数默认 4096见Image_Localizer_Match_Data::max_iterationSfM_Localizer.hpp只有当内点数量 2.5 × MINIMUM_SAMPLES时才认为位姿估计成功SfM_Localizer.cpp随后通过KRt_From_P分解投影矩阵并构造geometry::Pose3。位姿精化Ceres 光束法平差初始位姿求出后工具调用SfM_Localizer::RefinePoseSfM_Localizer.cpp进行精化它把内点对应的 2D-3D 对应关系构造为一个微型 SfM 场景单视图 单内参 若干路标然后用Bundle_Adjustment_Ceres做一次局部光束法平差——默认只精化位姿与新建的内参三维结构保持固定Structure_Parameter_Type::NONE。平差成功则更新位姿并把内参参数写回相机模型。另外注意一个细节若查询图像内参未知工具会先从投影矩阵 P 分解出内参 K依据-c指定的相机模型类型新建对应的内参对象Pinhole、Radial1、Radial3、Brown、Fisheye再交给RefinePose精化main_SfM_Localization.cpp对于球面相机-c 7由于球面模型仅由图像尺寸定义工具会直接以图像宽高初始化Intrinsic_Spherical从而保证 resection 时能获得有效的视线向量main_SfM_Localization.cpp。输出文件说明定位完成后-o指定的输出目录中会生成以下文件输出文件内容found_pose_centers.ply所有成功定位图像新增图像中定位成功的那部分的相机中心点导出的 PLY 点云main_SfM_Localization.cpp便于快速查看定位到的相机位置分布。sfm_data_expanded.json扩展后的 SfM 场景在原重建基础上追加了新增视图及其位姿、内参。默认只含VIEWS、INTRINSICS、EXTRINSICS若开启-e/--export_structure则同时包含三维结构ALLmain_SfM_Localization.cpp。sfm_data_expanded.ply上述扩展场景的 PLY 可视化版本始终以ALL数据导出可用 MeshLab、CloudCompare 等工具直接查看重建点云与新增相机位姿main_SfM_Localization.cpp。命令行会打印汇总统计例如Total poses found : N/M其中 N 为成功定位的图像数M 为尝试处理的新增图像总数main_SfM_Localization.cpp。实战注意事项-m目录的完整性匹配目录必须包含image_describer.json与重建各视图的特征文件否则工具会在启动阶段报Expected file image_describer.json cannot be opened或Invalid regions错误并退出。确保查询图像与重建使用同一特征提取器是定位成功的前提。内参已知 vs 未知若重建场景只含一个内参且查询图像与之同尺寸可开启-s/--single_intrinsics直接复用内参配合-R 2等 P3P 求解器只需少量 2D-3D 点即可定位否则工具会为查询图像新建内参默认 Pinhole radial 3此时-R 0DLT不依赖内参也能工作。-q的两种形态-q可传单张图片路径或目录路径。传目录时目录中与重建重复的图像会被自动跳过差集逻辑因此可以把原始重建图像与新增查询图像放在同一目录中。球面相机定位球面相机模型必须配合已知内参使用源码中注释明确说明球面相机的 resection 必须借助已有相机模型完成其内参仅由图像宽高定义。多线程若希望并行处理多张查询图像请使用支持 OpenMP 的构建并设置-n指定线程数处理循环本身带有#pragma omp parallel for schedule(dynamic)并行化main_SfM_Localization.cpp。面向二次开发Localizer 抽象接口如果你需要在自有 C 程序中集成图像定位能力可以直接复用sfm::SfM_Localizer抽象基类SfM_Localizer.hpp它定义了三个核心虚接口Init(sfm_data, regions_provider)用 SfM 场景构建检索数据库Localize(solver_type, image_size, optional_intrinsics, query_regions, pose, resection_data)估计查询图像位姿静态方法RefinePose(...)基于 2D-3D 内点与相机模型做位姿/内参精化。Image_Localizer_Match_Data结构体含projection_matrix、pt3D、pt2D、vec_inliers、error_max、max_iteration承载 2D-3D 匹配数据与鲁棒估计统计是自定义定位策略时的数据交换核心。SfM_Localization_Single_3DTrackObservation_Database是官方提供的一种朴素实现全量描述子 ANN 匹配适合中小规模场景大规模场景可在此接口基础上替换为更高效的检索结构如级联哈希、VLAD 等参见 matching_image_collection 下的相关实现。小结openMVG_main_SfM_Localization是 openMVG 中面向图像重定位的成熟工具它复用重建阶段产出的 SfM_Data、特征与匹配数据通过描述子检索建立 2D-3D 对应 → AC-RANSAC 鲁棒绝对位姿估计 → Ceres 局部平差精化的完整链路为新增图像输出世界坐标系下的相机位姿并支持单图/批量、内参已知/未知、多种相机模型与多种 resection 求解器组合。配合found_pose_centers.ply与sfm_data_expanded.json/ply输出可以很方便地把定位结果可视化并集成到 AR、SLAM 与视觉定位流水线中。赞分享计算机视觉科研【免费下载链接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.项目地址https://gitcode.com/gh_mirrors/op/openMVG点击查看免费下载相关推荐ATLAS端到端3D场景重建从定位图像ATLAS端到端3D场景重建从定位图像 项目介绍 ATLAS项目是一个开创性的端到端3D场景重建系统它能够从一系列带有姿态信息的图像中重建出完整的3D场景。openMVG SfM 运动恢复结构管线实战从图像输入到相机位姿与三维点云重建openMVG SfM 运动恢复结构管线实战从图像输入到相机位姿与三维点云重建 Structure from MotionSfM运动恢复结构是三维计算机计算机视觉科研OpenMVG 地面控制点GCP配准实战将 SfM 场景对齐到真实尺度与坐标系的完整指南OpenMVG 地面控制点GCP配准实战将 SfM 场景对齐到真实尺度与坐标系的完整指南 OpenMVG 的 SfMStructure from Mot计算机视觉科研上一篇【亲测免费】 BSImagePicker 项目常见问题解决方案下一篇为什么选择JVector5大优势让你的向量搜索效率提升10倍创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考