OpenMVG试用

news2024/9/23 14:33:07

1  OpenMVG 简介

    

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

    最早版本 OpenMVG 0.1 是 2013年 2月 发布的,目前最新版本是 2021年 10月 发布的 OpenMVG 2.0                

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

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

        

2  功能模块

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

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

2.1  多视图几何

    Multiple View Geometry 简称 MVG,包含三个关键矩阵:一个是单应矩阵 x′i=Hxixi′=Hxi,参见博文 OpenCV 之 平面单应性

      

       

     另两个是基础矩阵 x′TiFxi=0xi′TFxi=0,本质矩阵 E=R[t]x=K′TFKE=R[t]x=K′TFK

      

            

       

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

1

2

3

4

5

6

7

8

9

// 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 社区版 (地址: Download Visual Studio Tools - Install Free for Windows, Mac, Linux)

      - CMake 解压版 (地址: Download CMake)

3.2  文件准备

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

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

1

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

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

          glfw 下载地址

          cereal 下载地址

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

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

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

 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 安装,地址:Download Python | Python.org

     -  Meshlab 安装,地址:MeshLab

 4.2  执行脚本

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

    增量式 SFM:

1

$ py ./SfM_SequentialPipeline.py   images  matches_sequential  

    全局式 SFM:

1

$ py ./SfM_GlobalPipeline.py   images matches_global  

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

      

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

      

4.3  RMSE

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

   

     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker存储

docker分层结构 如图所示&#xff0c;容器是由最上面可读可写的容器层&#xff0c;以及若干个只读镜像层组成&#xff0c;创建容器时&#xff0c;容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制&#xff1a; 1、容器中新生成的数据会直接存放在容器层&#xf…

8. 防火墙

8. 防火墙 (1) 防火墙的类型和结构 防火墙的类型和结构可以根据其在网络协议栈中的过滤层次和实现方式进行分类。常见的防火墙类型包括: 包过滤防火墙:工作在网络层(OSI模型的第3层),主要检查IP包头的信息,如源地址、目的地址、端口号等。电路级网关防火墙:工作在会话层…

初始MYSQL数据库(6)—— 事务

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a; MYSQL 目录 事务的概念 事务的ACID特性 使用事务 查看支持事务的存储引擎 事务的语法 保存点 自动/手动提交事务 事务的隔离性和…

NLP 文本分类任务核心梳理

解决思路 分解为多个独立二分类任务将多标签分类转化为多分类问题更换 loss 直接由模型进行多标签分类 数据稀疏问题 标注更多数据&#xff0c;核心解决方案&#xff1a; 自己构造训练样本 数据增强&#xff0c;如使用 chatGPT 来构造数据更换模型 减少数据需求增加规则弥补…

MySQL --基本查询(下)

文章目录 3.Update3.1将孙悟空同学的数学成绩变更为 80 分3.2将曹孟德同学的数学成绩变更为 60 分&#xff0c;语文成绩变更为 70 分3.3将总成绩倒数前三的 3 位同学的数学成绩加上 30 分3.4将所有同学的语文成绩更新为原来的 2 倍 4.Delete4.1删除数据4.1.1删除孙悟空同学的考…

learn C++ NO.19——二叉搜索树

简单介绍一下二叉搜索树 二叉搜索树也称为二叉排序树。它是一种具有特殊性质的二叉树。它有如下性质。 1、当前节点的左子树的值一定小于当前节点&#xff0c;当前节点的右子树的值一锭大于当前节点。这也就意味着&#xff0c;在接近完全二叉树的情况下&#xff08;高度较为合…

开源实时多模态AI聊天机器人Moshi,语音对话延迟低至200毫秒!

开源实时多模态AI聊天机器人Moshi&#xff0c;语音对话延迟低至200毫秒&#xff01; 最近AI圈真是热闹非凡&#xff0c;继Meta发布Llama 3之后&#xff0c;各种开源大模型也是层出不穷。这不&#xff0c;法国一个非盈利AI研究实验室Kyutai&#xff0c;又搞了个大新闻&#xff0…

从零到一:如何用Ollama和OpenUI构建强大的AI模型库

搭建开源大模型平台的步骤与模型介绍 在这篇文章中&#xff0c;我将分享如何在Windows上使用Ollama和OpenUI搭建开源大模型平台的步骤&#xff0c;并介绍我所部署的几个模型及其擅长的领域。 目录 搭建开源大模型平台的步骤与模型介绍一、搭建平台步骤1. 安装Ollama2. 安装Ope…

