提取Kinect录制的rosbag中的RGBD数据

利用kinect录制好rosbag后,没法通过ros自带的工具或kalibr提取出bag中的rgb和深度图(图像格式不对),因此自己按照网上的一些方法写了一个脚本,功能包括提取rosbag中的rgb和深度图像,以及相应的时间戳文件(后续如果要跑rgbd的slam,直接用TUM的associate.py对齐rgb和深度图的时间戳即可)。
源码如下:

# 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
import argparse
import os

from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
    
class ImageCreator():
    def __init__(self, bagfile, rgbpath, depthpath, rgbstamp, depthstamp):
        self.bridge = CvBridge()
        with rosbag.Bag(bagfile, 'r') as 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.imshow("color", cv_image)
                        cv2.waitKey(1);
                        cv2.imwrite(rgbpath + 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_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(depthpath + 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)
    parser = argparse.ArgumentParser(description="Grab the rgb and depth images from a ros bag")
    # parser.add_argument("--verbose", "-v", action='store_true', help='verbose_mode')
    help = "The bag file"
    parser.add_argument('bag', help=help)
    help="The output folder"
    parser.add_argument('output_folder', help=help)
    args = parser.parse_args()

    bagfile = args.bag
    rgb_path = args.output_folder + '/rgb/'
    depth_path = args.output_folder + '/depth/'

    rgb_timestamp_txt =  args.output_folder + "/rgb.txt"
    depth_timestamp_txt = args.output_folder + "/depth.txt"

    if not os.path.exists(rgb_path):
        os.makedirs(rgb_path)
    if not os.path.exists(depth_path):
        os.makedirs(depth_path)
    
    try:
        image_creator = ImageCreator(bagfile, rgb_path, depth_path, rgb_timestamp_txt, depth_timestamp_txt)
    except rospy.ROSInterruptException:
        pass

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值