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

相关文章

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

C#中图片如何自适应pictureBox大小

《C#中图片如何自适应pictureBox大小》文章描述了如何在C#中实现图片自适应pictureBox大小,并展示修改前后的效果,修改步骤包括两步,作者分享了个人经验,希望对大家有所帮助... 目录C#图片自适应pictureBox大小编程修改步骤总结C#图片自适应pictureBox大小上图中“z轴

使用Python将长图片分割为若干张小图片

《使用Python将长图片分割为若干张小图片》这篇文章主要为大家详细介绍了如何使用Python将长图片分割为若干张小图片,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. python需求的任务2. Python代码的实现3. 代码修改的位置4. 运行结果1. Python需求

Python视频处理库VidGear使用小结

《Python视频处理库VidGear使用小结》VidGear是一个高性能的Python视频处理库,本文主要介绍了Python视频处理库VidGear使用小结,文中通过示例代码介绍的非常详细,对大家的... 目录一、VidGear的安装二、VidGear的主要功能三、VidGear的使用示例四、VidGea

使用 Python 和 LabelMe 实现图片验证码的自动标注功能

《使用Python和LabelMe实现图片验证码的自动标注功能》文章介绍了如何使用Python和LabelMe自动标注图片验证码,主要步骤包括图像预处理、OCR识别和生成标注文件,通过结合Pa... 目录使用 python 和 LabelMe 实现图片验证码的自动标注环境准备必备工具安装依赖实现自动标注核心

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

Qt QWidget实现图片旋转动画

《QtQWidget实现图片旋转动画》这篇文章主要为大家详细介绍了如何使用了Qt和QWidget实现图片旋转动画效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、效果展示二、源码分享本例程通过QGraphicsView实现svg格式图片旋转。.hpjavascript

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台,是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力,在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系统EasyCVR平台内置了强大的视频解码、转码、压缩等技术,能够处理多种视频流格式,并以多种格式(RTMP、RTSP、HTTP-FLV、WebS