python3使用cv_bridge
提示:在上一篇博客中将yolov5封装,并可使用其他程序调用,这一篇介绍ros程序调用yolov5。 环境是ubuntu18.04
思路:将相机usb_cam发布的图像信息通过cv_bridge转化为cv传入yolov5中进行检测。
由于该程序在python3中运行,所以需要编译cv_bridge使其可以被python3调用。
直接根据参考的网址一步步进行即可。
参考:https://www.guyuehome.com/34115
布置好后进行下列步骤
ros下使用yolov5
创建一个新的功能包,包含下列库:
geometry_msgs
rospy
sensor_msgs
std_msgs
将github中yolov5下的文件复制到scripts文件夹中,并更具上一篇博客修改,同时创建一个接受相机信息的程序,命名为video_detect.py:
#! /home/hc/anaconda3/envs/yolov5/bin/python3
# -*- coding: utf-8 -*-
import cv2
import mydetect
import rospy
import numpy as np
from sensor_msgs.msg import Image
import sys
sys.path.remove('/opt/ros/melodic/lib/python2.7/dist-packages')
import ctypes
libgcc_s = ctypes.CDLL('libgcc_s.so.1')
from cv_bridge import CvBridge
class yolo_detect():
def __init__(self):
self.a = mydetect.detectapi(weights = '/home/hc/my_ws/src/my_yolo/scripts/best.pt')
im_sub = rospy.Subscriber('/usb_cam/image_raw', Image, self.detectimg)
self.img_pub = rospy.Publisher('/yolov5/detect' , Image, queue_size = 1)
self.bridge = CvBridge() #OpenCV与ROS的消息转换类
def detectimg(self, img):
frame = self.bridge.imgmsg_to_cv2(img, desired_encoding='bgr8')
result, names = self.a.detect([frame])
image_detect = result[0][0]
print(result[0][1])
self.img_pub.publish(self.bridge.cv2_to_imgmsg(image_detect, "bgr8"))
if __name__ == '__main__':
rospy.init_node("yolo_detect")
rospy.loginfo("yolo_detect node started")
yolo_detect()
rospy.spin()
# while True:
# rec, img = cap.read()
# result, names = a.detect([img])
# img = result[0][0]
# '''
# for cls,(x1,y1,x2,y2),conf in result[0][1]: #第一张图片的处理结果标签。
# print(cls,x1,y1,x2,y2,conf)
# cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0))
# cv2.putText(img,names[cls],(x1,y1-20),cv2.FONT_HERSHEY_DUPLEX,1.5,(255,0,0))
# '''
# cv2.imshow("vedio", img)
# if cv2.waitKey(1)==ord('q'):
# break
写的有点潦草,哈哈。
其中的import mydetect是我根据上一篇博客中detect.py文件修改成的。
想要修改权重直接改其中的weights路径即可。
先运行usb_cam中的launch文件,再运行:
rosrun 你的功能包名字 video_detect.py
之后打开rqt中的image_view再添加/yolov5/detect这个话题
就可以直接中看到yolo检测后的图片