iDP3复现代码数据预处理全流程(二)——vis_dataset.py

news2024/12/26 2:02:19

vis_dataset.py 主要作用在于点云数据的可视化,并可以做一些简单的预处理

关键参数基本都在 vis_dataset.sh 中定义了,需要改动的仅以下两点:

1. 点云图像保存位置,因为 dataset_path 被设置为了绝对路径,因此需要相应修改:

save_dir = f"{dataset_path}/{episode_idx}"  # 设置当前集的保存目录

2. 点云视频保存位置,对应修改:

        if vis_cloud:
            # 将图像序列转换为视频
            os.system(f"ffmpeg -r 10 -i {save_dir}/%d.png -vcodec mpeg4 -y visualizations/{dataset_path}/{episode_idx}.mp4")

运行生成:

更详细解释如下:

目录

1 库函数调用

2 创建 ArgumentParser 对象,解析命令行参数

3 打开指定路径 Zarr 数据集并获取数据

4 分割数据、处理并保存

5 回放图像和点云数据

6 将点云图像存为视频


1 库函数调用

import zarr  # 导入 zarr 库,用于处理 zarr 格式的数据
import cv2  # 导入 OpenCV 库,用于图像处理
from termcolor import cprint  # 从 termcolor 库导入 cprint 函数,用于彩色打印输出
import time  # 导入 time 库,用于时间相关操作
from tqdm import tqdm  # 导入 tqdm 库,用于显示进度条
import visualizer  # 导入自定义的 visualizer 模块,用于点云可视化
import os  # 导入 os 库,用于操作系统相关功能
import argparse  # 导入 argparse 库,用于解析命令行参数
import numpy as np  # 导入 numpy 库,用于数值计算

除了 visualizer 为自定义库函数,其余均为标准库

2 创建 ArgumentParser 对象,解析命令行参数

# 创建 ArgumentParser 对象,用于解析命令行参数
parser = argparse.ArgumentParser()
parser.add_argument("--dataset_path", type=str, default="data/box_zarr")  # 添加 dataset_path 参数,默认值为 "data/box_zarr"
parser.add_argument("--use_img", type=int, default=0)  # 添加 use_img 参数,默认值为 0(不使用图像数据)
parser.add_argument("--vis_cloud", type=int, default=0)  # 添加 vis_cloud 参数,默认值为 0(不可视化点云数据)
parser.add_argument("--use_pc_color", type=int, default=0)  # 添加 use_pc_color 参数,默认值为 0(不使用点云颜色)
parser.add_argument("--downsample", type=int, default=0)  # 添加 downsample 参数,默认值为 0(不下采样)

# 解析命令行参数
args = parser.parse_args()
use_img = args.use_img 
dataset_path = args.dataset_path
vis_cloud = args.vis_cloud
use_pc_color = args.use_pc_color
downsample = args.downsample

命令行参数均在 vis_dataset.sh 中定义,若未定义,则会使用默认参数

3 打开指定路径 Zarr 数据集并获取数据

# 使用 zarr 打开指定路径的数据集
with zarr.open(dataset_path) as zf:
    print(zf.tree())  # 打印数据集的树状结构

    # 获取数据
    if use_img:
        all_img = zf['data/img']  # 获取图像数据
    all_point_cloud = zf['data/point_cloud']  # 获取点云数据
    all_episode_ends = zf['meta/episode_ends']  # 获取集结束标记

打开 dataset_path 位置数据集,并获取对应数据

4 分割数据、处理并保存

    # 根据 episode_ends 划分每一集的数据
    for episode_idx, episode_end in enumerate(all_episode_ends):
        if episode_idx == 0:
            if use_img:
                img_episode = all_img[:episode_end]  # 获取第一集的图像数据
            point_cloud_episode = all_point_cloud[:episode_end]  # 获取第一集的点云数据
        else:
            if use_img:
                img_episode = all_img[all_episode_ends[episode_idx-1]:episode_end]  # 获取当前集的图像数据
            point_cloud_episode = all_point_cloud[all_episode_ends[episode_idx-1]:episode_end]  # 获取当前集的点云数据

        save_dir = f"visualizations/{dataset_path}/{episode_idx}"  # 设置当前集的保存目录
        if vis_cloud:
            os.makedirs(save_dir, exist_ok=True)  # 创建保存目录(如果需要可视化点云)
        cprint(f"replay episode {episode_idx}", "green")  # 打印当前集的重放信息,使用绿色字体

