zoukankan      html  css  js  c++  java
  • OpenMVG 系列 (1):入门简介

     1  OpenMVG 简介

         全称 Open Multiple View Geometry,是法国人 Pierre Moulon 读博期间开源的一个 C++ 库

        最早版本 OpenMVG 0.1 是 2013年 2月 发布的,目前最新版本是 2020年 5月 发布的 OpenMVG 1.6                

        LinkedIn 显示,此前一直在 Zillow Group 的 Pierre,于 2020年 11月 跳槽到 Facebook Reality Labs 担任 Research Scientist

        Reality Labs 聚焦的是 AR/VR 技术,和 Pierre 的研究方向契合,希望 Pierre 大神工作顺利,闲暇时继续完善 OpenMVG  

            

    2  功能模块

        OpenMVG 奉行“简单、易维护”的原则,代码具有很强的可读性,非常方便二次开发

        整个功能模块由若干核心库组成,主要围绕两大类问题:1是多视图几何的基本问题;2是运动结构恢复 sfm

    2.1  多视图几何

        Multiple View Geometry 简称 MVG,包含三个关键矩阵:一个是单应矩阵 $x_{i}^{'}=Hx_{i} $,参见博文 OpenCV 之 平面单应性

                 

         另两个是基础矩阵 $x_{i}^{'T}F x_{i}=0$,本质矩阵 $E=R[t]x=K^{'T}FK$

                             

        例如,已知四组对应特征点坐标,用 DLT 算法求解单应矩阵 H,代码如下:

    // Setup left, right corresponding points and solve for H
    openMVG::Mat xLeft(2, 4), xRight(2, 4);
    
    // Instantiation of homography solver
    using H_Solver = openMVG::homography::kernel::FourPointSolver;
    
    // Perform model solving
    std::vector<openMVG::Mat3> Hs;
    H_Solver::Solve(xLeft, xRight, &Hs);

    2.2  运动结构恢复

        Structure From Motion 简称 SFM,是从一系列图像序列中恢复相机位姿,构建三维场景 (稀疏点云) 的过程

                                                

                     图像序列                                                Structure from motion                                              三维场景 (稀疏点云)

        OpenMVG 中实现了 SFM 的两种算法:增量式和全局式。一次完整的 SFM 实现流程,如下所示:

            

    2.3  第三方库

        对于一些基础功能,OpenMVG 没有重复造轮子,直接集成了许多好用的第三方库,如下:

         - Eigen:线性代数,矩阵、向量运算

         - Ceres Solver:非线性最小二乘问题

         - Lemon:图和图运算    

    3  编译配置

    3.1  环境和工具

          - Win10  64bit

          - VS 2019 社区版 (地址: https://www.visualstudio.com/downloads/)

          - CMake 解压版 (地址: https://cmake.org/download/)

    3.2  文件准备

          - OpenMVG,地址:https://github.com/openMVG/openMVG/releases

             注意:上述地址下载的压缩包,最终编译有时会报错,不如在 PowerShell 中 Git 下载的稳定                         

                       $  git clone --recursive https://github.com/openMVG/openMVG.git

          - 依赖项,下载 glw,osi_clp 和 cereal,解压后放在 openMVGsrcdependencies 中,此目录内已有对应文件夹,但里面的内容是空的

              glw 下载地址

              cereal 下载地址

              osi_clp,可直接下载 OpenMVG 提供的地址:https://github.com/openMVG-thirdparty/osi_clp/releases

                            或者利用上述链接下载的 CMakeLists.txt 文件,再单独下载文件 Osi/Clp/CoinUtils,放在 osi_clp 文件夹中

                             https://github.com/coin-or/Osi/releaseshttps://github.com/coin-or/Clp/releases;  https://github.com/coin-or/CoinUtils/releases

     3.3  CMake 配置

         使用 cmake-gui,source 选择解压后的 src,build 选择自建的文件夹

         先 Configure 再 Generate,然后点击 "Open Project” 在 VS 中打开工程

         注:第一次 Configure 可能有红色报错,找到原因后更改 CMake 配置,再点击 Configure 即可 

                  

    3.4  编译

        打开 openMVG.sln 后,在 VS 2019 中分别编译 Debug 和 Release 模式,生成相应的 lib 文件    

      

    4  SFM 例程

        下面以 Sceaux 城堡图片集为例,执行 OpenMVG 中的 SFM 算法,输出重建的稀疏点云

          

    4.1  准备

         -  城堡图片集,地址:https://github.com/openMVG/ImageDataset_SceauxCastle

         -  Python 安装,地址:https://www.python.org/downloads/

         -  Meshlab 安装,地址:https://www.meshlab.net/

     4.2  执行脚本

        将下载的 Sceaux 城堡图片集 images,放置于编译后的 openMVG_Build/software/SfM 路径下,在 PowerShell 中分别执行如下脚本:

        增量式 SFM:

    $ py ./SfM_SequentialPipeline.py   images  matches_sequential

        全局式 SFM:

    $ py ./SfM_GlobalPipeline.py   images matches_global

        以后者为例,可看到在 matches_global 中生成了两个文件夹:matches 存储的是特征点和匹配信息;reconstruction_global 保存的是重建后的点云 (后缀为 .ply)

          

        用 Meshlab 打开其中一个稀疏点云 robust_colorized.ply,显示如下:

          

    4.3  RMSE

        在 reconstruction_global 文件夹下,还有 SfMReconstruction_Report.html 的重建精度报告

       

         

    参考资料

        OpenMVG 编译安装指南

        OpenMVG libraries

        openMVG: "open Multiple View Geometry"

        OpenMVG 源码阅读小记    

    原文链接: http://www.cnblogs.com/xinxue/

    专注于机器视觉、OpenCV、C++ 编程

  • 相关阅读:
    JAVA代码覆盖率工具JaCoCo-原理篇
    (转载)比较web ui 框架
    sql拼接
    解决com.mysql.jdbc.PacketTooBigException: Packet for query is too large问题
    字符串中重复出现字符串个数
    Unable to load annotation processor factory
    三目运算符
    WSGI剖析
    深入剖析cpp对象模型
    Cpp下匿名对象探究
  • 原文地址:https://www.cnblogs.com/xinxue/p/14838870.html
Copyright © 2011-2022 走看看