mp4视频转rosbag文件(图片压缩格式)

2023-12-26 16:20

本文主要是介绍mp4视频转rosbag文件(图片压缩格式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

目的

环境

主要步骤

创建py文件

执行py文件

效果

 程序解释

后续调整


目的

将相机录制的mp4格式文件,转为ROS系统能使用的bag格式文件。

环境

安装有ROS和python2

主要步骤

创建py文件

新建python文件Video2ROSbag.py

#this is ok
# -*- coding: utf-8 -*-
import rosbag
import cv2
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
import rospydef video_to_bag(video_path, output_bag):bag = rosbag.Bag(output_bag, 'w')cap = cv2.VideoCapture(video_path)cb = CvBridge()prop_fps = cap.get(cv2.CAP_PROP_FPS)if prop_fps != prop_fps or prop_fps <= 1e-2:print "Warning: can't get FPS. Assuming 24."prop_fps = 24prop_fps = 24ret = Trueframe_id = 0while ret:ret, frame = cap.read()if not ret:breakstamp = rospy.rostime.Time.from_sec(float(frame_id) / prop_fps)frame_id += 1compressed_image = CompressedImage()compressed_image.header.stamp = stampcompressed_image.header.frame_id = "camera"compressed_image.format = "jpeg"  # 使用JPEG压缩格式# 将图像转换为压缩格式_, compressed_data = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 90])compressed_image.data = compressed_data.tostring()bag.write("/camera/image_raw/compressed", compressed_image, stamp)bag.close()cap.release()# 输入视频文件和输出bag文件名
video_path = 'video2bag.mp4'
output_bag = 'video2bag.bag'# 调用函数进行转换
video_to_bag(video_path, output_bag)

以下参数根据需要,相应的修改:

视频路径video_path

保存的bag文件路径output_bag

图像的话题名,文中是“/camera/image_raw/compressed”

图像的坐标系compressed_image.header.frame_id,文中是"camera"

 图像的压缩格式compressed_image.format,文中是"jpeg"

视频帧率prop_fps,文中固定为24,根据需要调整程序。

执行py文件

python Video2ROSbag.py

效果

生成bag文件。

查看bag信息:

 $rosbag info video2bag.bag      
path:        video2bag.bag
version:     2.0
duration:    6.3s
start:       Jan 01 1970 00:00:00.00 (0.00)
end:         Jan 01 1970 00:00:06.33 (6.33)
size:        8.1 MB
messages:    153
compression: none [11/11 chunks]
types:       sensor_msgs/CompressedImage [8f7a12909da2c9d3332d540a0977563f]
topics:      /camera/image_raw/compressed   153 msgs    : sensor_msgs/CompressedImage

 程序解释

        _, compressed_data = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 90])

代码片段`_, compressed_data = cv2.imencode('.jpg', frame, [int(cv2.IMWRITE_JPEG_QUALITY), 90])` 是用于将图像数据进行压缩编码的一行代码。

具体来说,这个函数调用了OpenCV库的 `imencode()` 方法,用于将给定的图像数据进行压缩编码,生成相应的压缩数据。

其中参数含义如下:

- `.jpg`:表示压缩编码格式为JPEG格式。
- `frame`:要进行压缩编码的原始图像数据。
- `[int(cv2.IMWRITE_JPEG_QUALITY), 90]`:设置JPEG压缩的质量参数,即设置压缩后图像的质量为90。

函数返回值包括两个变量:

- `_`:表示忽略的变量,通常用于忽略不需要使用的返回值。
- `compressed_data`:经过压缩编码后的图像数据,以字节流的形式表示。

通过这个函数调用,你可以将原始图像数据进行JPEG压缩编码,并将压缩后的数据存储在 `compressed_data` 变量中,以便后续使用或传输。

        compressed_image.data = compressed_data.tostring()

代码片段`compressed_image.data = compressed_data.tostring()` 用于将压缩后的图像数据存储到 ROS 消息对象 `compressed_image` 中。

具体来说,假设 `compressed_data` 是一个包含了经过压缩编码后的图像数据的对象(通常是一个字节流或字符串),通过 `tostring()` 方法将其转换为字符串形式,并将结果赋值给 `compressed_image.data`。这样,`compressed_image.data` 就包含了压缩后的图像数据,可以被传输或保存到 ROS 消息中。

这一步通常是在将图像数据转换为 ROS 消息格式时进行的操作,以便在 ROS 系统中进行传输、存储和处理。

        bag.write("/camera/image_raw/compressed", compressed_image, stamp)

这段代码片段,`bag.write("/camera/image_raw/compressed", compressed_image, stamp)` 是用于将 `compressed_image` 数据写入 ROS bag 文件的一行代码。

这个函数调用了 ROS 的 `write()` 方法,用于将指定的消息数据写入到 ROS bag 文件中。其中参数含义如下:

- `"/camera/image_raw/compressed"`:表示写入数据的话题(topic)名称,即将 `compressed_image` 数据写入到名为 "/camera/image_raw/compressed" 的话题中。
- `compressed_image`:要写入的消息数据,即 `CompressedImage` 类型的对象。
- `stamp`:时间戳,用于标记消息数据的时间。

通过这个函数调用,你可以将 `compressed_image` 数据以及对应的时间戳写入 ROS bag 文件,以备后续的数据回放或分析使用。

后续调整

图中明显发现时间戳还是1970/1/1开始需要调整。

后续参考mp4视频转rosbag文件(图片压缩、画面旋转、时间戳调整)-CSDN博客

这篇关于mp4视频转rosbag文件(图片压缩格式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/540107

相关文章

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

Java实现数据库图片上传与存储功能

《Java实现数据库图片上传与存储功能》在现代的Web开发中,上传图片并将其存储在数据库中是常见的需求之一,本文将介绍如何通过Java实现图片上传,存储到数据库的完整过程,希望对大家有所帮助... 目录1. 项目结构2. 数据库表设计3. 实现图片上传功能3.1 文件上传控制器3.2 图片上传服务4. 实现

Java实现数据库图片上传功能详解

《Java实现数据库图片上传功能详解》这篇文章主要为大家详细介绍了如何使用Java实现数据库图片上传功能,包含从数据库拿图片传递前端渲染,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、前言2、数据库搭建&nbsChina编程p; 3、后端实现将图片存储进数据库4、后端实现从数据库取出图片给前端5、前端拿到

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl

Python批量调整Word文档中的字体、段落间距及格式

《Python批量调整Word文档中的字体、段落间距及格式》这篇文章主要为大家详细介绍了如何使用Python的docx库来批量处理Word文档,包括设置首行缩进、字体、字号、行间距、段落对齐方式等,需... 目录关键代码一级标题设置  正文设置完整代码运行结果最近关于批处理格式的问题我查了很多资料,但是都没