BundleFusion那些事儿

2023-05-16

背景:前面几篇博客中写了很多关于BundleFusion的东西,主要包括bundlefusion的论文阅读笔记,.sens数据集的生成等,经过最近几天的工作,我对bundlefusion又有了新的技术积累,在这里整理一下,也算是理一下思路,然后开始新的工作。

1. 生成.sens文件

根据在https://graphics.stanford.edu/projects/bundlefusion/下载的.zip的数据集可知,一个数据集中包含,以frame-xxxxxx.color.png的彩色图像,有以frame-xxxxxx.depth.png命名的深度图像,以及,以frame-xxxxxx.pose.txt命名的位姿文件,该文件中存储的是一帧位姿,一个4x4的矩阵。如下图所示,所以首先你需要想办法得到这种标准格式的数据。我曾经把我使用kinectV2相机获取的深度图和彩色图对齐后的数据编辑为如下格式,所有的.pose.txt文件中我都写入单位阵。我还试着将TUM数据集和ICL-NUIM数据集编辑成下面这种格式,并且我将数据集提供的groundtruth写入到.pose.txt文件中,目的是想让bundlefusion按照groundtruth位姿来重建。由于数据集提供的groundtruth是用四元数表示的旋转,所以需要将四元数转换为旋转矩阵,由于我使用的是python脚本,这个是时候,scipy库就派上用场了,这里面有很多转换,包括,四元数,旋转矩阵,旋转向量,欧拉角之间的转换。

当然不要忘了,在目录的最后还有一个info.txt文件, 除了彩色图的尺寸,相机的内参数,要按照实际情况改写之后,还有很关键的一个参数就是m_depthShift,在BundleFusion官网上下载的数据集,info.txt中设置的m_depthShift =1000,而在我生成TUM和ICL的数据集时,这个值就得设置为10000,否则生成的数据集,重建不出来模型,具体的分析请阅读我的这篇博客,https://blog.csdn.net/weixin_38636815/article/details/107563959

 下面是我将ICL数据集整理成上述格式的python脚本

import numpy as np
from scipy.spatial.transform import Rotation as R
import associate
import os
import shutil

def copy_files(sourcefile):
    rgb_path = sourcefile+"rgb/"
    depth_path = sourcefile + "depth/"
    bf_path = sourcefile + "bf_dataset/"
    print(rgb_path)
    print(depth_path)

    rgb_images = os.listdir(rgb_path)
    depth_images = os.listdir(depth_path)
    rgb_int = []
    depth_int = []
    for rgb in rgb_images:
        rgb = rgb.replace('.png', '')
        # print(rgb)
        rgb_int.append(int(rgb))
    for depth in depth_images:
        depth = depth.replace('.png', '')
        depth_int.append(int(depth))

    rgb_id = 0
    for rgb_name in sorted(rgb_int):
        print("frame-" + str(rgb_id).zfill(6) + ".color.png" + " is writing into bf_dataset" )
        shutil.copyfile(rgb_path + "/" + str(rgb_name) + ".png",
                        bf_path + "frame-" + str(rgb_id).zfill(6) + ".color.png")
        rgb_id += 1

    depth_id = 0
    for depth_name in sorted(depth_int):
        print("frame-" + str(depth_id).zfill(6) + ".depth.png" + " is writing into bf_dataset")
        shutil.copyfile(depth_path + "/" + str(depth_name) + ".png",
                        bf_path + "frame-" + str(depth_id).zfill(6) + ".depth.png")
        depth_id += 1

    """
    transform quaternion into rotation and write them into separated pose files
    """
    gt_file = open(sourcefile + "livingRoom3n.gt.freiburg")
    gt_data =gt_file.read()
    lines = gt_data.replace(",", " ").replace("\t", " ").split("\n")
    positions = []
    quaternions = []
    lines_data = []
    for line in lines:
        line_data = []
        if len(line) > 0 and line[0] != '#':
            for v in line.split(' '):
                line_data.append(v)
            lines_data.append(line_data)
            # print(line_data)
    share_vect = np.array([0, 0, 0, 1], dtype=np.float32)[np.newaxis, :]
    pose_id = 0
    for line in lines_data:
        single_position = np.array([line[1], line[2], line[3]], dtype=np.float32)[:, np.newaxis]
        single_quaternion = np.array([line[4], line[5], line[6], line[7]], dtype=np.float32)
        positions.append(single_position)
        quaternions.append(single_quaternion)

        rotation = R.from_quat(single_quaternion)
        m34 = np.concatenate((rotation.as_matrix(), single_position), axis=1)
        m44 = np.concatenate((m34, share_vect), axis=0)
        print("frame-" + str(pose_id).zfill(6) + ".pose.txt" + "is writing into bf_dataset")
        fp = open(bf_path + "frame-" + str(pose_id).zfill(6) + ".pose.txt", 'w')
        for row in m44:
            # fp.write(" ".join(row) + "\n")
            fp.write(' '.join(str(i) for i in row) + '\n')
        pose_id += 1
    print(len(positions))
    print(len(quaternions))

