ROS订阅相机图像消息,并将图像保存为视频帧 |
您所在的位置:网站首页 › 订阅图片 › ROS订阅相机图像消息,并将图像保存为视频帧 |
需求
需要编写一个Python程序,订阅电脑外接的深度相机发出的视频消息,录制视频并逐帧保存为图片到本地,用于采集制作数据集的图片信息 运行环境Ubuntu18.04 + ROS Melodic + Python2.7 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图像之间进行转换的工具类。 3. 定义了一个名为`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文件,并在控制台输出保存的帧数。 4. 在`if __name__ == '__main__':`语句块中: - 初始化了ROS节点,节点名为`video_recorder_node`,设置为匿名节点。 - 创建了`VideoRecorder`类的实例`recorder`。 - 在一个无限循环中,等待用户输入命令。如果输入为`start`,则调用`start_recording`方法开始录制;如果输入为`stop`,则调用`stop_recording`方法停止录制。 - 通过捕获`rospy.ROSInterruptException`异常来保证程序在收到终止信号时能够正常退出。 总之,这段代码通过ROS接收相机图像消息,并根据用户输入的命令开始或停止录制图像帧,然后将录制的帧保存为JPEG文件。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |