三维重建_使用OpenMVG/OpenMVS重建场景

news2024/12/27 11:43:11

目录

1. 安装环境

1.1 安装OpenMVS

1.2 安装OpenMVG

2. 测试

2.1 下载数据

2.2 进行三维重建

2.2.1 OpenMVG提取稀疏点云

2.2.2 OpenMVS稠密化点云/网格化/纹理贴图

3. 运行遇到问题记录

4. 参考


1. 安装环境

本地环境: Ubuntu20.04 没有cuda

1.1 安装OpenMVS

  安装指南(官网):https://github.com/cdcseacave/openMVS#build

安装eigen3.4

git clone https://gitlab.com/libeigen/eigen.git --branch 3.4 
cd eigen 
mkdir build 
cd build 
cmake .. #make #eigen只有头文件,不用编译 
sudo make install #安装(即复制)到/usr/include/eigen3目录下

安装vcg:


git clone -b devel https://github.com/cnr-isti-vclab/vcglib.git #vcg只有头文件,不用编译

# 但要修改一处代码: HETYPE ht=*this; ==》 MTTYPE ht=*this;

遇到一处编译错误,更改代码即可:HETYPE ht=*this; ==》 MTTYPE ht=*this;

安装glfw3 (可选)

sudo apt‐get install freeglut3‐dev libglew‐dev libglfw3‐dev

下载、编译openMVS

git clone https://github.com/cdcseacave/openMVS 
mkdir openMVS_build 
cd openMVS_build 
#Cmake 配置下 
cmake . ../openMVS -DCMAKE_BUILD_TYPE=Release -DVCG_ROOT=../vcglib/ 
#make编译下: 
make -j4

1.2 安装OpenMVG

安装指南(官网): https://github.com/openMVG/openMVG/blob/develop/BUILD.md#linux

#下载依赖项
$ sudo apt-get install libpng-dev libjpeg-dev libtiff-dev libxxf86vm1 libxxf86vm-dev libxi-dev libxrandr-dev
#If you want see the view graph svg logs, install Graphviz.
$ sudo apt-get install graphviz

#Checkout OpenMVG.
$ git clone --recursive https://github.com/openMVG/openMVG.git
$ mkdir openMVG_Build && cd openMVG_Build

#Configure and build
$ cmake -DCMAKE_BUILD_TYPE=RELEASE ../openMVG/src/
$ cmake --build . --target install
  • 遇到问题1:cannot import name 'soft_unicode' from 'markupsafe'

  • ImportError: cannot import name 'soft_unicode' from 'markupsafe' (/anaconda3/lib/python3.9/site-packages/markupsafe/__init__.py)

    • 解决方法: python -m pip install markupsafe==2.0.1 # https://blog.csdn.net/weixin_45438997/article/details/124261720

  • 遇到问题2:libQt5Core.so undefined reference to `std::__exception_ptr::exception_ptr::_M_release()@CXXABI_1.3.13

  • 原因及解决方法:libstdc++.so.6.0.28 的 strings 中 没有CXXABI_1.3.13

  • 复制一个libstdc++.so.6.0.29 到对应的目录即可,

  • 参考: https://blog.csdn.net/weixin_39643007/article/details/120533472

OpenMVG安装目录:

/usr/local/include/openMVG/...

/usr/local/include/openMVG_dependencies/nonFree/sift/. ...

/usr/local/lib/libopenMVG_features.a ...

/usr/local/lib/openMVG/webgl ...

/usr/local/bin/openMVG_main_SfM ...

2. 测试

2.1 下载数据

数据地址:https://github.com/openMVG/ImageDataset_SceauxCastle

下载的文本包含 images文件夹 和 Readme.txt文件

2.2 进行三维重建

整体流程梳理如下:

2.2.1 OpenMVG提取稀疏点云

cd path-to/ImageDataset_SceauxCastle-master
mkdir output/matches -p #递归建立文件夹

#生成 sfm_data.json 文件列表文件
openMVG_main_SfMInit_ImageListing -i ./images -o output/matches -f 3399
# “-f 3399” : 第一个命令-f 后面跟的是拍摄照片时的焦距与照片长边像素个数的乘积
# 这里 2832 * 1.2 =3398.4 ≈ 3399

#计算图像特征点和描述子 生成这样100_7100.desc  100_7100.feat 的文件
openMVG_main_ComputeFeatures -i output/matches/sfm_data.json -o output/matches/
#计算匹配关系
openMVG_main_ComputeMatches -i output/matches/sfm_data.json -o output/matches/matches.txt

#生成稀疏点云
openMVG_main_SfM -i output/matches/sfm_data.json -o output/matches/ --match_file output/matches/matches.txt

#提取矫正后的图像(可选)
openMVG_main_ExportUndistortedImages -i output/matches/sfm_data.json -o output/matches/image

#转换成mvs的格式,同时在当前目录下生成undistorted_images文件夹并存储了矫正后的图像
openMVG_main_openMVG2openMVS -i output/matches/sfm_data.bin -o output/scene.mvs
 

重建的稀疏点云结果:

2.2.2 OpenMVS稠密化点云/网格化/纹理贴图

######使用OpenMVS (mkdir openMVS_build 然后编译) ########
# 1 切换到OpenMVS目录
cd path-to/openMVS_build/bin
# 2 将 undistorted_images 复制到 openMVS_build 目录下
cp path-to/ImageDataset_SceauxCastle-master/undistorted_images ../ -r
# 3 稠密化稀疏点云scene.mvs,生成scene_dense.mvs
./DensifyPointCloud path-to/ImageDataset_SceauxCastle-master/output/scene.mvs
# 4 使用稠密点云scene_dense.mvs,网格重建,生成scene_dense_mesh.mvs
./ReconstructMesh path-to/ImageDataset_SceauxCastle-master/output/scene_dense.mvs
# 5 网格优化,生成scene_dense_mesh_refine.mvs
./RefineMesh path-to/ImageDataset_SceauxCastle-master/output/scene_dense_mesh.mvs
# 6 纹理贴图
./TextureMesh path-to/ImageDataset_SceauxCastle-master/output/scene_dense_mesh_refine.mvs
# 7 显示结果
./Viewer path-to-/ImageDataset_SceauxCastle-master/output/scene_dense_mesh_refine_texture.mvs

三维重建效果:

3. 运行遇到问题记录

问题1:DepthMap.cpp:730 ASSERT(ISEQUAL(norm(normalMap0(nx)), 1.f))

执行: ./DensifyPointCloud path-to/ImageDataset_SceauxCastle-master/output/scene.mvs 报错: DensifyPointCloud: /home/path-to/openMVS/libs/MVS/DepthMap.cpp:730: void MVS::DepthEstimator::ProcessPixel(SEACAVE::IDX): Assertion `ISEQUAL(norm(normalMap0(nx)), 1.f)' failed. 已放弃 (核心已转储)

