背景:前面几篇博客中写了很多关于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 shutildef 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 = 0for 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 += 1depth_id = 0for 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 = 0for 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 += 1print(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上运行了。

BundleFusion那些事儿相关推荐

  1. webassembly类型_WebAssembly 那些事儿

    WebAssembly 那些事儿 什么是 WebAssembly? WebAssembly 是除 JavaScript 以外,另一种可以在网页中运行的编程语言,并且相比之下在某些功能和性能问题上更具优 ...

  2. 计算机网络技术社团纳新海报,精品社团纳新 | 加入计算机协会和我一起做些有意义的事儿吧~...

    原标题:精品社团纳新 | 加入计算机协会和我一起做些有意义的事儿吧~ 我们是谁? 计算机协会 社团 简介 社团名称:计算机协会 创办时间:2012年 组成部门:技术部,宣传部,秘书部,外联部,策划部. ...

  3. Linux那些事儿 之 戏说USB(33)字符串描述符

    关于字符串描述符,前面的前面已经简单描述过了,地位仅次于设备/配置/接口/端点四大描述符,那四大设备必须得支持,而字符串描述符对设备来说则是可选的. 这并不是就说字符串描述符不重要,对咱们来说,字符串 ...

  4. Linux那些事儿 之 戏说USB(28)设备的生命线(十一)

    现在已经使用GET_DESCRIPTOR请求取到了包含一个配置里所有相关描述符内容的一堆数据,这些数据是raw的,即原始的,所有数据不管是配置描述符.接口描述符还是端点描述符都彼此的挤在一起,所以得想 ...

  5. Linux那些事儿 之 戏说USB(27)设备的生命线(十)

    跟着设备的生命线走到现在,我算是明白了,什么东西的发展都是越往后越高级越复杂.再给张小表,看看现在和上次那张表出现的时候有什么变化. state        USB_STATE_ADDRESS sp ...

  6. Linux那些事儿 之 戏说USB(25)设备的生命线(八)

    回到struct usb_hcd,继续努力的往下看. 7行,又见kref,usb主机控制器的引用计数.struct usb_hcd也有自己专用的引用计数函数,看drivers/usb/core/hcd ...

  7. Linux那些事儿 之 戏说USB(22)设备的生命线(五)

    下面接着看那三个基本点. 第一个基本点,usb_alloc_urb函数,创建urb的专用函数,为一个urb申请内存并做初始化,在drviers/usb/core/urb.c里定义. struct ur ...

  8. Linux那些事儿 之 戏说USB(15)设备

    struct usb_device结构冗长而又杂乱 include/linux/usb.h struct usb_device {int devnum;char devpath[16];u32 rou ...

  9. css中关于居中的那点事儿

    css中关于居中的那点事儿 关于居中,无论是水平居中,还是垂直居中都有很多方式,下面我来介绍一些常用的. 第一部分:水平居中 1.实现行内元素的居中.方法:在行内元素外面的块元素的样式中添加:text ...

最新文章

  1. Docker中的Java内存消耗优化以及我们如何使用Spring Boot
  2. [YTU]_2535 (Problem I: C++复数运算符重载(+与))
  3. python进阶(小白也能看懂)——Map、Filter、Reduce
  4. python树莓派系统_树莓派系统 Raspbian Buster 发布
  5. JavaScript --- 解析Cookie
  6. 苹果电脑上使用linux环境变量,mac系统下修改环境变量
  7. java因子的计算方法是_JAVA分解质因子
  8. 实现点击页面其他地方,隐藏div(vue)
  9. Ajax开发框架(上)[整理]
  10. OpenGL——颜色混合 glBlendFunc函数
  11. Asp.Net异步加载
  12. 黑苹果系统引导工具正确安装步骤
  13. 仿百度文库解决方案(三)- 利用JODConverter把文档转换成pdf格式
  14. 2021-03-19Windows取消禁止驱动签名的方法
  15. python多线程抢红包代码_python实现的抢红包程序代码
  16. 回声状态网络(ESN)对MNIST手写数字集识别
  17. 突破KEIL软件编译时 C51中断号最大只能为31限制的补丁,使中断号可以达到256
  18. 轻松玩转Python:打开文件夹,搜索视频文件,实现简单视频播放器
  19. 【Linux】alias及设置
  20. 装机大神:教你看明白cpu后边数字及字母的意思。

热门文章

  1. linux设置history历史记录
  2. 【转】如何实现一个文件系统
  3. stack overflow at line
  4. Vue/Angular中父窗口新开的子窗口关闭的时候刷新父窗口
  5. springboot快速集成swagger
  6. 执行caffe的draw_net.py出现“GraphViz's executable dot not found”的解决方法
  7. thinkphp5.0学习(九):TP5.0视图和模板
  8. 继 承(面向对象特征之一)
  9. 十九. Python基础(19)--异常
  10. Java进程占用CPU资源过多分析