if __name__ == '__main__':
    print('test')
    # copy_files("/media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt0/living_room_traj0_frei_png/")
    # copy_files("/media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt1/living_room_traj1n_frei_png/")
    # copy_files("/media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt2/living_room_traj2n_frei_png/")
    copy_files("/media/yunlei/YL/DATASETS/ICL_DATABASE/lr_kt3/living_room_traj3n_frei_png/")

假设现在已经 整理出的规范的文件格式,现在我们需要一个工具,将彩色图,深度图和位姿数据写入到.sens文件中,在BundleFusion工程中有实现将图像写入到.sens文件的函数,只需要用下面的mian函数替换你原工程 BundleFusion/FriedLiver/Source下FriedLiver.cpp中的主函数,在新的主函数中写入你自己数据的路径和名称,使用ctrl+F5的方式在vs2013中运行此时的工程,可以在saveToFile函数中加上一些打印信息,这样可以更清楚的看到数据的生成状态。不出意外的话上述方式就可以成功生成.sens文件。

int main()
{
	ml::SensorData sd;
	sd.initDefault(640, 480, 640, 480, sd.m_calibrationColor, sd.m_calibrationDepth);
	sd.loadFromImages("E:/DATASETS/ICL_DATABASE/lr_kt1/living_room_traj1n_frei_png/bf_dataset", "frame-", "png");
	sd.saveToFile("E:/DATASETS/ICL_DATABASE/lr_kt1/living_room_traj1n_frei_png.sens");
	std::cout << "generate sens data" << std::endl;
	return 0;
}

二、使用自己生成的.sens文件运行BundleFusion

如果你想通过ctrl+F5的方式运行代码,那么你就修改,位于BundleFusion-master/FriedLiver下的zParametersDefault.txt下的s_binaryDumpSensorFile,当然你也可以先在vs2013上编译工程,然后双击 BundleFusion-master/FriedLiver/x64/Release下的FriedLiver.exe可执行文件,这个时候你需要修改,FriedLiver.exe同目录下的zParametersDefault.txt文件中的s_binaryDumpSensorFile变量。两个配置文件中的其他一些参数也要调整,尤其是有关图像的宽度和高度的变量,要根据你数据集的实际大小来修改。需要注意的是,在zParametersBundingDefault.txt文件中的s_downsampledWidth和s_downsampledHeight这两变量的值设置不当,会导致系统很容易跟踪失败,大面积的跟踪失败会导致重建的模型不完整。

如果不出什么意外,自己生成的数据集就可以在bundlefusion上运行了。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BundleFusion那些事儿 的相关文章

