OpenMVS OpenMVG 笔记

OpenMVS & OpenMVG 笔记

OpenMVS 和 OpenMVG 都是计算机视觉中用于三维重建的开源库。两者都可以实现从图像集合中计算出相机位姿和三维点云,但它们的重点略有不同。 OpenMVG 主要关注于从输入图像集合中提取稠密的特征匹配,通过这些匹配计算相机的位姿和场景中的点云。它提供了一套完整的结构从运动(Structure-from-Motion, SFM)框架,包括图像处理、特征描述和匹配、相机标定、相机位姿估计等等。 而 OpenMVS 则更加关注于基于密集的点云进行表面重建和纹理映射,从而得到高质量的三维模型。OpenMVS 可以接受 OpenMVG 的输出作为输入,进一步优化重建结果,并进行多个视角的三维模型融合。 因此,可以说 OpenMVG 更加偏向于提取几何信息,而 OpenMVS 更加偏向于提取纹理信息。两者的结合则可以得到更为丰富的三维重建结果。

OpenMVS

OpenMVS (Multi-View Stereo) 是一个面向计算机视觉科学家的库,特别针对 Multi-View Stereo 重建社区。虽然有成熟且完整的开源项目针对运动结构管道(如 OpenMVG),可以从输入图像集中恢复摄像机姿势和稀疏 3D 点云,但没有一个项目解决摄影测量链流的最后一部分。OpenMVS 旨在通过提供一整套算法来填补这一空白,以恢复要重建的场景的整个表面。输入是一组摄像机姿势加上稀疏点云,输出是一个带纹理的网格。本项目涵盖的主要主题是:

  • 密集的点云重建,以获得尽可能完整和准确的点云
  • 网格重建,用于估计最能解释输入点云的网格表面
  • 用于恢复所有精细细节的网格细化
  • 网格纹理,用于计算清晰准确的纹理,为网格着色

OpenMVG

Open Multiple View Geometry 开源多视图几何体

OpenMVG 提供从由库、二进制文件和管道组合的图像框架的端到端 3D 重建。

  • 这些库提供了对以下功能的轻松访问:图像操作、特征描述和匹配、特征跟踪、相机模型、多视图几何、鲁棒估计、运动结构算法…
  • 二进制文件解决了管道可能需要的单元任务:场景初始化、特征检测和匹配以及运动结构重建,将重建的场景导出到其他多视图立体视觉框架以计算密集的点云或纹理网格。
  • 管道是通过链接各种二进制文件来创建的,以计算图像匹配关系,解决运动结构问题(重建、三角测量、定位)和…
    OpenMVG 使用 C++ 开发,可在 Android、iOS、Linux、macOS 和 Windows 上运行。

OpenMVG

SFM 运动结构恢复(Structure from motion)数十年来一直是计算机视觉领域的热门研究方向之一,实现了众多实际应用,尤其在近景三维重建中,该算法从获取的目标物系列影像出发,最终获取较高精度的目标物稀疏三维点云。

OpenMVG 数据结构

OpenMVG 围绕三种数据结构进行阐述,称为 SfM_Data、Regions(区域)和 PairWiseMatches。
SfM_data 数据结构是一个通用容器,用于存储以下对象之间的关系:

  • Views 图像文件名和对相机内部和姿态的引用
  • Intrinsics 相机内部参数
  • Poses 姿态摄像机外部参数
  • LandMarks 3D 结构(3D 点及其可见性信息)
struct SfM_Data
{Views views;           /// reference to the used images (each image link to a pose and intrinsic camera id)Poses poses;           /// poses data (indexed by view.id_pose)Intrinsics intrinsics; /// intrinsics camera data (indexed by view.id_intrinsic)Landmarks structure;   /// Structure (3D points with their 2D observations)
...
};

Regions 数据结构是用于存储图像描述的通用容器:

  • Features (point-based)
  • Descriptors (可以是标量向量或二进制值)

PairWiseMatches 数据结构用于存储一对图像之间相应特征的索引。

注意:

  • SfM_data/Views 是唯一的,而 Intrinsics 和 Poses 可以共享。
  • SfM_Data结构 IO 可以是 JSON/XML/BINARY,以简化与工具的互操作性,也可以是 PLY(仅输出)以实现可视化。

