如何将视频或图像序列转换为包文件?
How do I convert a video or a sequence of images to a bag file?
我是 ROS 新手。我需要将一个预先存在的视频文件,或者 大量 可以连接成视频流的图像,转换为 ROS 中的 .bag
文件。我在网上找到了这段代码:http://answers.ros.org/question/11537/creating-a-bag-file-out-of-a-image-sequence/,但是它说是用于相机校准,所以不确定它是否符合我的目的。
熟悉 ROS 的人能否确认我可以使用为我的目的提供的 link 中的代码,或者如果有人确实有我正在寻找的代码,你能不能 post 是这里吗?
以下代码将视频文件转换为 bag 文件,灵感来自 link 提供的代码。
小提醒:
这段代码依赖于cv2 (opencv python)
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/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")
我是 ROS 新手。我需要将一个预先存在的视频文件,或者 大量 可以连接成视频流的图像,转换为 ROS 中的 .bag
文件。我在网上找到了这段代码:http://answers.ros.org/question/11537/creating-a-bag-file-out-of-a-image-sequence/,但是它说是用于相机校准,所以不确定它是否符合我的目的。
熟悉 ROS 的人能否确认我可以使用为我的目的提供的 link 中的代码,或者如果有人确实有我正在寻找的代码,你能不能 post 是这里吗?
以下代码将视频文件转换为 bag 文件,灵感来自 link 提供的代码。
小提醒:
这段代码依赖于cv2 (opencv python)
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/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")