吉祥猴378 2024-07-12 13:58 采纳率: 95.8%
浏览 7
已结题

哪位大姥,知道yolov5如何检测目标并绘制框

scr = mss.
monitor = 
    "left": 0,
    "top": 0,
    "width": 2560,
    "height": 1440 }
cv2.namedWindow('SF_TRT', cv2.WND_PROP_VISIBLE) 
while True
    img = scr.grab(monitor)  
    img = np.array(img
    img = cv2.cvtColor(img,cv2.COLOR_BGRA2BGR)  

    cv2.imshow("SF_TRT", img)  # 显示图像并等待按键关闭窗口或退出循环
    k = cv2.waitKey(1)
    if k % 256 == 27
  • 写回答

5条回答 默认 最新

  • GISer Liu 2024-07-12 14:06
    关注

    该回答引用自GPT-3.5, 由博主 GISer Liu 编写:

    好的,我们来详细分析并解决这个问题。用户想要使用YOLOv5进行目标检测并在屏幕上绘制检测框。以下是详细的解决方案:

    问题分析

    1. 目标检测:使用YOLOv5进行目标检测。
    2. 屏幕截图:使用mss库获取屏幕截图。
    3. 图像处理:将截图转换为OpenCV可处理的格式。
    4. 显示图像:使用OpenCV显示图像并等待按键关闭窗口或退出循环。

    解决方案

    1. 安装必要的库:确保安装了YOLOv5、OpenCV和mss库。
    2. 加载YOLOv5模型:加载预训练的YOLOv5模型。
    3. 获取屏幕截图:使用mss库获取屏幕截图。
    4. 图像处理:将截图转换为OpenCV可处理的格式。
    5. 目标检测:使用YOLOv5模型进行目标检测。
    6. 绘制检测框:在图像上绘制检测框。
    7. 显示图像:使用OpenCV显示图像并等待按键关闭窗口或退出循环。

    代码实现

    以下是完整的代码实现:

    import cv2
    import numpy as np
    from mss import mss
    import torch
    from models.experimental import attempt_load
    from utils.general import non_max_suppression
    
    # 加载YOLOv5模型
    model = attempt_load('yolov5s.pt', map_location='cpu')  # 请确保模型文件路径正确
    
    # 初始化mss
    scr = mss()
    monitor = {
        "left": 0,
        "top": 0,
        "width": 2560,
        "height": 1440
    }
    
    # 创建OpenCV窗口
    cv2.namedWindow('SF_TRT', cv2.WND_PROP_VISIBLE)
    
    while True:
        # 获取屏幕截图
        img = scr.grab(monitor)
        img = np.array(img)
        img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
    
        # 将图像转换为模型输入格式
        img = cv2.resize(img, (640, 640))  # 调整图像大小以适应模型输入
        img = img[:, :, ::-1].transpose(2, 0, 1)  # BGR to RGB, HWC to CHW
        img = np.ascontiguousarray(img)
        img = torch.from_numpy(img).float() / 255.0  # 归一化
        img = img.unsqueeze(0)  # 增加批次维度
    
        # 进行目标检测
        pred = model(img)[0]
        pred = non_max_suppression(pred, 0.4, 0.5)  # 非极大值抑制
    
        # 绘制检测框
        for det in pred:
            if det is not None and len(det):
                det[:, :4] = det[:, :4].clamp(0, 640)  # 确保边界框在图像范围内
                for *xyxy, conf, cls in reversed(det):
                    label = f'{model.names[int(cls)]} {conf:.2f}'
                    cv2.rectangle(img, (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3])), (0, 255, 0), 2)
                    cv2.putText(img, label, (int(xyxy[0]), int(xyxy[1]) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    
        # 显示图像
        cv2.imshow("SF_TRT", img.squeeze().permute(1, 2, 0).numpy()[:, :, ::-1])
        k = cv2.waitKey(1)
        if k % 256 == 27:  # 按下ESC键退出循环
            break
    
    # 释放资源
    cv2.destroyAllWindows()
    

    代码解释

    1. 加载YOLOv5模型:使用attempt_load函数加载预训练的YOLOv5模型。
    2. 初始化mss:使用mss库获取屏幕截图。
    3. 创建OpenCV窗口:使用cv2.namedWindow创建一个窗口。
    4. 获取屏幕截图:使用scr.grab(monitor)获取屏幕截图,并将其转换为OpenCV可处理的格式。
    5. 图像处理:调整图像大小以适应模型输入,并进行必要的格式转换。
    6. 目标检测:使用YOLOv5模型进行目标检测,并进行非极大值抑制。
    7. 绘制检测框:在图像上绘制检测框,并显示标签和置信度。
    8. 显示图像:使用OpenCV显示图像并等待按键关闭窗口或退出循环。

    注意事项

    1. 模型文件路径:请确保yolov5s.pt文件路径正确。
    2. 图像大小:调整图像大小以适应模型输入。
    3. 非极大值抑制:使用non_max_suppression函数进行非极大值抑制。

    希望这个解决方案能帮助您解决问题。如果有任何疑问,请随时提问。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 7月20日
  • 已采纳回答 7月12日
  • 创建了问题 7月12日

悬赏问题

  • ¥20 有偿:在ubuntu上安装arduino以及其常用库文件。
  • ¥15 请问用arcgis处理一些数据和图形,通常里面有一个根据点划泰森多边形的命令,直接划的弊端是只能执行一个完整的边界,但是我们有时候会用到需要在有很多边界内利用点来执行划泰森多边形的命令
  • ¥30 在wave2foam中执行setWaveField时遇到了如下的浮点异常问题,请问该如何解决呢?
  • ¥20 看图片)删除这个自动化录屏脚本就一直报错找不到脚本文件,如何解决?(相关搜索:bat文件)
  • ¥750 关于一道数论方面的问题,求解答!(关键词-数学方法)
  • ¥200 csgo2的viewmatrix值是否还有别的获取方式
  • ¥15 Stable Diffusion,用Ebsynth utility在视频选帧图重绘,第一步报错,蒙版和帧图没法生成,怎么处理啊
  • ¥15 请把下列每一行代码完整地读懂并注释出来
  • ¥15 pycharm运行main文件,显示没有conda环境
  • ¥15 寻找公式识别开发,自动识别整页文档、图像公式的软件