yolov8跟踪模式部署Ros系统上,跟踪鼠标选择的目标,实时发布目标的坐标信息(python实现)

这篇具有很好参考价值的文章主要介绍了yolov8跟踪模式部署Ros系统上,跟踪鼠标选择的目标,实时发布目标的坐标信息(python实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

具体实现:

鼠标不点击目标,不发送任何信息,图像显示的是yolov8检测目标的所有结果

鼠标点击后,跟踪鼠标选择的目标并实时循环发布目标的坐标信息,图像显示的是目标的坐标框

若选择的目标丢失在摄像头内,暂停发送坐标信息,且图像显示的是yolov8检测目标的所有结果,等待鼠标下次点击,选择目标

实现思路:

用opencv调用摄像头

加载yolov8 track模式

Yolov8的results的plot()方法,绘制结果图片

给绘制的结果图片添加窗名

opencv鼠标响应函数绑定操作的窗口

编写鼠标响应的回调函数

编写选择目标框的一个算法

使用opencv在图像上画矩形框的函数 rectangle函数 使用方法见:python-opencv第五期:rectangle函数详解

发送选择目标的坐标信息,并只显示跟踪的目标的目标框

视频演示:

yolov8目标跟踪,坐标发送


代码附下,含详细注释,供大家参考学习。创作不易,如有错误,欢迎大家指正,敬请谅解。文章来源地址https://www.toymoban.com/news/detail-860272.html

#!/usr/bin/env python
import cv2
from ultralytics import YOLO
import numpy as np
import rospy
from communication_yolo.msg import  yolomsg
 
 
def onMouse(event, x, y, flags,param):      #鼠标回调函数,每点击鼠标响应一次,所做出的动作即:选择出目标框并发送目标框的坐标信息
    global start_x, start_y,n,is_mouse_clicked,boxes_id
    start_x, start_y = -1, -1           #每次执行鼠标响应函数前,将坐标归零
    if event == cv2.EVENT_LBUTTONDOWN:         #鼠标左键下降沿触发
        start_x, start_y = x, y
        n = chooseobj(point, start_x, start_y)           #调用选择目标框函数,传入所有目标框坐标二维列表point、鼠标点击时的坐标start_x、start_y
        boxes_id = results[0].boxes[n].id   #获取点击鼠标时,目标的id
        is_mouse_clicked=True      #记录鼠标点击的标志,为if条件判断作准备
        
 
 
def chooseobj(p,start_x,start_y):           #选择目标框的函数,取目标框中心点与鼠标响应时坐标最短距离的目标框的编号
    point_center = list()           #创建列表,存储计算得来的所有目标框的中心点(为一个二维的列表)
    i = 0
    while i < len(p): 
        point_center.append([int((p[i][2] - p[i][0]) / 2 + p[i][0]), int((p[i][3] - p[i][1]) / 2 + p[i][1])])  #求各个boxes的中心点坐标,并依次赋值于列表
        i=i+1
    distance = list()       #创建列表,存放各个目标框中心点距离与鼠标响应时坐标的距离
    m = 0
    while m < len(p):
        pixe1 = np.array([start_x, start_y]) #鼠标响应时坐标
        pixe2 = np.array([point_center[m][0], point_center[m][1]]) #各个目标框中心点坐标
        distance.append(cv2.norm(pixe1, pixe2)) #计算各个目标框中心点与鼠标响应时坐标的距离(即两个像素点的距离)
        m=m+1
    minimum = min(distance)  #找各个目标框距离列表中的最小值
    boxes_index = distance.index(minimum)  #通过列表索引,将最小值对应的列表下表返回
    return boxes_index
 
rospy.init_node("yolo_ros_pub")        #初始化Ros节点
 
pub = rospy.Publisher("yolomsg",yolomsg,queue_size=10)         #创建发布对象,指定发布方的话题和消息类型
 
# Load the YOLOv8 model
model = YOLO("/home/zzb/yolov8_ws/src/communication_yolo/yolov8_main/yolov8n.pt")    #加载yolo的模型权重
# Open the video file
cap = cv2.VideoCapture(0)
# Loop through the video frames
 
#初始化参数
is_mouse_clicked=False
n = 0
boxes_id=0
 
while cap.isOpened():
    # Read a frame from the video
    success, frame = cap.read()
 
    if success:
        # Run YOLOv8 inference on the frame
        results = model.track(source=frame,persist=True)
        # 将Tensor类型的xy坐标数据转为一个二维列表,外层列表长度为识别目标boxes的个数,内层为xyxy四个目标坐标信息
        point = results[0].boxes.xyxy.tolist()

        #确保results是否有目标,且由于point 是实时刷新的,防止出现之前点击选择的n很大,而导致下面实时索引results[0].boxes[n].id时n超出范围的bug,即:使n与results的n实时绑定
        #且鼠标选择了目标且确保发送目标框坐标信息,是自己之前点击的id,就发送信息
        if  n<len(point) and is_mouse_clicked and results[0].boxes[n].id == boxes_id:
            msg = yolomsg()             #创建自定义消息的对象
            msg.xmin= int(point[n][0])   #赋值选择出的目标框的四个坐标信息
            msg.ymin = int(point[n][1])
            msg.xmax =int(point[n][2])
            msg.ymax = int(point[n][3])
            pub.publish(msg) #发送消息
            annotated_copy = frame.copy()
            x_min, y_min, x_max, y_max = map(int, point[n])  # Extract coordinates
            annotated_results = cv2.rectangle(annotated_copy, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2) #opencv画矩形框的函数,根据选择的目标的坐标画矩形框
            cv2.imshow("YOLOv8 Inference", annotated_results)
        else :
            # Visualize the yolov8 results on the frame
            annotated_frame = results[0].plot()  #Yolov8的results的plot()方法,绘制结果图片
            # Display the annotated frame
            cv2.imshow("YOLOv8 Inference", annotated_frame)
            is_mouse_clicked = False    #results无目标就将鼠标点击置0等待下次点击

        cv2.setMouseCallback("YOLOv8 Inference", onMouse)      #while循环监听opencv鼠标响应函数
 
        # Break the loop if 'q' is pressed
        if cv2.waitKey(1) & 0xFF == ord("q"):
            break
    else:
        # Break the loop if the end of the video is reached
        break
 
# Release the video capture object and close the display window
cap.release()
cv2.destroyAllWindows()

到了这里,关于yolov8跟踪模式部署Ros系统上,跟踪鼠标选择的目标,实时发布目标的坐标信息(python实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • YOLO8实战:yolov8实现行人跟踪计数

    本篇文章首先介绍YOLOV8实现人流量跟踪计数的原理,文末附代码 yolo8人流量统计 引言:行人跟踪统计是智能监控系统中的重要功能,可以广泛应用于人流控制、安全监控等领域。传统的行人跟踪算法往往受到光照、遮挡等因素的干扰,难以实现准确跟踪。随着深度学习技术的

    2024年02月06日
    浏览(54)
  • 使用 YOLOv8 和 DeepSORT 进行对象检测和跟踪

    文末附源代码的免费下载链接 在本教程中,您将学习如何使用 YOLOv8 检测对象以及如何使用 DeepSORT 跟踪视频中的这些对象。 目录 安装 Python 包 项目结构 使用 YOLOv8 和 OpenCV 进行实时目标检测 使用 DeepSORT 和 OpenCV 进行实时对象跟踪/

    2024年02月12日
    浏览(37)
  • 模型实战(14)之YOLOv8+Deepsort 实现车辆跟踪+计数 详解

    本文通过最新的检测模型YOLOv8算法+deepsort实现车辆跟踪与计数功能 源码+工程详解以点此直接下载可用 https://download.csdn.net/download/yohnyang/88026100 其效果如下: YOLOv8 + deepsort 智能车辆跟踪与计数系统 新建虚拟环境

    2024年02月13日
    浏览(40)
  • MAC M2芯片执行yolov8 + deepsort 实现目标跟踪

    步骤过程尝试: 执行mot17 数据集 到coco格式 执行mps发现显存不够用 选择autodl 上的服务器进行训练 安装conda install git 然后重新进行 pycocotools.进行 step 2 安装docker 环境 添加官方秘钥 安装docker环境失败 也是可以运行的 不影响bytetrack训练 这个是使用best权重计算得到的 下面是使

    2024年02月10日
    浏览(38)
  • 多目标跟踪MOT:Deepocsort+YOLOv8+OSnet实战(代码讲解)

    1. 到上面的github网站下载跟踪代码,该代码使用YOLOv8作为检测网络,不过YOLOv8的文件需要去下面的链接下载,然后替换掉跟踪代码中YOLOv8的空文件。 GitHub - ultralytics/ultralytics at 15b3b0365ab2f12993a58985f3cb7f2137409a0c NEW - YOLOv8 🚀 in PyTorch ONNX CoreML TFLite - GitHub - ultralytics/ultralytics at 1

    2024年02月04日
    浏览(36)
  • 基于YOLOv8与DeepSORT实现多目标跟踪——算法与源码解析

    \\\"目标跟踪 (Object Tracking)\\\"是机器视觉领域中的一个重要研究领域。根据跟踪的目标数量,可以将其分为两大类:单目标跟踪 (Single Object Tracking,简称 SOT) 和多目标跟踪 (Multi Object Tracking,简称 MOT)。 多目标跟踪往往面临一些挑战,例如需要同时跟踪多个目标、目标可能频繁遮挡

    2024年02月05日
    浏览(45)
  • YoloV8 +可视化界面+GUI+交互式界面目标检测与跟踪

    本项目旨在基于 YoloV8 目标检测算法开发一个直观的可视化界面,使用户能够轻松上传图像或视频,并对其进行目标检测。 通过图形用户界面,用户可以方便地调整检测参数、查看检测结果,并将结果保存或导出。同时,该界面还将提供实时目标检测功能,让用户能够在视频

    2024年02月20日
    浏览(39)
  • yolov8/yolov5-车辆测距+前车碰撞预警(追尾预警)+车辆检测识别+车辆跟踪测速(算法-毕业设计)

    本项目效果展示视频: https://www.bilibili.com/video/BV14d4y177vE/?spm_id_from=333.999.0.0vd_source=8c532ded7c7c9041f04e35940d11fdae 1、本项目通过yolov8/yolov7/yolov5和deepsort实现了一个自动驾驶领域的追尾前车碰撞预警系统,可为一些同学的课设、大作业等提供参考。分别实现了自行车、汽车、摩托车

    2024年02月06日
    浏览(50)
  • yolov8/yolov7/yolov5-车辆测距+前车碰撞预警(追尾预警)+车辆检测识别+车辆跟踪测速(算法-毕业设计)

    本项目效果展示视频: https://www.bilibili.com/video/BV14d4y177vE/?spm_id_from=333.999.0.0vd_source=8c532ded7c7c9041f04e35940d11fdae 1、本项目通过yolov8/yolov7/yolov5和deepsort实现了一个自动驾驶领域的追尾前车碰撞预警系统,可为一些同学的课设、大作业等提供参考。分别实现了自行车、汽车、摩托车

    2024年02月04日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包