Как преобразовать видео или последовательность изображений в пакетный файл?

Я новичок в РОС. Мне нужно преобразовать уже существующий видеофайл или большое количество изображений, которые можно объединить в видеопоток, в файл .bag в ROS. Я нашел этот код в Интернете: http://answers.ros.org/question/11537/creating-a-bag-file-out-of-a-image-sequence/, но написано, что это для калибровки камеры, так что не уверен если это соответствует моей цели.

Может ли кто-нибудь, хорошо разбирающийся в ROS, подтвердить, что я могу использовать код по ссылке, предоставленной для моих целей, или, если у кого-то действительно есть код, который я ищу, не могли бы вы опубликовать его здесь?


person ksivakumar    schedule 15.07.2015    source источник


Ответы (1)


Следующий код преобразует видеофайл в пакетный файл, вдохновленный кодом в предоставленной ссылке.

Маленькое напоминание:

  1. этот код зависит от cv2 (opencv python)

  2. Отметка времени сообщения ROS вычисляется по индексу кадра и количеству кадров в секунду. fps будет установлено на 24, если opencv не сможет прочитать его из видео.

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")
person jasper jia    schedule 29.06.2016
comment
В коде есть 2 недостатка: временные метки не обрабатываются должным образом (начиная с 0) и изображения не сжимаются, поэтому пакетный файл будет довольно большим. - person lahjaton_j; 05.06.2017
comment
0 на самом деле довольно хорош, так как вы можете добавить постоянные метки времени, используя bag_add_time_offset.py впоследствии. Сжатие может быть сделано $ rosbag compress <bag_file>. - person Tik0; 02.06.2018