基于MVS的三维重建算法学习笔记(一)— MVS三维重建概述与OpenMVS开源框架配置

基于MVS的三维重建算法学习笔记(一)— MVS三维重建概述与OpenMVS开源框架配置

  • 声明
  • 1. MVS(Multi-view stereo)概述
    • 稀疏重建与稠密重建的区别
    • 稀疏重建——SFM(Structure from Motion)算法
    • 稠密重建——MVS(Multi-view stereo)方法
      • 图像一致性
      • 立体匹配
  • 2. OpenMVS开源框架
    • 介绍
    • OpenMVS安装
    • OpenMVS测试
      • Meshlab下载
      • 测试数据集下载
      • 1. 稠密重建
      • 2. 曲面重建
      • 3. 网格优化
      • 4. 纹理贴图
  • 参考文献和资料

声明

本人书写本系列博客目的是为了记录我学习三维重建领域相关知识的过程和心得,不涉及任何商业意图,欢迎互相交流,批评指正。

1. MVS(Multi-view stereo)概述

MVS(多视点立体视觉,Multi-view stereo)能够单独从图像中构造出高度细节化的3D模型,采集一个庞大的图像数据集,用其来构建出一个用来解析图像的3D几何模型。MVS算法的流程图如下所示,输入为一组图像及其相应的摄像机参数:
在这里插入图片描述

  1. 采集图片;
  2. 计算每个图片的相机参数;
  3. 从图像集和相应的摄像机参数中重建场景的三维几何;
  4. 还原场景的构成材料;

稀疏重建与稠密重建的区别

稀疏重建通常是重建一些图像特征点的三维坐标,稀疏重建主要用于定位。稠密重建又称三维重建,是对整个图像或图像中绝大部分像素进行重建。二者分别对应着MVS三维重建方法中的第二步和第三步:稀疏重建一般使用SFM算法,得到每张图片的相机参数;稠密重建则对应着MVS中最核心的部分,一般所说的MVS算法指的就是稠密重建。

稀疏重建——SFM(Structure from Motion)算法

MVS算法的性能只取决于输入图像的质量和摄像机参数,所以MVS的成功很大程度上归功于底层的用来计算摄像机参数的SFM算法。SFM算法以一组图像作为输入,生成两个信息:每幅图像的摄像机参数和图像中可见的一组三维点,这些点通常被编码为轨迹。 轨迹被定义为重建的3D点的3D坐标和输入图像子集中对应的2D坐标的列表,算法流程如下图所示:
在这里插入图片描述
在这里插入图片描述

稠密重建——MVS(Multi-view stereo)方法

稠密重建是假设相机参数已知的情况下,寻找空间中具有光度一致性(Photo-consistency)的点,对场景进行立体匹配的过程

图像一致性

假设对于下面两幅图像和这样一个三维场景,若选择的三维点位于物体的表面上,那么这个三位点根据相机的内外参投影到图像上,以投影点为中心取出两个方形的小patch,那么它们所包含的场景应该是比较类似的;反之,如果这个点在物体外,两个小patch相差是比较大的,若能度量两个patch之间的一致性,就可以衡量这个三维点是否位于物体表面或者位于这个物体表面的概率大小。
在这里插入图片描述

立体匹配

立体匹配这一概念贯穿整个MVS方法,其目标就是从不同视角的图像中找到匹配的对应点,从而从二维图像中恢复出三维信息,即通过校正后的一对图像获取到视差图的过程,叫做立体匹配;而通过匹配后得到的视差图就能够转化为深度图,从而从深度图中获取图像的三维信息,完成稠密重建的任务。

在这里插入图片描述

2. OpenMVS开源框架

介绍

在这里插入图片描述

OpenMVS是一个比较经典的MVS(Multi-View Stereo)开源库,集成三维重建整个完整的技术方案(相机模型,多视立体几何,稠密重建,曲面重建,点云融合,纹理贴图)。在每个重建环节使用的都是非常经典有效的算法,例如包含目前三维重建非常经典有效的深度图重建算法SGM,PatchMatch。综合重建效果和性能,目前MVS是所有开源库中最好的。该框架还涉及Graph Cut、MRF、泊松融合等比较经典的通用算法原理与代码实现,以及常见的点云后处理和网格后处理(去噪、细分,去非流形,补洞)等图形学相关算法。
综合来说,OpenMVS非常适合入门系统学习和二次开发。代码框架非常完善,代码实现清晰且规范,可快速提高项目实战经验。学习三维重建必备。

OpenMVS安装

  1. Ubuntu 18.04+CMake+git+C/C++编译器(gcc等);
  2. 替换镜像,加快下载速度,具体参考教程;
  3. 准备一个空闲的机器安装以下任务:
sudo apt-get update -qq && sudo apt-get install -qq 
sudo apt-get -y install git cmake libpng-dev libjpeg-dev libtiff-dev libglu1-mesa- dev 
  1. 安装Eigen(version 3.2,Linux下只能是这个版本):
