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

目录

目的

环境

主要步骤

创建py文件

执行py文件

效果

程序解释

后续调整


目的

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

环境

安装有ROS和python2

主要步骤

创建py文件

新建python文件Video2ROSbag.py

python 复制代码
#this is ok
# -*- coding: utf-8 -*-
import rosbag
import cv2
from sensor_msgs.msg import CompressedImage
from cv_bridge import CvBridge
import rospy

def 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 = 24
    prop_fps = 24
    
    ret = True
    frame_id = 0
    while ret:
        ret, frame = cap.read()
        if not ret:
            break
        stamp = rospy.rostime.Time.from_sec(float(frame_id) / prop_fps)
        frame_id += 1
        
        compressed_image = CompressedImage()
        compressed_image.header.stamp = stamp
        compressed_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 复制代码
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

程序解释

python 复制代码
        _, 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` 变量中,以便后续使用或传输。

python 复制代码
        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 系统中进行传输、存储和处理。

python 复制代码
        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博客

相关推荐
AWS官方合作商2 分钟前
DeepSeek开源FlashMLA:颠覆大模型训练效率的新一代技术解析
人工智能·ai·开源
小宇爱24 分钟前
48、深度学习-自学之路-自己搭建深度学习框架-9、添加嵌入层为了浮现RNN的神经网络使用框架。
人工智能·深度学习
Ai多利41 分钟前
登上Nature子刊!因果机器学习起步A会!
人工智能·机器学习·因果推断
智联视频超融合平台42 分钟前
国标28181协议在智联视频超融合平台中的接入方法
音视频
CS创新实验室1 小时前
《机器学习数学基础》补充资料:欧几里得空间的推广
人工智能·机器学习·机器学习数学基础
阿正的梦工坊1 小时前
Fisher信息矩阵(Fisher Information Matrix, FIM)与自然梯度下降:机器学习中的优化利器
人工智能·机器学习·矩阵
@心都1 小时前
机器学习数学基础:32.斯皮尔曼等级相关
人工智能·机器学习·概率论
测试者家园1 小时前
AI赋能的未来城市:如何用智能化提升生活质量?
人工智能·智慧城市·公共安全·智能交通·智能环境监控·智能垃圾分类·社会治理
weixin_407237681 小时前
ubuntu20.04音频aplay调试
音视频
架构文摘JGWZ1 小时前
PyVideoTrans:一款功能全面的视频翻译配音工具!
音视频·工具