使用ORB-SLAM2跑奥比中光ORBBEC ASTRA PRO录制的数据集时遇到可视化窗口只显示一帧,并没有连续播放的问题

文章讲述了作者在使用深度相机录制TUM数据集时遇到的问题,即RGB和Depth文件的时间戳格式不正确导致可视化不连续。文章提供了使用Python脚本重命名文件并生成关联文件的解决方案,包括`rename_Depth_better.py`和`rename_Color_better.py`,以及合并关联文件的`merge.py`脚本。
摘要由CSDN通过智能技术生成
  • 先说原因,TUM数据集中的rgb.txt和depth.txt存储了所有图像的采集时间和文件名称,而自己录制的数据集的rgb.txt 和 depth.txt时间戳文件需要自己生成,可视化窗口只显示一帧,并没有连续播放的原因就是自己生成的时间戳文件的格式不对。
    之前参考过一个博客说的是用
    系统时间戳.帧序列号 rgb/系统时间戳.帧序列号.png
    结果就遇到了这种问题。

  • 我能运行的时间戳格式

rgb.txt
1711458.353663 rgb/1711458.353663.png
1711458.353723 rgb/1711458.353723.png
1711458.353783 rgb/1711458.353783.png
1711458.353843 rgb/1711458.353843.png
1711458.353903 rgb/1711458.353903.png
1711458.353963 rgb/1711458.353963.png
1711458.354023 rgb/1711458.354023.png


depth.txt
1711458.353613 depth/1711458.353613.png
1711458.353646 depth/1711458.353646.png
1711458.353680 depth/1711458.353680.png
1711458.353713 depth/1711458.353713.png
1711458.353746 depth/1711458.353746.png
1711458.353780 depth/1711458.353780.png
1711458.353813 depth/1711458.353813.png


associations.txt
1711458.353663 rgb/1711458.353663.png 1711458.353613 depth/1711458.353613.png
1711458.353723 rgb/1711458.353723.png 1711458.353646 depth/1711458.353646.png
1711458.353783 rgb/1711458.353783.png 1711458.353680 depth/1711458.353680.png
1711458.353843 rgb/1711458.353843.png 1711458.353713 depth/1711458.353713.png
1711458.353903 rgb/1711458.353903.png 1711458.353746 depth/1711458.353746.png
1711458.353963 rgb/1711458.353963.png 1711458.353780 depth/1711458.353780.png
1711458.354023 rgb/1711458.354023.png 1711458.353813 depth/1711458.353813.png
1711458.354083 rgb/1711458.354083.png 1711458.353846 depth/1711458.353846.png

供大家参考,希望给到大家帮助。

  • 细节:
    使用深度相机录制的是TUM类型的数据集
    在这里插入图片描述
    录制出的文件格式是
    在这里插入图片描述文件夹内部文件是自动命名的,命名为

在这里插入图片描述

在这里插入图片描述
自己写了几个脚本来生成时间戳文件和时间戳关联文件

rename_Depth_better.py
使用方法:把脚本放在和Color 一个目录下
运行:控制台运行 python3 rename_Color_better.py Color/

#! /usr/bin/env python

import os
import sys

def rename_png_files(folder_path):
    # 创建一个文本文件用于保存重命名后的文件名
    output_file = open("depth.txt", "w")

    # 用于存储重命名后的文件名及其对应的原始文件名
    renamed_files = []

    # 遍历文件夹中的所有文件
    for filename in os.listdir(folder_path):
        if filename.endswith(".png"):  # 只处理png格式的文件
            # 解析文件名
            parts = filename.split("_")
            if len(parts) < 4:
                print(f"文件名格式错误:{filename}")
                continue
            timestamp = parts[3]  # 时间戳部分
            # 提取时间戳中的秒和微秒部分
            seconds = timestamp[:-6]  # 前面的部分(秒)
            microseconds = timestamp[-6:]  # 后面的部分(微秒)

            # 构造新的文件名(时间戳格式:秒.微秒)
            new_filename = f"{seconds}.{microseconds}"
            new_filename_with_path = os.path.join(folder_path, new_filename + ".png")

            # 重命名文件
            os.rename(os.path.join(folder_path, filename), new_filename_with_path)

            # 添加重命名后的文件名及其对应的原始文件名到列表中
            renamed_files.append((seconds + "." + microseconds, new_filename))

    # 对重命名后的文件名按时间戳从小到大排序
    renamed_files.sort(key=lambda x: float(x[0]))

    # 将重命名后的文件名及其对应的原始文件名写入文本文件,并按时间戳从小到大排列
    for timestamp, new_filename in renamed_files:
        output_file.write(f"{new_filename} depth/{new_filename}.png\n") #要注意!!!这里只有一个空格隔开  ORB-SLAM2规定的索引txt文本

    # 关闭文本文件
    output_file.close()

    # 将文件夹重命名为 'depth'
    os.rename(folder_path, os.path.join(os.path.dirname(folder_path), 'depth'))



