#!/usr/bin/env python
# -*- coding: utf-8 -*-
import cv2
import rospy
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from tqdm import tqdm
from time import sleep
import signal, sys
# 此函数保证 ctrl+c 可以正常退出程序
def quit(signum, frame):
print('\n===== STOP!!! =====\n')
sys.exit()
# 创建 ROS 发布者
rospy.init_node('video_publisher')
pub = rospy.Publisher('/video_file/image', Image, queue_size=10)
bridge = CvBridge()
# 将视频循环播放发布
while(1):
# 保证 ctrl+c 可以正常退出程序
signal.signal(signal.SIGINT, quit)
signal.signal(signal.SIGTERM, quit)
# 打开视频文件
cap = cv2.VideoCapture('x.mp4')
# 获取总帧数并创建进度条
frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
pbar = tqdm(total=frame_count, ncols=80)
# 按帧读取视频并发布为 ROS 话题
while not rospy.is_shutdown() and cap.isOpened():
ret, frame = cap.read()
if ret:
# 将帧转换为 ROS 图像消息并发布
image_msg = bridge.cv2_to_imgmsg(frame, encoding="bgr8")
pub.publish(image_msg)
pbar.update(1)
sleep(0.03) # 通过 sleep 不同时长来粗略控制视频的帧率
else:
break
# 释放视频捕获对象
cap.release()
python 将视频文件发布为 rostopic
最新推荐文章于 2024-07-12 16:16:27 发布