OpenMVG 管道围绕两个主要概念进行阐述:

  • Abstract Data Providers
    • Features_provider
    • Regions_Provider
    • Matches_Provider
  • Abstract Processing Engines
    • ReconstructionEngine

API 允许轻松实现新管道并使用用户想要利用的任何数据格式。
以下是 OpenMVG 数据结构、数据提供程序、二进制文件和管道系统的概述:

OpenMVG_OverView

安装

使用vcpkg安装openmvs时,会同时安装openmvg

vcpkg install openmvs:x64-windows

使用

openmvg就是从获取的目标物系列影像出发,最终获取较高精度的目标物稀疏三维点云,即生成SFM。

直接运行openmvg安装目录中的tutorial_demo.py:

python tutorial_demo.py

结果如下:

openmvg_demo

具体步骤参见:

openmvg_pipeline
OpenMVG_OverView

Convert SfM scene from OpenMVG

将openmvg的SFM结果转换到openmvs:

openMVG_main_openMVG2openMVS.exe -i tutorial_out\reconstruction_sequential\sfm_data.bin -o scene.mvs -d .\images

可视化openmvs sfm场景:

View.exe scene.mvs

稀疏点云

Dense Point-Cloud Reconstruction

DensifyPointCloud.exe scene.mvs

提取稠密点云数据,生成scene_dense.mvs和稠密点云数据scene_dense.ply

View.exe scene_dense.mvs

稠密点云

Rough Mesh Reconstruction

点云重建生成scene_dense_mesh.mvs和网格体scene_dense_mesh.ply

ReconstructMesh.exe scene_dense.mvs

View.exe scene_dense_mesh.mvs

稠密点云网格重建

Mesh Texturing

生成纹理scene_dense_mesh_texture.mvsscene_dense_mesh_texture.plyscene_dense_mesh_texture.ply

TextureMesh.exe scene_dense_mesh.mvs -o scene_dense_mesh_texture.mvs

View.exe scene_dense_mesh_texture.mvs

贴图处理

纹理图片:

纹理

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

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

相关文章

Golang--文件操作

1、文件 文件:文件用于保存数据,是数据源的一种 os包下的File结构体封装了对文件的操作(记得包os包) 2、File结构体--打开文件和关闭文件 2.1 打开文件 打开文件,用于读取(函数): 传…

dcdc3节锂电池串联9-12V升压32V 3A/5A 音响供电恒压芯片 SL4010