if __name__ == "__main__":
    # 检查输入参数是否足够
    if len(sys.argv) != 2:
        print("Usage: python3 script_name.py folder_path")
        sys.exit(1)

    # 获取文件夹路径参数
    folder_path = os.path.abspath(sys.argv[1])

    # 调用函数进行重命名操作
    rename_png_files(folder_path)

rename_Color_better.py
使用方法:把脚本放在和Depth 一个目录下
运行:python3 rename_Depth_better.py Depth/

#! /usr/bin/env python

import os
import sys

def rename_png_files(folder_path):
    # 创建一个文本文件用于保存重命名后的文件名
    output_file = open("rgb.txt", "w")

    # 用于存储重命名后的文件名及其对应的原始文件名
    renamed_files = []

    # 遍历文件夹中的所有文件
    for filename in os.listdir(folder_path):
        if filename.endswith(".png"):  # 只处理png格式的文件
            # 解析文件名
            parts = filename.split("_")
            if len(parts) < 4:
                print(f"文件名格式错误:{filename}")
                continue
            timestamp = parts[3]  # 时间戳部分
            # 提取时间戳中的秒和微秒部分
            seconds = timestamp[:-6]  # 前面的部分(秒)
            microseconds = timestamp[-6:]  # 后面的部分(微秒)

            # 构造新的文件名(时间戳格式:秒.微秒)
            new_filename = f"{seconds}.{microseconds}"
            new_filename_with_path = os.path.join(folder_path, new_filename + ".png")

            # 重命名文件
            os.rename(os.path.join(folder_path, filename), new_filename_with_path)

            # 添加重命名后的文件名及其对应的原始文件名到列表中
            renamed_files.append((seconds + "." + microseconds, new_filename))

    # 对重命名后的文件名按时间戳从小到大排序
    renamed_files.sort(key=lambda x: float(x[0]))

    # 将重命名后的文件名及其对应的原始文件名写入文本文件,并按时间戳从小到大排列
    for timestamp, new_filename in renamed_files:
        output_file.write(f"{new_filename} rgb/{new_filename}.png\n") #要注意!!!这里只有一个空格隔开  ORB-SLAM2规定的索引txt文本

    # 关闭文本文件
    output_file.close()

    # 将文件夹重命名为 'rgb'
    os.rename(folder_path, os.path.join(os.path.dirname(folder_path), 'rgb'))



if __name__ == "__main__":
    # 检查输入参数是否足够
    if len(sys.argv) != 2:
        print("Usage: python3 script_name.py folder_path")
        sys.exit(1)

    # 获取文件夹路径参数
    folder_path = os.path.abspath(sys.argv[1])

    # 调用函数进行重命名操作
    rename_png_files(folder_path)

mergy.py 由于相机录制出的彩色图和深度图本来就是关联的,所以这只是一个简单的拼接操作
使用方法:放在同一个目录下
运行: python3 merge.py

def merge_files(rgb_file, depth_file, output_file):
    with open(rgb_file, 'r') as rgb_f, open(depth_file, 'r') as depth_f, open(output_file, 'w') as out_f:
        for line in rgb_f:
            out_f.write(line.strip() + ' ')
            depth_line = depth_f.readline().strip()
            out_f.write(depth_line + '\n')

if __name__ == "__main__":
    rgb_file = 'rgb.txt'
    depth_file = 'depth.txt'
    output_file = 'associations.txt'
    merge_files(rgb_file, depth_file, output_file)
  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值