ROS系列(三):rosbag 中提取图像数据与帧率对齐

news2024/10/6 2:25:33

首先说明一下,rosbag的解压方式取决于之前的压缩方式,数据的格式和工具使用的方法有很大关系。当前数据类型是 sensor_msgs/CompressedImage 。 处理数据的topic为 /cam_front_center/csi_cam/image_raw/compressed  当前提取是前置摄像头图像数据。

可以通过安装,查看rosbag信息。
sudo apt install python3-rosbag

使用命令:

rosbag info 2022-08-10-17-00-54.bag

提取脚本:

# -*- encoding: utf-8 -*-
"""
@File    :   ros2Image.py   
@Contact :   kequan
@License :   (C)Copyright 2023
 
@Modify Time      @Author       @Version    @Desciption
------------      -------       --------    -----------
10/23/23 5:05 PM   kequan          1.0         None
"""
# -*- encoding: utf-8 -*-


import roslib;
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
import numpy as np

MJPEG_VIDEO = 1
RAWIMAGE_VIDEO = 2
VIDEO_CONVERTER_TO_USE = "ffmpeg"  # or you may want to use "avconv"

path = ''  # 存放图片的位置


class ImageCreator():

    def __init__(self):
        self.bridge = CvBridge()
        self.currentTopic = "/cam_front_center/csi_cam/image_raw/compressed"
        self.opt_display_images = True
        self.opt_verbose = False
        self.p_avconv = {}
        self.filename = '/2022-08-10-17-00-54.bag'
        self.cv_image = []

        with rosbag.Bag(self.filename, 'r') as bag:  # 要读取的bag文件;
            for topic, msg, t in bag.read_messages(connection_filter=self.filter_image_msgs, topics=self.currentTopic):
                try:
                    cv_image = self.bridge.compressed_imgmsg_to_cv2(msg, "bgr8")
                except CvBridgeError as e:
                    print(e)
                # timestr = "%.6f" % msg.header.stamp.to_sec()
                timestr = str(msg.header.stamp)
                # %.6f表示小数点后带有6位,可根据精确度需要修改;
                image_name = timestr + ".jpg"  # 图像命名:时间戳.jpg
                cv2.imwrite(path + image_name, cv_image)  # 保存;
            bag.close()

    # filter messages using type or only the opic we whant from the 'topic' argument
    def filter_image_msgs(self, topic, datatype, md5sum, msg_def, header):
        if (datatype == "sensor_msgs/CompressedImage"):
            if (self.currentTopic != "" and self.currentTopic == topic) or self.currentTopic == "":
                print("############# COMPRESSED IMAGE  ######################")
                print(topic, ' with datatype:', str(datatype))
                print()
                return True

        if (datatype == "theora_image_transport/Packet"):
            if (self.currentTopic != "" and self.currentTopic == topic) or self.currentTopic == "":
                print(topic, ' with datatype:', str(datatype))
                print('!!! theora is not supported, sorry !!!')
                return False

        if (datatype == "sensor_msgs/Image"):
            if (self.currentTopic != "" and self.currentTopic == topic) or self.currentTopic == "":
                print("############# UNCOMPRESSED IMAGE ######################")
                print(topic, ' with datatype:', str(datatype))
                print()
                return True

        return False


if __name__ == '__main__':

    # rospy.init_node(PKG)

    try:
        image_creator = ImageCreator()
    except rospy.ROSInterruptException:
        pass

提取数据如图:

通常做视觉slam需要对提取图像数据 和 其它数据左对齐。

当前是进行车道线场景重建,和车道线时间戳进行对齐。对齐脚本如下,

# -*- encoding: utf-8 -*-
"""
@File    :   alignmentPictureAndTime.py
@Contact :   kequan
@License :   (C)Copyright 2023
 
@Modify Time      @Author       @Version    @Desciption
------------      -------       --------    -----------
10/23/23 5:20 PM   kequan          1.0         None
"""

import  cv2
import os
import json
import shutil

"""
获取到某个文件中所有bag文件,并返回其路径列表
"""
def find_bag_files(folder):
    bag_files = []
    for root, dirs, files in os.walk(folder):
        for file in files:
            if file.endswith(".jpg"):
                # 获取.bag文件路径
                bag_file_path = os.path.join(root, file)
                # 将.bag文件路径添加到列表
                bag_files.append(bag_file_path)
    return bag_files