SL4010:高效能9-12V至32V升压解决方案,为高端音响系统注入澎湃动力 在追求极致音质与持久续航的音频世界里,SL4010 DC-DC升压转换器以其卓越的性能和可靠性,成为高端音响系统的理想供电伙伴。专为3节锂电池串联(9-12V…

onnx-web + yolov8n 在视频流里做推理

顺着我上一篇文章 使用onnxruntime-web 运行yolov8-nano推理 继续说,有朋友在问能不能接入 视频流动,实时去识别物品。 首先使用 getUserMedia 获取摄像头视频流 getUserMedia API 可以访问设备的摄像头和麦克风。你可以使用这个 API 获取视频流&#…

力扣题库——136.只出现一次的数字

代码实现&#xff1a; class Solution { public:int singleNumber(vector<int>& nums) {int result0;for(int num:nums){result^num;}return result;} }; 结果&#xff1a; 思路&#xff1a;这里让0和数组元素不断异或&#xff0c;因为0与一个数异或的结果是它本身…

EasyPOI使用详解

EasyPOI 简介 easypoi功能如同名字easy,主打的功能就是容易,让一个没见接触过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法 文档&#xff1a;http://easypoi.mydoc.io/#categor…

JAVA设计模式之【建造者模式】

1 定义 建造者模式&#xff08;Builder Pattern&#xff09;使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 2 类图 产品类&#xff08;Product&#xff09;&#xff1a;表示被创建的复杂…

智能化健身房管理:Spring Boot与Vue的创新解决方案

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

如何修改WordPress经典编辑器的默认高度?

boke112百科有一个使用WordPress搭建的小网站&#xff0c;文章内容就是几个字不到一行&#xff0c;但是每次使用经典编辑器编辑文章时&#xff0c;都觉得编辑器默认高度太高了&#xff0c;影响了我添加文章摘要和其他属性&#xff0c;有没有办法修改WordPress经典编辑器的默认高…

C#属性 Property

属性Property不是变量。 它们是由名为访问器方法来实现的一种方法。 实例属性表示的是实例的某个数据&#xff0c;通过这个数据反映实例当前的状态 静态属性表示的是类型的某个数据&#xff0c;通过这个数据反映类型当前的状态 意义&#xff1a; 防止恶意赋值(通过属性间接访问…

【力扣热题100】[Java版] 刷题笔记-121. 买卖股票的最佳时机

题目&#xff1a;121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。…

Wi-Fi7 puncturing技术增强与应用

原文关注公众号 - 无线技术栈,及时查看网络/Wi-Fi更多知识 “本文图片没有一一列出,感兴趣可以关注公众号 - 无线技术栈” “本文图片没有一一列出,感兴趣可以关注公众号 - 无线技术栈” Puncturing是一种有效的编码技术,广泛应用于无线通信中,用于在保持信号的可靠性的同…

C语言内存函数介绍和模拟实现:(memcpy,memmove,memcmp,memset)

memcpy介绍及模拟实现&#xff1a; memcpy介绍&#xff1a; void* 是指可以接受任何类型的指针。 memcpy是把从 source 指针开始之后的 num 个字节的内存拷贝到 destination 指针之后的空间。 遇到‘\0’不会停止&#xff0c;而且memcpy不可以拷贝重叠空间&#xff0c;就是说…

浏览器指纹修改指南2024 - 修改Geolocation API指纹(十一)

引言 在前几篇文章中&#xff0c;我们已经详细探讨了Geolocation API的定义、作用及其在浏览器指纹中的重要性&#xff0c;并深入分析了Chromium源码中Geolocation API的实现位置和修改方法。通过这些分析&#xff0c;我们为后续的修改工作奠定了坚实的基础。 在本篇文章中&a…

【微信小程序】基本语法

一、导入小程序 选择代码目录 项目配置文件 appid 当前小程序的 AppIDprojectname 当前小程序的项目名称 变更AppID&#xff08;视情况而定&#xff0c;如果没有开发权限时需要变更成个人的 AppID&#xff09; 二、模板语法 在页面中渲染数据时所用到的一系列语法叫做模板…

数据结构:顺序表

顺序表 顺序表的概念与结构静态顺序表动态顺序表 动态顺序表的实现SeqList.h的创建初始化动态顺序表&#xff08;LS_Init&#xff09;动态顺序表的销毁&#xff08;LS_Destry&#xff09;检查动态内存空间是否已满&#xff08;SL_CheckCapacity&#xff09;动态顺序表打印有效数…

MySQL_数据类型建表

复习&#xff1a; 我们昨天学习的知识都忘了嘛&#xff1f;如果忘了也不要担心&#xff0c;我来带大家来复习一遍吧&#xff01;&#xff01;&#xff01; 1.查看所有数据库 show databases;2.创建属于自己的数据库 create database 数据库名; 检查自己创建的数据库是…

PHP不良事件上报系统源码,医院安全不良事件管理系统,基于 vue2+element+ laravel框架开发

不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0c;帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件、意…

在 Android 手机上从SD 卡恢复数据的 6 个有效应用程序

如果您有 Android 设备&#xff0c;您可能会将个人和专业的重要文件保存在设备的 SD 卡上。这些文件包括照片、视频、文档和各种其他类型的文件。您绝对不想丢失这些文件&#xff0c;但当您的 SD 卡损坏时&#xff0c;数据丢失是不可避免的。 幸运的是&#xff0c;您不需要这样…

实战:看懂并分析执行计划——Nested Loops (Inner Join)

这是执行计划中 Nested Loops 的详情信息,下面将逐行解释每个字段的含义,并提供优化思路。 Nested Loops 分析 Physical Operation: Nested Loops (Inner Join) 物理操作,表示这是一个嵌套循环连接(Nested Loops),用于执行 INNER JOIN。嵌套循环通常用于小数据集的连接…

Meta Llama3用于药物发现的微调、RAG 和提示工程-LLM保姆级资料

Meta Llama3用于药物发现的微调、RAG 和提示工程的使用指南&#xff1a;LLM微调的基本概念&#xff0c;每种微调方式的深入解读&#xff0c;2种生物医药领域的Llama3的微调应用。 LLM 如何微调LLMs&#xff1f;3种微调方式&#xff0c;什么时候&#xff1f;什么情况下该使用何…