已知相机内外参通过COLMAP进行稀疏/稠密模型重建操作过程

news2025/1/18 6:49:59

      在https://colmap.github.io/faq.html#reconstruct-sparse-dense-model-from-known-camera-poses  中介绍了已知相机内外参如何通过COLMAP进行稀疏和稠密模型重建的过程,这里按照说明操作一遍:

      在instant-ngp中,执行scripts/colmap2nerf.py时除了生成transforms.json外,还有一些中间文件生成,如colmap_text目录,此目录下有3个文件:
      (1).cameras.txt:相机内参
      (2).images.txt:相机外参
      (3).points3D.txt:3D点云数据
      这里以lego中train目录的数据作为测试集,执行命令如下:注:执行命令前移除train中的r_48.png和r_91.png两幅图像,因为在执行colmap2nerf.py时,此两幅图像并没有进入images.txt中

python ../../../scripts/colmap2nerf.py --colmap_matcher exhaustive --colmap_camera_model PINHOLE --run_colmap --images train --aabb_scale 4

      1.在instant-ngp/data/nerf/lego目录下新建目录reconstruct/created/sparse/model,将colmap_text目录下的3个文件拷贝到此目录下并做修改:模拟已知的相机内外参,实际中应为真实场景获取的数据

mkdir -p reconstruct/created/sparse/model
cp -a colmap_text/* reconstruct/created/sparse/model/

      (1).cameras.txt:不需要调整
      (2).images.txt:调整,每两行定义一幅图像的信息,删除第二行
      (3).points3D.txt:清空

      2.提features,执行如下命令:执行结果如下图所示,生成database.db

colmap feature_extractor --ImageReader.camera_model PINHOLE --database_path database.db --image_path ../train

      3.手动导入相机内参:将cameras.txt中的内参拷贝到database.db中. IMAGE_ID为对应图像在database management的顺序,CAMERA_ID为对应使用的相机,若只使用一台相机全为1.
      手动导入:
      (1).打开COLMAP GUI,双击COLMAP.bat;
      (2).File --> New project: 
            1).Database:Open,刚生成的database.db
            2).Images:Select, 选择存放图像集的目录,然后点击Save
      (3).Processing --> Database management:点击Cameras,对每个camera_id的params进行修改:修改为cameras.txt对应的,注意:两边的CAMERA_ID要一一对应,如下图所示:

      4.特征匹配,执行如下命令:结果如下图所示,database.db会被修改 

colmap exhaustive_matcher --database_path database.db

      5.点三角测量,执行如下命令:目录triangulated/sparse/model需要手动创建 

colmap point_triangulator --database_path database.db --image_path ../train --input_path created/sparse/model --output_path triangulated/sparse/model

      处理错误:reconstruction.cc:79 Check failed: existing_image.Name() == image.second.Name() (r_13.png vs. r_11.png)
      将database.db中Images中image_id, camera_id, name三者要与images.txt中的完全一一对应,database.db中Images内容如下图所示:按照此顺序,调整images.txt,注:只修改IMAGE_ID的值,不要忘记最后的空行

      修改后重新执行上述命令,结果如下图所示:triangulated/sparse/model目录下会生成cameras.bin, images.bin, points3D.bin, database.db也会被修改

      6.查看稀疏模型重建结果:打开COLMAP GUI
      (1).File --> Import Model: 选择triangulated/sparse/model目录
      (2)."Directory does not contain a project.ini" 点击:No: 查看重建结果,结果如下图所示:
      (3).导出model为txt:File --> Export model as text: 将结果保存在triangulated/sparse/model目录下:会生成project.ini, cameras.txt, images.txt, points3D.txt,可与created/sparse/model目录下的文件作对比,看两边camera_id, image_id是否一致,不一致会影响后续的执行 

      7.image undistorter,执行如下命令:结果如下图所示,dense/workspace目录需手动创建,dense/workspace目录下会生成images、sparse、stereo三个目录 

colmap image_undistorter --image_path ../train --input_path triangulated/sparse/model --output_path dense/workspace

 

      8.稠密3D重建,执行如下命令:结果如下图所示,注,此步需要CUDA支持,Anaconda安装时并没有指定,这里使用从官网下载的可执行文件,并且需要将lib目录下的动态库拷贝到colmap.exe目录下,否则会提示缺少各种动态库,此步比较耗时,在台式机上执行,在dense/workspace/stereo目录下,depth_maps和normal_maps目录内会增加类似r_0.png.geometric.bin,r_0.png.photometric.bin文件 

D:/soft/COLMAP/COLMAP-3.8-windows-cuda/bin/colmap.exe patch_match_stereo --workspace_path dense/workspace

      9.稠密点云融合,执行如下命令:结果如下图所示,在dense/workspace目录下会生成fused.ply文件 

colmap stereo_fusion --workspace_path dense/workspace --output_path dense/workspace/fused.ply

      10.查看稠密模型重建结果:打开COLMAP GUI
      (1).Reconstruction --> Dense reconstruction: 点击Select,选择dense/workspace目录
      (2).点击Fusion,稍等片刻,弹出对话框,为了可视化点云,点击Yes,结果如下图所示
      (3).关闭Dense reconstruction,可对可视结果进行缩小、放大、旋转等操作

 

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

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

相关文章

request页面代码逻辑

一. 封装请求基地址 在src目录下面建一个api文件夹 然后在文件夹里面新建一个专门放用户请求的use.js 用axios发送请求 在use.js文件夹里导入request 在src目录新建发送请求的页面并导入封装好的请求 然后把这个请求封装成一个函数,这个函数里需要传入两个参数。 …

Xavier或TX2配置ipv4地址

输入ifconfig查看本地ipv4地址,发现并没有设置,无法通过以太网与其他主机通信。下面来配置系统的以太网地址。 1、编辑文件/etc/network/interfaces: sudo gedit /etc/network/interfaces2、用下面的内容来替换有关eth0的行,并且将ip地址等信…

Java中抽象类和接口的区别,一文弄懂,图文并茂

目录 前言 1. 抽象类 1.1 定义 1.2 示例 1.3 使用 1.3.1代码-抽象类 1.3.2代码-抽象类继承类使用 1.3.3输出结果为: 1.4UML类图展示类间的关系 2. 接口 2.1 定义 2.2 示例 2.2.1代码-接口 2.3 使用 2.3.1代码-接口实现 2.3.2代码-接口实现类使用 2…

【Linux】驱动内核调试,没有几板斧,怎么能行?

目录 前言: 一、基础打印工具 (1)printk---最常用 ①Log Buffer: ②Console: ③RAM Console: (2)动态打印 ①动态打印与printk之间的区别联系 ②动态打印常用的例子 ③动态打印转为pri…

C语言实战 - 贪吃蛇(图形界面)

由于本人精力有限,暂时先把素材和代码放上,等以后有空再补教程。 目录 效果预览 准备工作 EasyX图形库 音频素材 代码编写 Transfer.h文件 game.cpp文件 main.c文件 效果预览 先来看一下最终成品效果 贪吃蛇图形界面 准备工作 EasyX图形库 这…

[230513] TPO72 | 2022年托福阅读真题第1/36篇 | 10:45

Invading Algae 目录 Invading Algae 全文 题目 Paragraph 1 P1 段落大意 问题1 Paragraph 2 P2 段落大意 问题2 *问题3* Paragraph 3 P3 段落大意 问题4 Paragraph 4 P4 段落大意 Paragraph 5 P5 段落大意 *问题5* *问题6* 问题7 问题8 问题9…

【计算机组成原理】第二章 运算方法和运算器

系列文章目录 第一章 计算系统概论 第二章 运算方法和运算器 第三章 多层次的存储器 第四章 指令系统 第五章 中央处理器 第六章 总线系统 第七章 外围设备 第八章 输入输出系统 文章目录 系列文章目录第一章 计算系统概论 **第二章 运算方法和运算器** 第三章 多层次的存储器…

C++移动构造函数

一、背景 拷贝构造函数又分为浅拷贝和深拷贝: 浅拷贝:当类中有指针时,直接复制,会使多个指针指向同一块内存,导致重复析构 深拷贝:每次都是重新赋值一份,这种方法内存消耗较大 因此C就提供…

一觉醒来Chat gpt就被淘汰了

目录 什么是Auto GPT? 与其他语言生成模型相比,Auto GPT具有以下优点 Auto GPT的能力 Auto GPT的能力非常强大,它可以应用于各种文本生成场景,包括但不限于以下几个方面 Auto GPT的历史 马斯克说:“ChatGPT 好得吓…

【C++从0到王者】第三站:类和对象(中)赋值运算符重载

文章目录 一、运算符重载1.运算符重载的使用2.运算符重载的注意事项 二、赋值运算符重载1.复制拷贝与拷贝构造2.赋值运算符重载的格式3.赋值运算符重载的实现4.赋值运算符重载的注意事项 一、运算符重载 1.运算符重载的使用 当我们实现一个日期类的时候,我们有时候…

一个*泰NL18-20漏电保护器的拆解

一个*泰NL18-20漏电保护器的拆解,购买很早了,损坏,按test按钮无动作,昨天用一个雷*的63A漏保替换了。 NL18-20的电流只有20A。显然不适合现在的运用了。而且是无灭弧装置,所以分断能力有限。 好奇,拆开来看…

C++PrimerPlus第四章编程题

编程题 题目总览 编程题题解 题目要求输入四次信息,有四次交互的输入(in),最后在一口气列举出来。同时对于firstname与lastname进行了拼接,而且对于输入的成绩进行降级操作。同时对于名字name的要求是可以输入多个单词…

使用Flink MySQL cdc分别sink到ES、Kafka、Hudi

环境说明 [flink-1.13.1-bin-scala_2.11.tgz](https://archive.apache.org/dist/flink/flink-1.13.1/flink-1.13.1-bin-scala_2.11.tgz)[hadoop-2.7.3.tar.gz](https://archive.apache.org/dist/hadoop/common/hadoop-2.7.3/hadoop-2.7.3.tar.gz)[flink-cdc-connectors](https:…

【Base64】前后端图片交互(2)

使用Base64去处理前后端图片交互 一、Base64编码介绍二、java.util.Base64 介绍源码分析编码译码 三、使用 Base64 前后端图片交互(实操)四、效果展示五、总结 绪论:在此之前小编发过一次前后端交互处理的方式:前后端图片交互的简…

深度学习之图像分类(三):VGGNet

系列文章目录 本专栏介绍基于深度学习进行图像识别的经典和前沿模型,将持续更新,包括不仅限于:AlexNet, ZFNet,VGG,GoogLeNet,ResNet,DenseNet,SENet,Mobile…

Windows磁盘空间不够,发现DriverStore文件夹特别大

正想安装一个新的VS2022,但是发现C盘的空间已经不足, 显示为红色了,这样不能安装。只好找一下C盘的空间为什么不足了,后来发现有一个目录特别大,这个目录就是DriverStore文件夹。由于电脑已经运行5年了,也…

Java的线程

介绍线程 线程是系统调度的最小单元,一个进程可以包含多个线程,线程是负责执行二进制指令的。 每个线程有自己的程序计数器、栈(Stack)、寄存器(Register)、本地存储(Thread Local&#xff09…

Linux的基本权限

基本权限 1.权限的概念2.Linux上的用户分类2.1. 如何切换用户? 3.Linux的权限管理3.1. 文件访问者的分类(人)3.2.文件类型和访问权限(文件属性)3.2.1. 文件类型3.2.2. 基本权限 3.3. 文件权限值的表示方法3.3.1. 字符表…

Mac中idea快捷键(Keymap->macOS)

背景: mac:MacBook Pro(13英寸,M2,2022年) 系统版本:12.4 idea快捷键配置:本文快捷键设置基于macOS(Keymap->macOS) 一、常用快捷键 1.commandF 在当前…

java类和对象2

文章目录 一、Java实例变量和类变量二、Java实例方法和类方法三、Java方法重载四、Java this关键字五、Java包六、Java import语句七、Java访问权限八、Java基本类型的类封装九、Java jar文件总结 一、Java实例变量和类变量 实例变量和类变量的定义 在声明成员变量时&#xf…