回放图像和点云数据

        # 回放每一帧的数据
        for i in range(point_cloud_episode.shape[0]):
            pc = point_cloud_episode[i]  # 获取当前帧的点云数据

            # 如果需要下采样
            if downsample:
                num_points = 4096  # 设置下采样点数
                idx = np.random.choice(pc.shape[0], num_points, replace=False)  # 随机选择点
                pc = pc[idx]  # 获取下采样后的点云数据

            if use_img:
                img = img_episode[i]  # 获取当前帧的图像数据
                img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)  # 将图像从 BGR 转换为 RGB
                cv2.imshow('img', img)  # 显示图像
                cv2.waitKey(1)  # 等待 1 毫秒
                time.sleep(0.05)  # 暂停 0.05 秒

            if vis_cloud:
                if not use_pc_color:
                    pc = pc[:, :3]  # 如果不使用点云颜色,只保留前三个维度(XYZ)
                visualizer.visualize_pointcloud(pc, img_path=f"{save_dir}/{i}.png")  # 可视化点云并保存图像
                print(f"vis cloud saved to {save_dir}/{i}.png")  # 打印保存路径

            print(f"frame {i}/{point_cloud_episode.shape[0]}")  # 打印当前帧的处理进度

6 将点云图像存为视频

        if vis_cloud:
            # 将图像序列转换为视频
            os.system(f"ffmpeg -r 10 -i {save_dir}/%d.png -vcodec mpeg4 -y {dataset_path}/{episode_idx}.mp4")

使用 ffmpeg 命令将保存在{save_dir}目录下的一系列PNG图片(按序号命名)转换为帧率为10帧每秒的MPEG-4格式视频

并保存到 {dataset_path}/{episode_idx}.mp4,如果输出文件已存在,则会直接覆盖

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

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

相关文章

重温设计模式--1、组合模式

文章目录 1 、组合模式(Composite Pattern)概述2. 组合模式的结构3. C 代码示例4. C示例代码25 .应用场景 1 、组合模式(Composite Pattern)概述 定义:组合模式是一种结构型设计模式,它允许你将对象组合成…

精通Redis

目录 1.NoSQL 非关系型数据库 2.Redis 3.Redis的java客户端 4.Jedis 4.1Jedis快速入门 4.2Jedis连接池及使用 5.SpringDataRedis和RedisTemplate 6.SpringDataRedis快速入门 7.RedisSerializer 1.NoSQL 非关系型数据库 基础篇-02.初始Redis-认识NoSQL_哔哩哔哩_bilib…

【2024】Merry Christmas!一起用Rust绘制一颗圣诞树吧

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 博客内容主要围绕: 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 一起用Rust绘制一颗圣诞树吧一、 Rust Cargo.toml配置文件二…

查询 MySQL 默认的存储引擎(SELECT @@default_storage_engine;)

要查询 MySQL 默认的存储引擎,可以使用以下 SQL 查询语句: SELECT default_storage_engine;解释: SELECT: 表示你要执行一个查询。default_storage_engine: 这是一个 MySQL 系统变量,它存储着当前 MySQL 服务器的默认存储引擎。…

两道数组有关的OJ练习题

系列文章目录 🎈 🎈 我的CSDN主页:OTWOL的主页,欢迎!!!👋🏼👋🏼 🎉🎉我的C语言初阶合集:C语言初阶合集,希望能…

clickhouse-题库

1、clickhouse介绍以及架构 clickhouse一个分布式列式存储数据库,主要用于在线分析查询 2、列式存储和行式存储有什么区别? 行式存储: 1)、数据是按行存储的 2)、没有建立索引的查询消耗很大的IO 3)、建…

近实时”(NRT)搜索、倒排索引

近实时(Near Real-Time, NRT)搜索 近实时(NRT)搜索是 Elasticsearch 的核心特性之一,指的是数据在被写入到系统后,可以几乎立即被搜索和查询到。虽然它不像传统数据库那样完全实时,但它的延迟通…

