Image 如何将视频或图像序列转换为bag文件?

Image 如何将视频或图像序列转换为bag文件?,image,video-streaming,ros,bag,Image,Video Streaming,Ros,Bag,我是新手。我需要将一个预先存在的视频文件,或者可以连接成视频流的大量图像,转换为ROS中的.bag文件。我在网上找到了这段代码:,但上面说它是用来校准相机的,所以不确定它是否符合我的目的 是否有熟悉ROS的人可以确认我可以使用为我的目的提供的链接中的代码,或者如果任何人确实拥有我正在寻找的代码,请将其发布在这里?以下代码将视频文件转换为bag文件,灵感来自于提供的链接中的代码 小提醒: 此代码依赖于cv2(opencv python) 通过帧索引和fps计算ROS消息的时间戳。如果opencv

我是新手。我需要将一个预先存在的视频文件,或者可以连接成视频流的大量图像,转换为ROS中的
.bag
文件。我在网上找到了这段代码:,但上面说它是用来校准相机的,所以不确定它是否符合我的目的


是否有熟悉ROS的人可以确认我可以使用为我的目的提供的链接中的代码,或者如果任何人确实拥有我正在寻找的代码,请将其发布在这里?

以下代码将视频文件转换为bag文件,灵感来自于提供的链接中的代码

小提醒:

  • 此代码依赖于cv2(opencv python)

  • 通过帧索引和fps计算ROS消息的时间戳。如果opencv无法从视频中读取fps,则fps将设置为24

  • 导入时间、系统、操作系统 从ros进口rosbag 导入roslib,rospy roslib.load\u清单('sensor\u msgs')) 从传感器_msgs.msg导入图像 从cv_桥导入CvBridge 进口cv2 主题='相机/图像\u原始/压缩' def CreateVideoBag(视频路径,bagname): ''使用视频文件创建行李文件'' bag=rosbag.bag(bagname,'w') cap=cv2.视频捕获(视频路径) cb=CvBridge() 道具=cap.get(cv2.cap\u道具)
    如果道具fps!=prop_fps或prop_fps代码有两个缺陷:时间戳没有正确处理(从0开始),图像没有被压缩,因此包文件将相当大。0实际上非常好,因为您可以在之后使用添加一个恒定的时间戳。压缩可以通过
    $rosbag compress
    完成。
    import time, sys, os
    from ros import rosbag
    import roslib, rospy
    roslib.load_manifest('sensor_msgs')
    from sensor_msgs.msg import Image
    
    from cv_bridge import CvBridge
    import cv2
    
    TOPIC = 'camera/image_raw/compressed'
    
    def CreateVideoBag(videopath, bagname):
        '''Creates a bag file with a video file'''
        bag = rosbag.Bag(bagname, 'w')
        cap = cv2.VideoCapture(videopath)
        cb = CvBridge()
        prop_fps = cap.get(cv2.CAP_PROP_FPS)
        if prop_fps != prop_fps or prop_fps <= 1e-2:
            print "Warning: can't get FPS. Assuming 24."
            prop_fps = 24
        ret = True
        frame_id = 0
        while(ret):
            ret, frame = cap.read()
            if not ret:
                break
            stamp = rospy.rostime.Time.from_sec(float(frame_id) / prop_fps)
            frame_id += 1
            image = cb.cv2_to_compressed_imgmsg(frame)
            image.header.stamp = stamp
            image.header.frame_id = "camera"
            bag.write(TOPIC, image, stamp)
        cap.release()
        bag.close()
    
    
    if __name__ == "__main__":
        if len( sys.argv ) == 3:
            CreateVideoBag(*sys.argv[1:])
        else:
            print( "Usage: video2bag videofilename bagfilename")