解决方法: 注销掉,重新编译openMVS

// ASSERT(ISEQUAL(norm(normalMap0(nx)), 1.f)); //JOHN_delete

4. 参考

  • UBUNTU16.04+OPENMVG+OPENMVS(三):实现自己数据的三维重建

  • Ubuntu 安装并使用OpenMVG和OpenMVS(保姆级教程)_哇哈哈347的博客-CSDN博客

  • 使用 OpenMVG+PMVS实现视觉三维重建_wx5d23599e462fa的技术博客_51CTO博客

  • ubuntu学习技巧4: qt多版本更换以及更新更高版本的qt_如何更新qt版本代码-CSDN博客

  • https://github.com/openMVG/openMVG/issues/1973

  • ubuntu安装meshlab,很简单_R-G-B的博客-CSDN博客

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

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

相关文章

英特尔参与 CentOS Stream 项目

导读红帽官方发布公告欢迎英特尔参与进 CentOS Stream 项目,并表示 “这一举措不仅进一步深化了我们长期的合作关系,也构建在英特尔已经在 Fedora 项目中积极贡献的基础之上。” 目前,CentOS Stream 共包括以下特别兴趣小组(SIG&a…

排序算法之【归并排序】

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、C语言刷题训练营、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 &#x1f44d…

oralce配置访问白名单的方法

目录 配置sqlnet.ora文件 重新加载使配置生效 注意事项 Oracle数据库安全性提升:IP白名单的配置方法 随着互联网的发展,数据库安全问题也越来越严重。Oracle是目前使用较为广泛的一款数据库管理系统,而IP白名单作为提升数据库安全性的有效…

骑行上下坡,如何分配重心?让你的骑行更稳定、更安全

骑行,作为一种环保、健康的出行方式,越来越受到人们的喜爱。然而,在骑行过程中,尤其是上下坡时,如何分配好重心,确保骑行的稳定性和安全性呢?本文将为您提供一些实用的技巧,让您的骑…

电脑被删除的文件怎么恢复?2023年数据恢复方法分享

大多数人在使用电脑时都可能会遇到误删文件的情况。一不小心,重要的文件或数据就消失了,情急之下,大多会感到慌乱和无助。但其实,文件误删除并非不可挽回的灾难。本文将为大家介绍几种有效的文件恢复方法,以帮助大家在…

【Proteus仿真】【STM32单片机】汽车倒车报警系统设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602液晶、按键、继电器电机模块、DS18B20温度传感器、蜂鸣器LED、HCSR04超声波等。 主要功能: 系统运行后,LCD1602显…

MFC界面控件添加函数小技巧

1..选中控件的属性,点击闪电形状 2.在右侧的点击方式选中生成函数 选择需要响应的消息方式。代码会自动创建响应函数

延时队列java

Redis过期键通知(使用redis来实现延迟通知) Slf4j public class KeyExpiredListener extends KeyExpirationEventMessageListener {public KeyExpiredListener(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}Overridep…

NodeMCU ESP8266 外设的 Arduino API 接口介绍

NodeMCU ESP8266 外设的 Arduino API 接口介绍 文章目录 NodeMCU ESP8266 外设的 Arduino API 接口介绍前言模块中断数字IO模拟输入模拟输出延时串口 总结 前言 Arduino在硬件上做了相应的封装,新的硬件需要兼容Arduino的接口。比如NodeMCU ESP8266的底层硬件做一次…

【Unity C#_菜单Window开发系列_Inspector Component UnityEditor开发】

GUI系列操作 1.枚举菜单实现文件1:Assets/MyScript/Test1.cs代码如下: 文件2:Assets/MyScript/Editor/Test1Editor.cs代码如下: 测试一下新建一个场景,新建一个Empty 节点,用来测试枚举组件将文件1&#xf…

百面机器学习书刊纠错

百面机器学习书刊纠错 P243 LSTM内部结构图 2023-10-7 输入门的输出 和 candidate的输出 进行按元素乘积之后 要和 遗忘门*上一层的cell state之积进行相加。

格雷希尔针对汽车空调高压管异型管口快速密封的G72R高压连接器

汽车散热是汽车热管理的重要部件,不管是燃油车还是新能源车,散热都是必不可少的零部件,从散热水箱、到车用空调冷凝器、蒸发器、空调高压管件等,由于位置和固定方式等影响,虽然管件直径比较标准,但接口部分…

Python3操作文件系列(一):判断文件|目录是否存在三种方式

Python3操作文件系列(一):判断文件|目录是否存在三种方式 Python3操作文件系列(二):文件数据读写|二进制数据读写 Python3数据文件读取与写入 一: 文件操作认知: 提升认知:Python判断文件是否存在的三种方法1.使用os模块2.判断文件是否可做读写操作3.使用Try语句…

二、Excel VBA 简单使用

Excel VBA 从入门到出门一、Excel VBA 是个啥?二、Excel VBA 简单使用 👋Excel VBA 简单使用 ⚽️1. 如何在Excel中手动编写VBA代码⚽️2. 如何在 Excel 中运行 VBA 代码⚽️3. 如何在Excel中记录VBA代码⚽️4. 如何在Excel中编辑录制的VBA代码⚽️5. 如…

学习笔记|ADC|NTC原理|测温程序|STC32G单片机视频开发教程(冲哥)|第十九集:ADC应用之NTC

文章目录 1.NTC的原理开发板上的NTC 2.NTC的测温程序编写3.实战小练总结课后练习 1.NTC的原理 NTC(Negative Temperature Coefficient)是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。该材料是利用锰、铜、硅、钴、铁、镍、锌…

经典算法-----01背包问题(动态规划)

目录 前言 01背包问题 问题描述 ​编辑 动态规划 基本概念 怎么理解动态规划? 解决01背包问题 代码实现 前言 今天我们学习一种新的算法---动态规划,这种算法思想是属于枚举的一种,下面我就通过01背包问题来说明这种算法的解决思路。 01背包问…

GEE17: 基于Theil-Sen Median斜率估计和Mann-Kendall趋势分析方法分析四川省2022年NDVI变化情况

Theil-Sen Median Mann-Kendall 1. Theil-Sen Median Mann-Kendall 原理1.1 Theil-Sen Median1.2 Mann-Kendall 2. GEE code 1. Theil-Sen Median Mann-Kendall 原理 1.1 Theil-Sen Median Theil-Sen Median方法又称为Sen斜率估计,是一种稳健的非参数统计的趋势…

LeakyReLU激活函数

nn.LeakyReLU 是PyTorch中的Leaky Rectified Linear Unit(ReLU)激活函数的实现。Leaky ReLU是一种修正线性单元,它在非负数部分保持线性,而在负数部分引入一个小的斜率(通常是一个小的正数),以防…

JVM(八股文)

目录 一、JVM简介 二、JVM中的内存区域划分 三、JVM加载 1.类加载 1.1 加载 1.2 验证 1.3 准备 1.4 解析 1.5 初始 1.6 总结 2.双亲委派模型 四、JVM 垃圾回收(GC) 1.确认垃圾 1.1 引用计数 1.2 可达性分析(Java 采用的方案&a…