ROS将视频文件转换为包

问题描述 投票:4回答:1

我是ROS的新手,需要转换一个预先存在的视频文件或大量可以连接成一个视频流的图像,该视频流保存在ROS上的.bag文件中。我在网上找到了这个代码:http://answers.ros.org/question/11537/creating-a-bag-file-out-of-a-image-sequence/,但它说是用于相机校准,所以不确定它是否符合我的目的。

对ROS有深入了解的人可以确认我可以使用为我的目的提供的链接中的代码,或者如果有人真正拥有我正在寻找的代码,你能在这里发布吗?

谢谢!

image video-streaming ros bag
1个回答
5
投票

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

小提醒:

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

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

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'

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.cv.CV_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_imgmsg(frame, encoding='bgr8')
        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")
© www.soinside.com 2019 - 2024. All rights reserved.