站点图标 AI技术聚合

使用ros从realsence相机中获取图像

第一部分 从相机中提取出视频并拆分成帧

文章目录

  • 第一部分 从相机中提取出视频并拆分成帧
  • 前言
  • 一、使用ros从realsence相机中获取录制的视频并播放
    • 1.开启ros内核
    • 2.打开realsense相机
    • 3.查看当前话题
    • 4.在相机界面显示RGB图像和depth图像
      • 4.1 添加Image
      • 4.2 填入RGB话题
      • 4.3 填入depth话题
    • 5.录制视频
    • 6.播放录制的视频
  • 二. 另一种显示话题的方式
  • 三. 将视频拆分成每帧,并分开存储RGB和Depth图像
  • 总结

前言

使用ros从相机中获取视频,并将视频拆分成每帧图像,将RGB图像和Depth图像分别保存在两个文件夹中。

一、使用ros从realsence相机中获取录制的视频并播放

1.开启ros内核

代码如下(示例):

roscore

演示如下:
请添加图片描述

2.打开realsense相机

代码如下(示例):

roslaunch realsense2_camera demo_pointcloud.launch

演示如下:

打开界面如下图:

3.查看当前话题

代码如下(示例):

rostopic list

演示如下:

说明:
“/camera/color/image_raw” 是RGB图像的话题;
“/camera/depth/image_rect_raw” 是depth图像的话题。

4.在相机界面显示RGB图像和depth图像

4.1 添加Image

点击左下角的“ADD”,出现中间的界面;选择“Image“;点击”OK“。

4.2 填入RGB话题

展开左边的“Image”,在“Image Topic”填入RGB图像的话题,即可在左下角成功显示出RGB图像。

4.3 填入depth话题

继续按照4.1进行添加,再按照4.2在“Image Topic”中填入depth图像的话题,即可在左下角也显示出深度图的图像。

5.录制视频

代码格式为:rosbag record +RGB图像的topic+空格+depth图像的topic -O +路径/文件名

rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -O /home/midea/video/1

演示如下:

运行此行代码即可开始录制。
按“ctrl+c”停止录制。
录制完后指定目录下会有一个“1.bag”的文件:

注意:录制视频的代码中是大写的O
补充 大写的O与小写o的区别:

  • 小写o默认以录制的时间命名文件
rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -o /home/midea/video/

可以看到会出现一个以时间为命名的bag文件:_2022-12-23-17-48-10.bag
若是在后面填上自定义的名称:

rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -o /home/midea/video/2

则效果为在原本的时间前面添上自定义的名称:2_2022-12-23-17-54-51.bag (这里后缀多了一个”.active”,是因为还在录制中,录制结束了“.active”后缀就消失了。

  • 大写O可以将文件名修改为自定义的名称
    代码:
rosbag record /camera/color/image_raw /camera/depth/image_rect_raw -O /home/midea/video/3

效果如下:

6.播放录制的视频

播放视频前先将连着相机的数据线拔掉。
然后输入下面的代码:

rosbag play /home/midea/video/1.bag

即可在相机显示界面的左下角看到录制的内容:

二. 另一种显示话题的方式

rqt_image_view

输入此代码,即可打开显示话题的界面:
也可以在此查看录制的话题。

三. 将视频拆分成每帧,并分开存储RGB和Depth图像

文件名称为:bag2tum.py
代码:

#!/usr/bin/env python
# # coding:utf-8

# Extract images from a bag file.
 
#PKG = 'beginner_tutorials'
import argparse
import roslib;   #roslib.load_manifest(PKG)
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
 
# Reading bag filename from command line or roslaunch parameter.
import os
#import sys

class ImageCreator():
    def __init__(self):
        self.bridge = CvBridge()
        with rosbag.Bag(bag_file, 'r') as bag:  #要读取的bag文件;
            for topic,msg,t in bag.read_messages():
                #print(t)
                if topic == "/camera/color/image_raw": #图像的rgb topic;
                        try:
                            cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
                        except CvBridgeError as e:
                            print (e)
                        timestr = "%.6f" %  msg.header.stamp.to_sec()
                        #%.6f表示小数点后带有6位,可根据精确度需要修改;
                        image_name = timestr+ ".png" #图像命名:时间戳.png
                        cv2.imwrite(rgb_path + image_name, cv_image)  #保存;
                        with open(rgbstamp, 'a') as rgb_time_file:
                            rgb_time_file.write(timestr+" rgb/"+image_name+"\n")
                elif topic == "/camera/depth/image_rect_raw": #图像的depth topic;
                        try:
                            cv_image = self.bridge.imgmsg_to_cv2(msg,"16UC1")
                        except CvBridgeError as e:
                            print (e)
                        timestr = "%.6f" %  msg.header.stamp.to_sec()
                        #%.6f表示小数点后带有6位,可根据精确度需要修改;
                        image_name = timestr+ ".png" #图像命名:时间戳.png
                        cv2.imwrite(depth_path + image_name, cv_image)  #保存;
                        with open(depthstamp, 'a') as depth_time_file:
                            depth_time_file.write(timestr+" depth/"+image_name+"\n")
 
if __name__ == '__main__':
 
    #rospy.init_node(PKG)
 
    try:
        bag_file=input('请输入文件路径:')
        new_dataset_path=input('请输入生成数据集路径:')
        rgb_path = new_dataset_path+'/rgb/'
        depth_path= new_dataset_path+'/depth/'
        rgbstamp= new_dataset_path+'/rgb.txt' 
        depthstamp= new_dataset_path+'/depth.txt'
        if not os.path.exists(rgb_path):
            os.makedirs(rgb_path)
        if not os.path.exists(depth_path):
            os.makedirs(depth_path)
        image_creator = ImageCreator()
    except rospy.ROSInterruptException:
        pass

需要将以下两行代码作修改,改为自己的RGB图像和Depth图像的topic路径:

if topic == "/camera/color/image_raw": #图像的rgb topic;
elif topic == "/camera/depth/image_rect_raw": #图像的depth topic;

在代码所在文件夹的终端运行此代码,运行的命令为:

python bag2tum.py

我这里报错:

没有关系,把”python”改为“python3”即可,然后提示输入文件路径,将录制好的bag文件的路径输入,回车。

填入要将生成的数据集存放的路径。

回车后即可在对应的目录下查看生成的内容:

depth图像和rgb图像分别存储在不同的文件夹中,depth.txt和rgb.txt中存储两列信息,第一列是录制的时间戳,第二列是图像的路径。

总结

至此就完成了从相机中提取RGB图像和Depth图像的步骤了。

文章出处登录后可见!

已经登录?立即刷新
退出移动版