ROS订阅相机图像消息,并将图像保存为视频帧

需求

需要编写一个Python程序,订阅电脑外接的深度相机发出的视频消息,录制视频并逐帧保存为图片到本地,用于采集制作数据集的图片信息

运行环境

Ubuntu18.04 + ROS Melodic + Python2.7

Python程序

python 复制代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge

class VideoRecorder:
    def __init__(self):
        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber('/camera/color/image_raw', Image, self.image_callback)
        self.frames = []
        self.recording = False

    def image_callback(self, msg):
        try:
            cv_image = self.bridge.imgmsg_to_cv2(msg, "bgr8")
            if self.recording:
                self.frames.append(cv_image)
        except Exception as e:
            print(e)

    def start_recording(self):
        self.frames = []
        self.recording = True

    def stop_recording(self):
        self.recording = False
        if self.frames:
            self.save_frames()

    def save_frames(self):
        for i, frame in enumerate(self.frames):
            filename = 'frame_{:04d}.jpg'.format(i)
            cv2.imwrite(filename, frame)
        print('Saved {} frames.'.format(len(self.frames)))

if __name__ == '__main__':
    rospy.init_node('video_recorder_node', anonymous=True)
    recorder = VideoRecorder()

    try:
        while not rospy.is_shutdown():
            cmd = raw_input("Enter 'start' to begin recording or 'stop' to stop recording: ")
            if cmd == 'start':
                recorder.start_recording()
            elif cmd == 'stop':
                recorder.stop_recording()
    except rospy.ROSInterruptException:
        pass

程序解释

这段代码是一个用于ROS(Robot Operating System)环境下的Python程序,用于订阅相机图像消息并将图像保存为视频帧。

  1. 首先,代码声明了使用Python解释器,并设置了文件的编码格式为utf-8。

  2. 导入了所需的库和模块:

  • `rospy`:ROS的Python客户端库,用于创建ROS节点、发布和订阅消息等。

  • `cv2`:OpenCV库,用于图像处理和计算机视觉任务。

  • `Image`:来自`sensor_msgs.msg`模块的消息类型,用于传输图像数据。

  • `CvBridge`:用于在ROS消息和OpenCV图像之间进行转换的工具类。

  1. 定义了一个名为`VideoRecorder`的类,其中包含以下方法:
  • `init(self)`:类的初始化方法,在其中进行一些必要的设置。创建了一个`CvBridge`实例,用于ROS图像和OpenCV图像的转换;订阅了名为`/camera/color/image_raw`的相机图像消息,并将回调函数设置为`image_callback`;初始化了用于存储帧的列表`frames`,以及一个表示是否正在录制的标志`recording`。

  • `image_callback(self, msg)`:图像消息的回调函数。将ROS图像消息转换为OpenCV格式,如果正在录制,则将帧添加到`frames`列表中。

  • `start_recording(self)`:开始录制方法。清空`frames`列表,并将`recording`标志设置为True。

  • `stop_recording(self)`:停止录制方法。将`recording`标志设置为False,并调用`save_frames`方法保存已录制的帧。

  • `save_frames(self)`:保存帧方法。遍历`frames`列表,将每帧图像保存为JPEG文件,并在控制台输出保存的帧数。

  1. 在`if name == 'main':`语句块中:
  • 初始化了ROS节点,节点名为`video_recorder_node`,设置为匿名节点。

  • 创建了`VideoRecorder`类的实例`recorder`。

  • 在一个无限循环中,等待用户输入命令。如果输入为`start`,则调用`start_recording`方法开始录制;如果输入为`stop`,则调用`stop_recording`方法停止录制。

  • 通过捕获`rospy.ROSInterruptException`异常来保证程序在收到终止信号时能够正常退出。

总之,这段代码通过ROS接收相机图像消息,并根据用户输入的命令开始或停止录制图像帧,然后将录制的帧保存为JPEG文件。

相关推荐
小柯南敲键盘2 小时前
跨马翻译:AI批量图片翻译工具,跨境电商视频字幕翻译与智能抠图一体搞定
人工智能·python·音视频
智塑未来4 小时前
2026年音频博客制作工具体验分享:三款不同方向的选择
音视频
TST-魚爷7 小时前
实测体验|易视讯会议音视频一体机智能发言跟踪功能
音视频
Android系统攻城狮8 小时前
Linux Gstreamer深度解析之gst_audio_format_build_integer调用流程与实战(十二)
linux·运维·服务器·音视频·车载音视频·gstreamer进阶
可乐鸡翅yeah_8 小时前
MPEG‑TS 分片 PTS/DTS 时间戳异常排错,HLS 音画不同步定位实战
运维·测试用例·音视频·媒体·m3u8
老余说AI9 小时前
从开源换脸工具到商业级 AI 换脸平台:SoundView 视频换脸的产业定位与边界
人工智能·音视频·视频换脸
智简数文9 小时前
锂电池检测用工业相机哪家好?极片/隔膜/电芯参数选型对照
数码相机
Likeadust9 小时前
多部门协同调度效率低?一套视频直播/点播/视频会议/集群语音对讲EasyDSS搞定企业可视化音视频调度
音视频·媒体·easydss
差不多的周周9 小时前
《MotionLLM:从人体运动和视频理解人类行为》论文核心部分详解
人工智能·深度学习·机器学习·计算机视觉·语言模型·音视频
欧特克_Glodon11 小时前
OpenCV计算机视觉开发入门与实践<三十七>:OpenCV中的机器学习
c++·opencv·机器学习·计算机视觉