
计算机视觉科研【免费下载链接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.项目地址https://gitcode.com/gh_mirrors/op/openMVG点击查看免费下载本篇技术指南以 openMVG 官方文档 docs/sphinx/rst/openMVG/multiview/multiview.rst 为骨架结合仓库内src/openMVG/multiview的实际源码实现系统讲解多视图几何Multiple View Geometry的核心构成从仿射、单应、基础矩阵、本质矩阵等两视图2-view几何约束求解器到三角化、旋转平均、平移平均等 N 视图N-view全局估计再到把求解器嵌入鲁棒估计流程的通用 Kernel 框架。读完本文你将理解 openMVG 中每个几何求解器的数学约束、最小采样数与模型输出数量MINIMUM_SAMPLES/MAX_MODELS并掌握如何基于 Kernel 概念在 RANSAC 类鲁棒估计器中复用这些求解器。multiview 模块在 openMVG 中的定位multiview是 openMVG 库最核心的几何模块官方文档将其构成概括为两部分一组 2 至 n 视图几何约束求解器solvers覆盖多视图几何中出现的各类两视图、多视图几何关系估计一个通用的 Kernel 框架将这些求解器嵌入到鲁棒估计流程中如 RANSAC、AC-RANSAC使数据点 模型估计器 误差度量三者解耦、可自由组合。从仓库结构看该模块位于 src/openMVG/multiview包含约 40 个源码文件既有solver_*系列的求解器实现也有two_view_kernel.hpp、conditioning.hpp等基础设施还有rotation_averaging_*、translation_averaging_*、triangulation*等 N 视图估计组件以及配套的*_test.cpp测试单元。在 openMVG 的 SfMStructure from Motion管线中这些求解器正是从图像对应关系恢复相机几何这一核心步骤的数学引擎。两视图求解器2d-2d 对应关系的几何估计对于一对图像中可见的 2d-2d 点对应关系(x_i, x_i)openMVG 提供了以下几何模型的估计能力几何模型最小点数求解算法仿射affine3非共线线性最小二乘单应homographic4 至 nDLTDirect Linear Transform[HZ]基础矩阵fundamental7 至 n / 8 至 n7 点算法 / 8 点 DLT [HZ]本质矩阵essential8 至 n / 5 / 38 点 DLT [HZ]、5 点 内参 [Stewenius]、[Nister]、3 点正交 [Magnus]仿射变换Affinesrc/openMVG/multiview/solver_affine.hpp 提供了Affine2DFromCorrespondencesLinear与 3D 版本用于在已知 2D/3D 对应点的情况下估计仿射变换矩阵M2D 情形为 6 自由度、3D 情形为 12 自由度约束条件为x2 M * x1。注释明确要求至少 3 个非共线点且点的坐标需为归一化的欧氏坐标。单应矩阵Homography单应矩阵描述一个平面在两个视图投影之间的映射关系H是一个 (3 x 3) 矩阵满足x_i H x_i即左图像点经H变换后得到右图像中的对应点这是典型的点对点point-to-point约束。openMVG 的实现遵循 [HZ]Hartley Zisserman《Multiple View Geometry》书中讲解的 DLTDirect Linear Transform算法H可由 4 至 n 个对应点估计。在源码 src/openMVG/multiview/solver_homography_kernel.hpp 中FourPointSolver声明MINIMUM_SAMPLES 4、MAX_MODELS 14 点线性求解器只返回唯一的单应解误差度量采用AsymmetricError非对称几何误差即重投影点与目标点的平方距离。同时该文件为 Kernel 提供了两种变体UnnormalizedKernel直接作用于原始数据点Kernel默认通过two_view::kernel::NormalizedSolver先对点进行归一化conditioning再求解注释明确说明归一化版本用于增强鲁棒性。基础矩阵Fundamental基础矩阵F关联两幅观察同一场景的图像中对应点的投影。给定一对点对应(x_i, x_i)满足x^T_i F x_i 0F是 (3 x 3) 矩阵将点x关联到一条直线l_i F x_i即为对极线epipolar line点x_i应位于其上。该关系对立体图像对中所有对应点成立因此基础矩阵刻画的是点对线point-to-line约束。基础矩阵有时被称为 bifocal tensor双焦张量是秩为 2 的 3x3 矩阵具有 7 个自由度。文档指出7 或 8 个非共面non-coplanar对应点足以计算 F 矩阵实现同样遵循 [HZ] 的 DLT 算法。对应源码 src/openMVG/multiview/solver_fundamental_kernel.hpp 提供了SevenPointSolverMINIMUM_SAMPLES 7、MAX_MODELS 3——7 点算法通过求解det(F_1 αF_2) 0的一元三次方程最多可返回 3 个基础矩阵候选EightPointSolverMINIMUM_SAMPLES 8、MAX_MODELS 1——8 点算法构建 9xn 线性系统Af 0EncodeEpipolarEquation将每对对应点编码为一行其零空间秩为 1 时直接得到 F误差度量SampsonErrorSampson 距离、SymmetricEpipolarDistanceError对称对极距离、EpipolarDistanceError对极距离Kernel 变体SevenPointKernel、EightPointKernel以及经过归一化HZ 算法 11.1第 282 页 conditioning的NormalizedSevenPointKernel、NormalizedEightPointKernel。N 视图几何估计除了两视图求解器multiview 模块还提供面向全局重建的 N 视图估计能力包括三角化、旋转平均与平移平均。三角化Triangulation三角化解决已知多个视图的相机位姿与观测求 3D 点的问题文档列出两种方案2 至 n 视图Direct Linear Transform标准 DLT 三角化src/openMVG/multiview/triangulation_nview.hpp 中的TriangulateNView计算满足x PX的射影点XR^4 齐次坐标TriangulateNViewAlgebraic采用代数距离近似注释提示当 2D 点经过各向同性归一化时效果更好2 至 n 视图迭代最小二乘Iterated least square通过迭代优化的方式逼近几何最优解。Triangulate2View是 src/openMVG/multiview/triangulation.hpp 中聚合两视图三角化求解器的通用入口支持多种方法ETriangulationMethodTriangulateDLT线性 DLT见 HZ 12.2 第 312 页、TriangulateL1Angular最小化 L1 范数角度误差基于 Lee Civera ICCV 2019、TriangulateLInfinityAngular、TriangulateIDWMidpoint逆深度加权中点法附带 adequacy 检验。这些函数大多返回布尔值指示三角化点是否通过 cheirality正深度或 adequacy 检验——这是保证重建点在相机前方的关键。旋转平均Rotation Averaging旋转平均从两两相对旋转估计中求解所有相机的全局旋转文档列出两种方法L2稀疏[Martinec]最小化|| wij * (rj - Rij * ri) || 0的 Frobenius 范数即用矩阵参数化的线性最小二乘。src/openMVG/multiview/rotation_averaging_l2.hpp 中L2RotationAveraging实现该稠密形式Martinec 博士论文公式 6.62 第 100 页ClosestSVDRotationMatrix通过 SVD 将估计结果投影回最近旋转矩阵公式 6.7.2 第 89 页另有L2RotationAveraging_Refine使用角轴angle-axis参数化进行非线性精化L1稀疏[Chatterjee]在 L1 范数下鲁棒地估计全局旋转。src/openMVG/multiview/rotation_averaging_l1.hpp 中InitRotationsMST沿最小生成树MST链式传递得到初始估计GlobalRotationsRobust在 L1 范数下精化并给出内点/外点标记vec_inliers实现基于 Chatterjee Govindu 的 ICCV 2013 论文。平移平均Translation Averaging平移平均从相对平移平移方向中恢复全局相机位置文档列出两种方法L2 Chordal [Kyle2014]实现 Wilson SnavelyECCV 20141DSfM论文中Solving the Translations Problem的方程 (3)src/openMVG/multiview/translation_averaging_solver.hpp 中的solve_translations_problem_l2_chordal接受 edges/poses/weights 数组与迭代容差参数SoftL1GlobalACSfM 的 LInf 方法的近似solve_translations_problem_softl1实现 Moulon、Monasse MarletICCV 2013论文中的 LInf 最小化为 SoftL1 最小化支持成组的相对平移估计两视图 bearing 或 n-uplets每个组拥有各自优化尺度d_l1_loss_threshold为 SoftL1 损失阈值默认 0.01-1 表示不使用损失函数。其注释强调所有相对运动必须属于同一连通分量。相对位姿估计本质矩阵Essential Matrix在基础矩阵基础上加入相机内参即得到度量对象——本质矩阵。文档给出核心关系由 Longuet-Higgins 于 1981 年提出 [Longuet]E R[t]x K^T F K其中E为本质矩阵R、t为两相机间相对旋转与平移[t]x表示平移向量的反对称矩阵K、K为两相机内参。本质矩阵将相机的相对位置与基础矩阵关系联系起来。从源码看src/openMVG/multiview/essential.hpp 提供了矩阵转换工具EssentialFromFundamental由 F、K1、K2 计算 E、FundamentalFromEssential反向恢复 F供误差计算使用、EssentialFromRt以及MotionFromEssential——根据 HZ 9.7第 259 页Result 9.19本质矩阵分解可产生4 种可能的相对位姿两两组合的旋转与平移。src/openMVG/multiview/motion_from_essential.hpp 中的RelativePoseFromEssential是实用化的关键它对 4 个候选位姿逐一三角化并统计位于相机前方的点数cheirality 检验保留正深度点最多的解positive_depth_solution_ratio默认 0.7用于在两个候选解都有大量点在相机前方时做出取舍。这正是 SfM 相对定向的标准流程5 点法求 E → 分解出 4 解 → 三角化选优。本质矩阵的求解器集中在 src/openMVG/multiview/solver_essential_kernel.hppFivePointSolverMINIMUM_SAMPLES 5、MAX_MODELS 10——5 点算法[Stewenius]、[Nister]求解相对位姿输入点必须已归一化内参已知、转换为 bearing 向量ThreePointSolverMINIMUM_SAMPLES 3、MAX_MODELS 2——3 点正交orthographic本质矩阵求解[Magnus]误差采用OrthographicSymmetricEpipolarDistanceErrorEssentialKernel类继承two_view::kernel::Kernel构造时用K1.inverse()、K2.inverse()将图像像素坐标转换为相机坐标系下的 bearing 向量bearing_x1_、bearing_x2_并在误差计算时通过FundamentalFromEssential将 E 换算回 F 再套用基础矩阵误差度量如SampsonError导出别名FivePointKernel、ThreePointKernel。绝对位姿估计相机 ResectionPose Matrix给定一组 3D-2D 点对应可以估计相机位姿camera pose estimation / resection。文档给出的目标是最小化 3D 点重投影的残差min Σ^n_i1 || x_i - P(X_i) ||即求解相机投影矩阵P使所有 3D 点X_i经P投影后与观测 2D 点x_i的误差之和最小这是一个参数优化问题。openMVG 为该问题提供多种求解器6pt Direct Linear Transform [HZ]最少 6 个 3D-2D 对应线性最小二乘求投影矩阵。对应 src/openMVG/multiview/solver_resection_kernel.hpp 中的SixPointResectionSolverMINIMUM_SAMPLES 6、MAX_MODELS 1误差度量使用PixelReprojectionError像素重投影距离3pt with intrinsic P3P共 4 种实现[Ke]Ke RoumeliotisCVPR 2017见 solver_resection_p3p_ke.hpp[Kneip]Kneip、Scaramuzza SiegwartCVPR 2011见 solver_resection_p3p_kneip.hppP3PSolver_KneipMINIMUM_SAMPLES 3、MAX_MODELS 4[Nordberg]Persson NordbergLambda TwistECCV 2018见 solver_resection_p3p_nordberg.hpp[Ding]Ding、Yang、Larsson、Olsson ÅströmRevisiting the P3P ProblemCVPR 2023见 solver_resection_p3p_ding.hpp。从 src/openMVG/multiview/solver_resection.hpp 的SolverType枚举可以看到完整的求解器清单与默认选择DLT_6POINTS、P3P_KE_CVPR17、P3P_KNEIP_CVPR11、P3P_NORDBERG_ECCV18、P3P_DING_CVPR23、UP2P_KUKELOVA_ACCV10其中DEFAULT P3P_DING_CVPR23——即默认采用 2023 年 Ding 等人的 P3P 求解器。文档正文列举了 DLT 与三种 P3P源码还额外提供了 Kukelova 的 UP2PACCV 2010求解器见 solver_resection_up2p_kukelova.hpp。P3P 求解器面向已标定相机内参已知输入为 bearing 向量与 3D 点误差度量采用 solver_resection_metrics.hpp 中的AngularReprojectionError角度重投影误差1 - dot(normalized(P·X), bearing)而 DLT 6 点法使用像素重投影误差PixelReprojectionError/SquaredPixelReprojectionError。Kernel 概念求解器与鲁棒估计框架的桥梁为了让求解器能够嵌入通用的鲁棒估计框架RANSAC、AC-RANSAC、LMeds、MaxConsensus 等见 src/openMVG/robust_estimationopenMVG 提出了Kernel 概念将三类要素绑定在一起——数据点data points用于鲁棒估计问题的对应点集合putative 匹配模型求解器/估计器model solver/estimator从最小采样集拟合模型的算法误差度量metric衡量数据点与候选模型拟合程度的函数。文档给出了 Kernel 各组成部分的明确约定Solver求解器MINIMUM_SAMPLES模型估计所需的最少点数MAX_MODELS最小求解器最多能返回的模型数量Solve函数从MINIMUM_SAMPLES至 n 个向量数据估计模型。ErrorModel误差模型一个度量函数返回某个数据样本相对于给定模型的误差。Kernel核内嵌数据putative 匹配、模型估计器与误差模型是 openMVG 鲁棒估计框架使用的核心构件。Kernel 的源码实现通用两视图 Kernel 实现在 src/openMVG/multiview/two_view_kernel.hppKernelSolverArg, ErrorArg, ModelArg Mat3模板类定义了鲁棒拟合算法所需的全部接口Kernel::MINIMUM_SAMPLES直接继承自Solver::MINIMUM_SAMPLESKernel::MAX_MODELS直接继承自Solver::MAX_MODELSFit(samples, models)从采样索引中提取对应点列ExtractColumns调用Solver::Solve估计模型。文件头注释特别强调Fit 不得清空 models 向量中已有的条目应将新解追加到末尾因为最小求解器可能返回多个候选模型Error(sample, model)调用ErrorArg::Error(model, x1, x2)计算单个样本相对模型的误差NumSamples()返回候选putative点数即x1.cols()静态Solve转发到Solver::Solve便于模板化使用。该文件注释明确指出 Kernel 的一个设计要点Kernel 不暴露样本数据本身。鲁棒拟合算法只能看到存在 N 个样本可以通过 Kernel 拟合其子集并检查误差但永远无法直接访问样本内容——这保证了数据封装与算法通用性。对于需要归一化的求解器如单应、基础矩阵的 DLTNormalizedSolver模板先调用NormalizePoints实现 HZ 第 109 页 Algorithm 4.2 的 conditioning见 src/openMVG/multiview/conditioning.hpp对两组点进行归一化并得到变换矩阵T1、T2在归一化坐标系中求解后用UnnormalizerArg::Unnormalize将模型反变换回原始坐标系。单应使用UnnormalizerI相似/仿射归一化基础矩阵使用UnnormalizerT射影归一化这正是经典 8 点法先归一化、后解算、再反归一化的标准做法。Kernel 概念在三类求解器中得到了完整复用单应homography::kernel::Kernel two_view::kernel::KernelNormalizedSolverFourPointSolver, UnnormalizerI, AsymmetricError, Mat3基础矩阵NormalizedEightPointKernel two_view::kernel::KernelNormalizedSolverEightPointSolver, UnnormalizerT, SampsonError, Mat3本质矩阵EssentialKernel在继承 Kernel 的基础上重写了Fit与Error将像素坐标先经内参逆变换为 bearing 向量再送入 5 点/3 点求解器误差侧则由 E 还原 F 后计算 Sampson 距离ResectionPoseResectionKernel two_view::kernel::KernelSixPointResectionSolver, PixelReprojectionError, Mat34、PoseResectionKernel_P3P_Kneip two_view::kernel::KernelP3PSolver_Kneip, AngularReprojectionError, Mat34等。测试与验证multiview 模块的每个求解器都配有单元测试可直接作为 API 用法示例与正确性验证参考单应solver_homography_kernel_test.cpp、solver_fundamental_kernel_test.cpp本质矩阵solver_essential_test.cpp、solver_essential_five_point_test.cpp、solver_essential_three_point_test.cpp、solver_essential_eight_point相关测试Resectionsolver_resection_kernel_test.cpp覆盖 DLT 与各 P3P 求解器三角化triangulation_test.cpp、triangulation_nview_test.cpp旋转/平移平均rotation_averaging_test.cpp、translation_averaging_test.cpp仿射与已知旋转平移solver_affine_test.cpp、solver_translation_knownRotation_kernel_test.cpp。这些测试文件均位于 src/openMVG/multiview配合test_data_sets.cpp/hpp提供的合成数据生成工具展示了从构造对应关系 → 调用 Kernel/Solver → 校验模型精度的完整用法。延伸阅读鲁棒估计框架如何消费 Kernel见 src/openMVG/robust_estimation 下的 RANSAC、AC-RANSAC、LMeds 与 MaxConsensus 实现以及官方文档 docs/sphinx/rst/openMVG/robust_estimation/robust_estimation.rst两视图匹配与几何过滤src/openMVG/matching_image_collection中的E_ACRobust、F_ACRobust、H_ACRobust正是基于本模块 Kernel 的几何过滤封装SfM 全局管线中三角化与旋转/平移平均的实际调用可参考src/openMVG/sfm/pipelines与软件层src/software/SfM的main_SfM.cpp本文引用的全部文献条目[HZ]、[Stewenius]、[Nister]、[Ke]、[Kneip]、[Nordberg]、[Ding]、[Magnus]、[Martinec]、[Chatterjee]、[Kyle2014]、[GlobalACSfM]、[Longuet] 等集中在 docs/sphinx/rst/bibliography.rst可作为深入阅读的起点。总体而言openMVG 的 multiview 模块以求解器Solver Kernel 封装 误差度量ErrorModel为设计主线每个求解器通过MINIMUM_SAMPLES与MAX_MODELS两个常量声明自己的能力边界Kernel则负责数据采样、模型拟合与误差计算的统一接口最终让同一套鲁棒估计框架可以无缝地处理单应、基础矩阵、本质矩阵与相机 Resection 等不同类型的几何估计问题——这也是 openMVG 从两视图相对定向走向全局 SfM 重建的地基所在。赞分享计算机视觉科研【免费下载链接】openMVGopen Multiple View Geometry library. Basis for 3D computer vision and Structure from Motion.项目地址https://gitcode.com/gh_mirrors/op/openMVG点击查看免费下载相关推荐openMVG Samples 完全指南从特征匹配到鲁棒几何估计的官方示例实战openMVG Samples 完全指南从特征匹配到鲁棒几何估计的官方示例实战 本文围绕 openMVGOpen Multiple View Geometr计算机视觉科研深入解析openMVG中的RANSAC及其变体3D计算机视觉的鲁棒估计算法指南深入解析openMVG中的RANSAC及其变体3D计算机视觉的鲁棒估计算法指南 openMVGOpen Multiple View Geometry是一个计算机视觉科研深度解析openMVG多视图几何中的本质矩阵估计与相机姿态恢复技术深度解析openMVG多视图几何中的本质矩阵估计与相机姿态恢复技术 openMVGOpen Multiple View Geometry是一个功能强大的开计算机视觉科研上一篇3分钟搞定Adobe全家桶激活Adobe-GenP 3.0终极指南下一篇IronClaw Reborn 循环退出握手契约Loop Exit Handshake深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考