随机推荐

  • 快速构建,一款轻量级的企业知识分享与团队协同软件开源了!

    今天给大家分享一款开源的轻量级的企业知识软件 xff0c 主打一个实用 xff01 介绍 MM Wiki 是一个轻量级的企业知识分享与团队协同软件 xff0c 可用于快速构建企业 Wiki 和团队知识分享平台 部署方便 xff0c 使用简单
  • “sudo: aptitude: command not found”问题解决办法

    caoxuepeng 64 caoxuepeng G3 3579 sudo aptitude install libhdf5 serial dev sudo aptitude command not found 问题描述 xff1a 命令不
  • apm软件仿真+QGC地面站 环境搭建

    本教程使用场景 xff1a apm软件仿真运行于虚拟机 ubuntu环境 qgc地面站位于windows 系统 两个环境在同一台电脑上 一 apm仿真环境搭建 1 安装vm虚拟机及ubuntu 18 2 ubuntu下 下载Ardupilo
  • GPS基础知识(四)、GPS信号结构

    GPS信号结构 xff08 三层 xff09 载波伪码数据码 一 xff0c 载波 载波是三层的基础 xff0c 伪码和数据码都是调制在载波上才能发送 GPS有两个载波频率 xff0c L1和L2 xff0c L1为1575 42MHz x
  • 简述四种干扰观测器(三)————基于扩张状态观测器的干扰观测器

    本节以最广泛应用的二阶系统为例介绍通用的线性观测器 非线性的扩张状态观测器将在将在自抗扰控制中介绍 观测器设计问题 xff0c 就是重新构造一个系统 xff0c 利用原系统中可以直接测量到的输出向量和输入向量作为它的输入信号 xff0c 并
  • Typora+PicGo+阿里云oss

    阿里云Oss图床 43 PicGo 43 Typora 之前用的gitee网上说可能会不稳定 xff0c 我就改成了阿里云OSS对象存储 参考 xff1a PicGo配置阿里云OSS 栗筝i的博客 CSDN博客 picgo 阿里云 1 注册
  • centos安装软件失败

    错误 xff1a 为仓库 appstream 下载元数据失败 Cannot prepare internal mirrorlist No URLs in mirrorlist 问题参考 CentOS Linux 8 AppStream 错误
  • Docker容器安装ssh

    Docker 容器里安装ssh和连接ssh 在服务器创建容器中安装了anaconda xff0c 为了方便敲代码 xff0c 用pycharm连接容器中的anaconda xff0c 我们需要安装ssh服务 前提 创建好docker容器 x
  • 阿里云创始人王坚正式回归阿里云

    5 月 11 日消息 xff0c 阿里云创始人王坚正式回归阿里云 据多名知情人士透露 xff0c 早在 2022 年底 xff0c 王坚其实就已经应张勇等人邀请 xff0c 以幕后顾问的角色进行考察和指导阿里云的工作 经过几个月的磨合和协商
  • random.seed()的用法

    random random 可以用来生成一个随机数 xff0c 如果在生成随机数之前 xff0c 先调用random seed x xff0c x可以是一个随机整数 xff0c 这时候在调用random random xff0c 则种子x和
  • PRGC: Potential Relation and Global Correspondence Based Joint Relational Triple Extraction

    标题 xff1a PRGC xff1a 基于潜在关系和全局对应的联合关系三元组抽取 摘要 联合抽取实体和关系的局限性 xff1a 关系预测的冗余性 xff0c 基于span抽取泛化能力差和效率低 本文从新角度将此任务分解为三个子任务 xff
  • 查看显存使用情况:nvidia-smi

    在装有nvidia驱动的机器终端输入nvidia smi xff0c 可以查看显卡的状况 xff0c 其输出界面如下 xff1a NVIDIA 系统管理接口 xff08 nvidia smi xff09 是一个命令行实用程序 xff0c 基
  • Docker更换Docker Root Dir目录

    原因 xff1a 我在加载自己的镜像时 xff0c 发现root空间不足 xff0c 无法加载 xff0c 所以需要更改Docker Root Dir目录 xff0c 才能放下我的镜像文件 具体方法 一 查看默认目录 执行docker in
  • PHP关于时间的整理

    year 61 date 34 Y 34 month 61 date 34 m 34 day 61 date 34 d 34 dayBegin 61 mktime 0 0 0 month day year 当天开始时间戳 dayEnd 61
  • 制作.sens数据集跑通bundlefusion

    1 主要参考这篇博客实现 https blog csdn net Wuzebiao2016 article details 94426905 2 首先就是将自己采集的RGBD图像的保存格式向Bundlefusion需要的格式对齐 xff0c
  • python之moviepy库的安装与使用

    目的 xff1a 因为需要保存一个大大的 mp4视频 xff0c 以防过程中设备出现异常导致整个长长的视频无法正常保存 xff0c 所以采用分段保存视频的方式 xff0c 每500帧保存一段 xff0c 然后再将视频合到一起 xff0e 最
  • 使用iai_kinect2标定kinectV2相机

    实验背景 xff1a 因为需要制作bundlefusion需要的数据集 xff0c 所以需要使用kinectV2相机获取rgbd图像 xff0c 年前的时候在我的笔记本上安装了libfreenect2库和iai kinect2 xff0c
  • python中将四元数转换为旋转矩阵

    在制作bundlefusion时 想测试TUM数据集 并且将groundtruth写入到数据集中 TUM中给定的groundtruth中的旋转是使用四元数表示的 而bundlefusion中需要SE3的形式 所以我需要首先将四元数转换为旋转
  • 做了8年游戏开发的程序员对未来的忧虑

    编者按 xff1a 这位做了8年游戏开发的程序员的忧虑或许不是个例 xff0c 也可能是我们许多人正在经历或者将要经历的一个人生迷茫期 鉴于此 xff0c 希望他的忧虑和对未来的思考也能对你在现在或者将来的选择上有所帮助 我 22 岁毕业
  • BundleFusion那些事儿

    背景 xff1a 前面几篇博客中写了很多关于BundleFusion的东西 xff0c 主要包括bundlefusion的论文阅读笔记 xff0c sens数据集的生成等 xff0c 经过最近几天的工作 xff0c 我对bundlefusi