ROS☞通过两种方法提取.bag中的图像数据

2023-05-16

以下两种环境均在Ubuntu16.04环境下测试成功。

第一种方法

ROS-从rosbag中提取图像(by launch文件)

1.新建launch文件(文件在哪无所谓,可以在catkin_ws的根目录) : bag2img.launch

<launch>
      <node pkg="rosbag" type="play" name="rosbag" args="-d 2 /home/andy/bag_foler/file_name.bag"/>
      <node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
      <remap from="image" to="camera/rgb/image_color"/>
      <param name="sec_per_frame" value="0.03"/>
      </node>
 </launch>
note:

/home/andy/bag_foler/file_name.bag 为你录制的bag文件的绝对路径,camera/rgb/image_color为你提取的topic的名字,你可以使用:

 rosbag info file_name.bag

查看你需要提取的图片的topic名字。< param name="sec_per_frame" value="0.03"/>这句话是说,以每一帧花费0.03s的时间,这个条件对你的bag文件进行图像提取,如果没有这句话,就是默认0.1s,也就是没秒10帧的速率对图像提取。经过我的测试发现,无论怎么调整这个值,都无法跟bag文件中的信息数目匹配,因此来说,这种方法存在一定的图像缺失的情况,只能无限接近袁原始图像的数目,比如我的原始数据有640帧,但经过调整sec_per_frame的值,最高的时候还是只能到639,多数情况下到637,默认值0.1的时候,只有200多张图像。
2.运行launch

 roslaunch bag2img.launch

那么已经提取成功的图像存储在你home文件夹下的.ros文件夹下,一般是隐藏的文件夹,使用crtl+h可显示出来。

优点:操作简单,使用ros即可;缺点:提取信息与原始录制的信息并不完全一致,主要体现在提取的图片数量和ros录制的时候的信息数量不一致,会少。此外,不含有时间戳;

第二种方法

ROS-从rosbag中提取图像(by python2)

通过编写Python程序按照我们想要的信息及方式来提取,在与bag文件同级目录下建立.py文件(方便操作,若不是同级目录,下面代码中要写绝对路径)


    # coding:utf-8
    #!/usr/bin/python
     
    # Extract images from a bag file.
     
    #PKG = 'beginner_tutorials'
    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
     
    rgb_path = '/home/david/workspace/bags/rgb/'   #已经建立好的存储rgb彩色图文件的目录
    depth_path= '/home/david/workspace/bags/depth/' # 已经建立好的存储深度图文件的目录
     
    class ImageCreator():
        def __init__(self):
            self.bridge = CvBridge()
            with rosbag.Bag('/home/andy/bag_folder/file_name.bag', 'r') as bag:  #要读取的bag文件;
                for topic,msg,t in bag.read_messages():
                    if topic == "camera/rgb/image_raw": #图像的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)  #保存;
                    elif topic == "camera/depth_registered/image_raw": #图像的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)  #保存;
     
    if __name__ == '__main__':
        #rospy.init_node(PKG)
        try:
            image_creator = ImageCreator()
        except rospy.ROSInterruptException:
            pass

优点:没有信息损失,完全按照你录制的数据完整提取,且具有时间戳。缺点:使用python2,不依赖ros,这个可能也不算是缺点。依赖OpenCV,我使用的OpenCV版本为3.3.1,3.x版本都可以,2.x版本没有尝试。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS☞通过两种方法提取.bag中的图像数据 的相关文章

  • ubuntu下安装vnc出错(灰屏)

    我 win10 用的 vncviewer exe xff0c 在Ubuntu上首先需要安装vnc4server apt get install vnc4server 出现灰色屏幕和 型鼠标是因为vncserver找不到指定的图形化组件 xf

随机推荐