springboot477基于vue技术的农业设备租赁系统(论文+源码)_kaic

摘 要 使用旧方法对农业设备租赁系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在农业设备租赁系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的农…

vue2 升级为 vite 打包

VUE2 中使用 Webpack 打包、开发,每次打包时间太久,尤其是在开发的过程中,本文记录一下 VUE2 升级Vite 步骤。 安装 Vue2 Vite 依赖 dev 依赖 vitejs/plugin-vue2": "^2.3.3 vitejs/plugin-vue2-jsx": "^1.1.1 vite&…

【HarmonyOS 5.0】第十二篇-ArkUI公共属性(一)

一、公共样式类属性 ArkUI框架提供的基础组件直接或者间接的继承自 CommonMethod , CommonMethod 中定义的属性样式属于公共样式。下面就来学习这些样式 1.1.尺寸设置 宽高设置 设置组件的宽高,缺省时使用组件自身内容的宽高,比如充满父布…

数据库系统原理:数据库安全性与权限控制

2.1vue技术 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。 [5] 与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项…

SQL语句整理五-StarRocks

文章目录 查看版本号:SPLIT:insert 和 update 结合 select:报错:1064 - StarRocks planner use long time 3000 ms in memo phase:字段增删改: 查看版本号: select current_version(); current…

Uniapp 手机基座调试App 打包成Apk文件,并上传到应用商店

1.Uniapp手机基座调试App。 1.1 以下是我另一篇文章 讲解 uniapp连接手机基座调试App、 Hbuildx使用SUB运行到手机基座测试_hbuilder基座-CSDN博客 2.打包本地的uniapp项目为apk文件。 打包的方式有很多种,我们可以选择本地打包和远程云端打包两种方式。 我们在打包…

UEFI 多任务

一般而言,UEFI 的主要作用是检测和初始化设备,加载操作系统的引导程序,然后将控制权交给操作系统,整个过程不需要大量的运算,在单个 CPU 核上运行单线程程序已经可以满足需求,因此,EDK2 没有提供…

人工智能与物联网:从智慧家居到智能城市的未来蓝图

引言:未来已来,智能化的世界 想象一下,一个早晨,智能闹钟根据你的睡眠状态自动调整叫醒时间,咖啡机早已备好热腾腾的咖啡,窗帘缓缓拉开,迎接清晨的阳光。这不是科幻小说中的场景,而是…

【从零开始入门unity游戏开发之——unity篇01】unity6基础入门开篇——游戏引擎是什么、主流的游戏引擎、为什么选择Unity

文章目录 前言**游戏引擎是什么?****游戏引擎对于我们的意义**1、**降低游戏开发的门槛**2、**提升游戏开发效率** **以前做游戏****现在做游戏****主流的游戏引擎有哪些?**Unity 相比其他游戏引擎的优势?**为什么选择Unity?**Uni…

Xcode 16 编译弹窗问题、编译通过无法,编译通过打包等问题汇总

问题1:打包的过程中不断提示 :codesign 想要访问你的钥匙串中的密钥“develop 或者distribution 证书” 解决:打开钥匙串,点击证书---显示简介---信任----改为始终信任 (记住 :不能只修改钥匙的显示简介的…

RabbitMQ中的Topic模式

在现代分布式系统中,消息队列(Message Queue)是实现异步通信、解耦系统组件的重要工具。RabbitMQ 是一个广泛使用的开源消息代理,支持多种消息传递模式,其中 Topic 模式 是一种灵活且强大的模式,允许生产者…

OpenEuler 22.03 安装 flink-1.17.2 集群

零:规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器,用于搭建 flink 集群。这里使用flink1.17.2 的原因,是便于后续与springboot的整合 服务器名IP地址作用其他应用flink01192.168.159.133主jdk11、flink-1.17.2flink02192.168.…

国标GB28181公网直播EasyGBS与国标GB28181协议融合,助力应急救援指挥无线视频监控系统建设

随着信息技术的飞速发展,视频监控领域正经历从传统安防向智能化、网络化安防的深刻转变。在这一转变过程中,国标GB28181协议以其强大的功能和广泛的应用场景,成为了公共安全视频监控联网系统的核心标准。 应急救援指挥系统要求能够迅速响应各…