git clone https://gitlab.com/libeigen/eigen.git --branch 3.2 
mkdir eigen_build && cd eigen_build 
cmake . ../eigen
make && sudo make install 
cd ..
  1. 安装Boost:
sudo apt-get -y install libboost-iostreams-dev libboost-program-options-dev libboost-system-dev libboost-serialization-dev
  1. 安装OpenCV(version 2.4 or higher):
sudo apt-get -y install libopencv-dev
  1. 安装CGAL:
sudo apt-get -y install libcgal-dev libcgal-qt5-dev
  1. 安装VCGLib(注意要安装2020年的版本,参考教程):
git clone https://github.com/cdcseacave/VCG.git vcglib
  1. 安装OpenMVS:
git clone https://github.com/electech6/openMVS_comments.git openMVS 
mkdir openMVS_build && cd openMVS_build 
cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT="/path to vcglib/vcglib"

其中/path to vcglib/要改为自己系统下的vcglib的路径;
10. 生成OpenMVS库文件(在编译的过程中可能会出现一些warning,不用管,这一步会有许多种类的报错,具体的修改方案参考教程):

sudo make -j2 && sudo make install

OpenMVS测试

OpenMVS可执行文件生成在openMVS/openMVS_build/bin/里面,(-w 设置的是数据的路径,-i 是输入的文件名,-o是输出的文件名),执行命令时在openMVS_build文件夹中打开终端
在这里插入图片描述

Meshlab下载

参考教程

测试数据集下载

链接:https://pan.baidu.com/s/13T04aKJ2OB6_RX7IMMGhpg
提取码:oxkp
下载完的数据如下所示:
在这里插入图片描述
在这里插入图片描述

1. 稠密重建

./bin/DensifyPointCloud -w /path to data/data -i scene.mvs -o test_dense.mvs

其中/path to data/需要改为data在系统中的路径,运行后得到log和test_dense.ply:
在这里插入图片描述

在这里插入图片描述

2. 曲面重建

./bin/ReconstructMesh -w /path to data/data -i test_dense.mvs -o test_mesh.mvs

得到log和test_mesh.ply:
在这里插入图片描述

3. 网格优化

./bin/RefineMesh -w /path to data/data -i test_mesh.mvs -o test_refinemesh.mvs

得到log和test_refinemesh.ply:
在这里插入图片描述
在这里插入图片描述

4. 纹理贴图

./bin/TextureMesh -w /path to data/data -i test_refinemesh.mvs -o test_texture.mvs

得到log和test_texture.ply以及test_texture.png:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参考文献和资料

[1]Multi-View Stereo: A Tutorial
[2]三维重建笔记——稠密重建
[3]MVS——multi view system从多视图的密集重建(1)
[4]初识立体匹配

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

家政行业的数字转型:开发智能化家政预约APP的挑战与机遇

为了适应这一变化,许多家政企业开始积极探索数字化转型,其中包括开发智能化预约APP。本文将探讨开发智能化预约APP所面临的挑战与机遇。 ​一、挑战: 1.用户体验设计: -开发智能化预约APP需要注重用户体验设计,包括…

Android使用OpenGL和FreeType绘制文字

Open GL主要是渲染图形的,有时候需要绘制文字,网上搜了一下,基本思路都是把文字转成位图,再使用Open GL纹理进行渲染。加载纹理在特定阶段才能成功(在onSurfaceCreated中加载),这样就无法动态的…

动态规划(算法竞赛、蓝桥杯)--树形DP树形背包

1、B站视频链接&#xff1a;E18 树形DP 树形背包_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int n,V,p,root; int v[N],w[N]; int h[N],to[N],ne[N],tot; //邻接表 int f[N][N];void add(int a,int b){to[tot]b;ne[tot]h[a];h[a…

Docusaurus框架——react+antd+echarts自定义mdx生成图表代码解释文档

文章目录 ⭐前言⭐Docusaurus框架渲染mdx内容&#x1f496; 创建一个mdx文件&#x1f496; 创建一个react jsx文件&#x1f496; mdx引入react的组件并渲染&#x1f496; mdx引入react的组件源代码内容 ⭐渲染一个echarts地图的代码解释文档&#x1f496; echarts 渲染地图&…

idea中springboot项目创建后追加依赖

springboot项目创建后追加依赖 前言1、安装插件editstarters设置->插件 2、进入pom.xml 页面 前言 在项目创建的时候选择好依赖创建项目&#xff0c;之后追加依赖不是很方便&#xff0c;介绍一个简单的使用方法&#xff0c;通过editstarters进行添加 1、安装插件editstart…

html基本标签

<h1></h1> <p></p> h是标签从h1~h6&#xff0c;没用h7,h8 p是段落 <a href"https://www.educoder.net">Educoder平台</a> href可以指定链接进行跳转 <img src"https://www.educoder.net/attachments/download/2078…

C语言---文件操作(1)