C++自动驾驶面试核心问题整理

应用开发 概述&#xff1a;比较基础&#xff0c;没啥壁垒&#xff0c;主要有linux开发经验即可 问题&#xff1a;基础八股&#xff0c;如计算机网络、操作系统、c11等基础三件套&#xff1b;中等难度算法题1-2道。 中间件开发&#xff08;性能优化&#xff09; 概述&am…

FutureTask源码分析

Thread类的run方法返回值类型是void&#xff0c;因此我们无法直接通过Thread类获取线程执行结果。如果要获取线程执行结果就需要使用FutureTask。用法如下&#xff1a; class CallableImpl implements Callable{Overridepublic Object call() throws Exception {//do somethin…

信息安全工程师(12)网络攻击概述

前言 网络攻击&#xff08;Cyber Attacks&#xff0c;也称赛博攻击&#xff09;是指针对计算机信息系统、基础设施、计算机网络或个人计算机设备的任何类型的进攻动作。这些攻击旨在破坏、揭露、修改、使软件或服务失去功能&#xff0c;或在未经授权的情况下偷取或访问计算机数…

超详细超实用!!!AI编程之cursor编写一个官网(二)

云风网 云风笔记 云风知识库 一、新建html文件 选中添加index.html,输入编写官网要求&#xff0c;自动生成代码&#xff0c;先来个简单的。 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"…

WPS2019 数据透视表多列数据如何显示同一行

在excel表格中&#xff0c;只有行筛选&#xff0c;没有列筛选功能&#xff0c;当我们需要只选取某些列的数据时&#xff0c;使用数据透视表是个可行的方法&#xff0c;但默认生成的数据透视表可观性较差。要如何才能使得数据透视表格式与原来数据格式一样美观易看呢&#xff1f…

Leetcode990.等式方程的可满足性

题目 原题链接 等式方程的可满足性 思路 定义一个长度为26&#xff08;变量为小写字母&#xff09;的数组充当并查集&#xff0c;并将数组中的元素初始化为 -1判断“”并合并元素&#xff0c;将相等的放在一个集合中判断“!”&#xff1b;不等的如果在一个集合中&#xff0c;则…

【Linux】指令和权限的这些细节,你确定都清楚吗?

&#x1f680;个人主页&#xff1a;奋斗的小羊 &#x1f680;所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言&#x1f4a5;一、Linux基本指令&#x1f4a5;1.1 mv 指令&#x1f4a5;1.2 cat 指令&#x1f4a5;…

webLogic反序列化漏洞CVE-2017-3506

1.环境搭建 cd vulhub-master/weblogic/weak_password docker-compose up -d 2.判断wls-wsat组件是否存在 拼接/wls-wsat/CoordinatorPortType 查看页面是否有回显 有回显说明存在组件 3.在当前页面抓包 反弹shell 添加请求包内容 <soapenv:Envelope xmlns:soapenv&q…

hCaptcha 图像识别 API 对接说明

hCaptcha 图像识别 API 对接说明 本文将介绍一种 hCaptcha 图像识别 API 对接说明&#xff0c;它可以通过用户输入识别的内容和 hCaptcha验证码图像&#xff0c;最后返回需要点击的小图像的坐标&#xff0c;完成验证。 接下来介绍下 hCaptcha 图像识别 API 的对接说明。 注册…

线程的状态及join()插队方法

一、线程的状态 线程整个生命周期中有6种状态&#xff0c;分别为 NEW 新建状态 、RUNNABLE 可运行状态、TERMINATED 终止状态、TIMED_WAITING计时等待状态、WAITING 等待状态、BLOCKED 阻塞状态 线程各个状态之间的转换&#xff1a; 在 JAVA 程序中&#xff0c;一个线程对象通过…

一文搞懂offset、client、scroll系列及案例

目录 一、offset 1-1、offset系列属性 1-2、offset与style区别 1-3、案例 1-3-1、计算鼠标在盒子内的坐标 1-3-2、拖动模态框 二、client 2-1、client系列属性 三、scroll 3-1、scroll系列属性 3-2、案例 3-2-1、滚动页面一定距离后固定侧边栏 一、offset offset是…

pg入门3—详解tablespaces—下

pg默认的tablespace的location为空&#xff0c;那么如果表设置了默认的tablespace&#xff0c;数据实际上是存哪个目录的呢? 在 PostgreSQL 中&#xff0c;如果你创建了一个表并且没有显式指定表空间&#xff08;tablespace&#xff09;&#xff0c;或者表空间的 location 为…