def renamePictureNameAndAlign(timeJson,pictureFile,targer_path):
    #做一个文件路经和时间戳映射
    mapping = []
    pic_origin_path = os.path.dirname(os.path.abspath(pictureFile[0]))
    for pic in pictureFile:
        key = pic.split('/')[-1].split('.jpg')[0]
        mapping.append(int(key))


    # picIndex = 1
    #开始查找和复制
    for frame in timeJson:
        timeStamp = int(frame['timestamp'])
        picIndex = 1
        while picIndex < len(mapping):
            #在图像中找到对应帧
            if timeStamp >= mapping[picIndex-1] and timeStamp <= mapping[picIndex]:
                #当时间戳在 前一帧 和 后一帧 之间时,使用前一帧图像数据作为目标图像,命名,并保存
                #原图像Path
                sourcePath = pic_origin_path +f'/{mapping[picIndex-1]}.jpg'
                #目标Path
                targetPath = targer_path + f'{timeStamp}.jpg'
                shutil.copy(sourcePath,targetPath)

                break
            picIndex = picIndex + 1
            # if timeStamp < mapping[picIndex-1]:
            #     picIndex = picIndex + 1


        #在pictureFile 找最近的一张图像,重命名,并将数据复制到新文件夹


if __name__ == "__main__":
    origin_path = ""
    targer_path = ''

    #获取到车道线时间戳
    gnssJson = '/gnssJson.json'
    with open(gnssJson,'r+') as fp :
        gnssTime = json.load(fp)

    #获取到所有图片
    picture = find_bag_files(origin_path)
    renamePictureNameAndAlign(gnssTime['gnssFrames'],picture,targer_path)

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

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

相关文章

【23真题】碰瓷重邮成电,题目Mini版本!

今天分享的是23年广西师范大学846的信号与系统部分试题及解析。 本套试难度分析&#xff1a;23年平均分只有90-100分&#xff0c;最高分129分&#xff01;但是我觉得不难。22年广西师范846我也发布过&#xff0c;如有需要戳这里自取&#xff01;该院校考察的是模拟电路和信号系…

工具及方法 - 查电子器件和查说明书

查询电子器件 手里一个产品&#xff0c;上面使用的蓝牙模组是BL871E2&#xff0c;然后想查一下相关信息&#xff0c;发现了下面的查询网站&#xff1a; 查询某颗物料的网站&#xff1a; device.report Search for Electronic Components Price & Stock | DigiPart 查询UG…

【实战】Kubernetes安装持久化工具NFS-StorageClass

文章目录 前言技术积累存储类&#xff08;storage class&#xff09;什么是NFS什么是PV\PVC为什么要用NFS-StorageClass 安装NFS-StorageClass保证N8S集群正常投用安装NFS工具与客户端NFS安装常见错误安装NFS-StorageClass存储器 前言 前面的博文我们介绍了如何用kuberadmin的…

RosettaNet PIPs 简介

RosettaNet背景知识 RosettaNet由主要计算机&#xff0c;消费电子产品&#xff0c;半导体制造商&#xff0c;电信和物流公司组成的联盟组成&#xff0c;共同创建和实施行业范围的开放式电子商务流程标准。这些标准形成了一种通用的电子商务语言&#xff0c;在全球范围内协调供…

【SpringCloud微服务项目实战-mall4cloud项目(5)】——mall4cloud-leaf

mall4cloud-leaf 基于美团leaf的生成id服务 分布式id介绍具体代码及使用项目中的生成id模式具体代码分布式id生成使用 分布式id介绍 分布式ID&#xff08;Distributed ID&#xff09;是在分布式计算环境中生成的唯一标识符或标识号。在分布式系统中&#xff0c;通常需要唯一标…

Vcenter实战利用方式总结

目录 0x01 指纹特征 0x02 查看Vcenter版本 0x03 CVE-2021-21972 0x04 CVE-2021-22005 0x05 CVE-2021-44228 0x06 获取vcenter-web控制台权限 重置密码 cookie登录 不重置获取密码&#xff08;ESXI&#xff09; 1、获取解密key 2、获取数据库账号密码 3、使用脚本解…

PHP 函数、PHP 简单后门