1.文件的打开和关闭 fopen有2个参数&#xff0c;第一个是文件的名字&#xff0c;第二个是打开的模式&#xff08;例如是读文件还是写文件&#xff09; (1)该文件夹下面没有data.txt文件&#xff0c;但是我执行了read操作&#xff0c;所以会显示这样的错误 &#xff08;2&#…

链表类型题目

文章目录 简介链表的常用技巧两数相加原理代码代码|| 两两交换链表中的节点代码原理 重排链表(重要)原理代码 合并 K 个升序链表代码递归代码 K 个一组翻转链表原理代码 简介 大家好,这里是jiantaoyab,这篇文章给大家带来的是链表相关的题目练习和解析,希望大家能相互讨论进步 …

强化学习_06_pytorch-PPO实践(Hopper-v4)

一、PPO优化 PPO的简介和实践可以看笔者之前的文章 强化学习_06_pytorch-PPO实践(Pendulum-v1) 针对之前的PPO做了主要以下优化&#xff1a; batch_normalize: 在mini_batch 函数中进行adv的normalize, 加速模型对adv的学习policyNet采用beta分布(0~1): 同时增加MaxMinScale …

排序(3)——直接选择排序

目录 直接选择排序 基本思想 整体思路&#xff08;升序&#xff09; 单趟 多趟 代码实现 特性总结 直接选择排序 基本思想 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的…

JOSEF约瑟 漏电继电器LLJ-400F 配套零序互感器φ100mm 50-500mA 0.1S 导轨安装

系列型号&#xff1a; LLJ-150F(S)漏电继电器 LLJ-160F(S)漏电继电器 LLJ-200F(S)漏电继电器 LLJ-250F(S)漏电继电器 LLJ-300F(S)漏电继电器 LLJ-320F(S)漏电继电器 LLJ-400F(S)漏电继电器 LLJ-500F(S)漏电继电器 LLJ-600F(S)漏电继电器 一、产品用途及特点 LLJ-FS系列漏电继电…

MWC 2024丨美格智能推出5G RedCap系列FWA解决方案,开启5G轻量化新天地

2月27日&#xff0c;在MWC 2024世界移动通信大会上&#xff0c;美格智能正式推出5G RedCap系列FWA解决方案。此系列解决方案具有低功耗、低成本等优势&#xff0c;可以显著降低5G应用复杂度&#xff0c;快速实现5G网络接入&#xff0c;提升FWA部署的经济效益。 RedCap技术带来了…

MATLAB知识点:if条件判断语句的嵌套

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自​第4章&#xff1a;MATLAB程序流程控制 我们通过一个…

NCT 全国青少年编程图形化编程(Scratch)等级考试(一级)模拟测试H

202312 青少年软件编程等级考试Scratch一级真题 第 1 题 【 单选题 】 以下说法合理的是( ) A :随意点开不明来源的邮件 B :把密码设置成 abc123 C :在虚拟社区上可以辱骂他人 D :在改编他人的作品前&#xff0c; 先征得他人同意 正确答案&#xff1a; D 试题解析&…

【Scratch画图100例】图49-scratch绘制直角风车 少儿编程 scratch编程画图案例教程 考级比赛画图集训案例

目录 scratch绘制直角风车 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、实现流程 1、案例分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 …

regexpire-攻防世界-MISC

用nc链接靶机&#xff1a; rootkali:~/Desktop# nc 220.249.52.133 37944 Can you match these regexes? Bv*(clementine|sloth)*Q*eO(clinton|alien)*(cat|elephant)(cat|trump)[a-zA-Z]*(dolphin|clementine)\W*(table|apple)* 大致上是服务端给出一个正则表达式&#xff0c…

基于springboot的宠物咖啡馆平台的设计与实现论文

基于Spring Boot的宠物咖啡馆平台的设计与实现 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于Spring Boot的宠物咖啡馆平台的设计与实现的开发全过程。通过分析基于Spring Boot的宠物咖啡馆平台的设计与…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:形状裁剪)

用于对组件进行裁剪、遮罩处理。 说明&#xff1a; 从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 clip clip(value: boolean | CircleAttribute | EllipseAttribute | PathAttribute | RectAttribute) 按指定的形状对当…

数据结构:排序算法+查找算法

一、概念 程序数据结构算法 1.算法的特性和要求 特性&#xff1a; 确定性&#xff08;每次运行相同的输入都是同样的结果&#xff09;、有穷性、输入、输出、可行性 设计要求&#xff1a; 正确性、高效率、低存储、健壮性、可读性 2.时间复杂度 3.常见排序算法的时间复杂…

6.5 共享数据

本节介绍Android的四大组件之一ContentProvider的基本概念和常见用法&#xff1a;首先说明如何使用内容提供器封装内部数据的外部访问接口&#xff0c;然后阐述如何使用内容解析器通过外部接口操作内部数据&#xff0c;最后叙述如何利用内容解析器读写联系人信息&#xff0c;以…