第一代代码(实验中)
Publisher部分:
输入:本地avi视频
输出:话题/camera/image_raw、视频颜色空间为BGR格式,消息类型ROS格式
Subscriber部分_1(yolo部分)
输入:/camera/image_raw,输入视频颜色空间BGR颜色空间,消息类型ROS格式。若输入视频为RGB格式则darknet_ros视频将转化为BGR格式;反之,若输入视频为BGR格式则darknet_ros视频将转化为RGB格式
输出:/darknet_ros/bounding_boxes
Subscriber部分_2(视频处理部分)
输入:/camera/image_raw,输入视频颜色空间BGR颜色空间,消息类型ROS格式。
输出:输出RGB颜色空间的视频,消息格式为OpenCv
Subscriber部分代码:
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
#1.编译器声明和2.编码格式声明
#1:为了防止用户没有将python安装在默认的/usr/bin目录,系统会先从env(系统环境变量)里查找python的安装路径,再调用对应路径下的解析器完成操作,也可以指定python3
#2:Python.X 源码文件默认使用utf-8编码,可以正常解析中文,一般而言,都会声明为utf-8编码
import rospy
from sensor_msgs.msg import Image
from std_msgs.msg import Int8
from cv_bridge import CvBridge
import cv2
from darknet_ros_msgs.msg import BoundingBoxes
def image_callback(msg):
# 将ROS图像消息转换为OpenCV图像格式
bridge = CvBridge()
cv_image = bridge.imgmsg_to_cv2(msg, "rgb8")
print("成功输出视频")
# 显示图像
cv2.imshow("Video", cv_image)
cv2.waitKey(1)
def side_flag_callback(data):
my_class = []
for box in data.bounding_boxes:
my_class.append(box.Class) #从box对象中获取Class属性的值,并将其添加到名为my_class的列表中。
if box.Class == "stop":
print("Detected a stop at position ({}, {})".format(box.xmin, box.ymin))
if box.Class == "speed10":
print("Detected a speed10 at position ({}, {})".format(box.xmin, box.ymin))
if box.Class == "speed_limit":
print("Detected a speed_limit at position ({}, {})".format(box.xmin, box.ymin))
print(my_class)
#rospy.set_param('/my_param', my_class)
def video_show():
rospy.Subscriber("/camera/image_raw", Image, image_callback,queue_size=10)
side_flag_sub = rospy.Subscriber("/darknet_ros/bounding_boxes", BoundingBoxes, side_flag_callback)
line_judgment_pub = rospy.Publisher("/line_judgment", Int8, queue_size=1)
rate = rospy.Rate(30) # 消息发布频率
while not rospy.is_shutdown():#只要ROS节点没有被要求关闭,就一直执行循环内的代码。
# 根据业务逻辑进行判断,并发布相应的消息
line_judgment = 0 # 假设判断结果为0
line_judgment_pub.publish(line_judgment)
rate.sleep()
if __name__== '__main__':
rospy.init_node("video_publisher")
video_show()