函数 基本结构 语法结构 function 函数名(形式参数1,形式参数2...){//函数体return 返回值 }定义并执行一个简单函数 // funtion.phpfunction test(){echo "This is function ".__FUNCTION__; }test();函数传参 // function.phpfunction add($x, $y){$sum $x …

JAVA-编程基础-11-03-java IO 字节流

Lison <dreamlison163.com>, v1.0.0, 2023.05.07 JAVA-编程基础-11-03-java IO 字节流 文章目录 JAVA-编程基础-11-03-java IO 字节流字节输出流&#xff08;OutputStream&#xff09;FileOutputStream类**FileOutputStrea 的构造方法**使用文件名创建FileOutputStream…

【RocketMQ系列十三】RocketMQ的集群核心概念之消费重试死信队列幂等消息的出现以及处理

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

基于拦截器Interceptor实现简易权限控制及行为记录功能

一、业务需求 使用拦截器(Interceptor)&#xff0c;实现Controller中方法的权限控制&#xff0c;并记录访问行为。要求仅在Controller方法上加注解&#xff0c;就可以实现权限控制。具体为&#xff1a; 1、拦截未登录用户的访问&#xff1b; 2、拦截不具有权限用户的访问&#…

ASPICE标准快速掌握「3.1. 实践示例」

实践示例 本章内容是最重要的,建议慢下来跟着博主的思路一步一步前进 1. 示例背景说明 假设我们现在是一个Tier1的车窗控制软件开发商,我们给OEM提供软件解决方案 1.1. 本过程目标 根据客户、上级部门、安全团队与质量团队等提出的要求,本项目要求SYS.1过程达到ASPICE过…

【源码】C/C++学生信息管理系统 1024程序员节日快乐

文章目录 题目介绍源码效果展示报告内容 更多源码&#xff1a; 点我跳转目录 题目介绍 1024程序员节日快乐! 使用语言&#xff1a; 此源码包含两个版本: 版本1&#xff1a;C语言 版本2&#xff1a; C 代码量&#xff1a; 650 题目&#xff1a; 学生信息管理系统&#xff0c; …

JAVA-编程基础-11-04-java IO 字符流

Lison <dreamlison163.com>, v1.0.0, 2023.05.07 JAVA-编程基础-11-04-java IO 字符流 文章目录 JAVA-编程基础-11-04-java IO 字符流字符流Reader 和 Writer字符输入流&#xff08;Reader&#xff09;**FileReader构造方法****FileReader读取字符数据** 字符输出流&am…

解决样本不均衡问题

一、样本不均衡问题 样本&#xff08;类别&#xff09;不平衡指的是分类任务中不同类别的训练样例数目差别很大的情况&#xff0c;一般地&#xff0c;样本类别比例&#xff08;多数类VS少数类&#xff09;明显大于1&#xff1a;1&#xff08;例如4&#xff1a;1&#xff09;就…

软考信息安全工程师备考

软考信息安全工程师备考 报名 公告地址 通知是否有考试和考试安排的公告 https://www.ruankao.org.cn/arrange报名地址 https://bm.ruankao.org.cn/sign/welcome刷题 51cto刷题小程序 5cto题库点击进去选择信息安全工程师 可以刷选择题和大题 还可以刷真题非常好用 …

Mysql数据库指定某数据库或某表赋予增删改查操作权限各类划分权限的方法总结实战

一、mysql创建用户只赋予指定数据库的增删改查操作权限 在日常生产运维工作中&#xff0c;我们经常需要给其他厂商或者合作伙伴提供数据库的账号&#xff0c;并且需要指定某个用户只能查询指定的数据库&#xff0c;并且赋予增删改查的指定权限。 &#xff08;1&#xff09;创…

面试算法38:每日温度

题目 输入一个数组&#xff0c;它的每个数字是某天的温度。请计算每天需要等几天才会出现更高的温度。例如&#xff0c;如果输入数组[35&#xff0c;31&#xff0c;33&#xff0c;36&#xff0c;34]&#xff0c;那么输出为[3&#xff0c;1&#xff0c;1&#xff0c;0&#xff…

软硬件架构分层总结

一、前言 软件系统很多架构图我们经常看到是这样的三段 就是这三段就可以演化出很多层 二、硬件架构分层 硬件层&#xff0c;基本是计算机硬件的体系结构&#xff0c;包括硬盘设备&#xff0c;cpu&#xff0c;内存&#xff0c;控制器&#xff0c;运算器&#xff0c;寄存器&am…

清除excel中换行符方法

1、选择要删除或替换换行符的单元格。 2、按 Ctrl H 以打开“查找和替换”对话框。 3、在“查找内容”栏中输入Ctrl J 或 Ctrl Enter 这时会出现一个闪烁的小点。如下图所示&#xff0c;然后点击全部替换即可。

【机器学习合集】参数初始化合集 ->(个人学习记录笔记)

文章目录 综述1. 全零与随机初始化2. 标准初始化(固定方差)3. Xavier初始化(方差缩放)4. He初始化5. 正交初始化6. MSRA初始化 综述 这些是不同的权重初始化方法&#xff0c;用于初始化神经网络的权重参数。它们的主要区别在于初始化权重的策略和数学原理。以下是这些初始化方法…