目录

一、实现功能

二、完整代码

三、关键参数说明

1. conf(置信度阈值)

2. iou(NMS 去重阈值)

3. 中文乱码解决方案

4. 全屏显示

四、使用说明

五、效果展示


本文基于 YOLOv11 完成无人售货柜商品实时检测,实现纯目标检测 + 中文标签显示 + 全屏展示,无多余轨迹、ID 与 ROI,代码干净、运行高效,可直接用于项目演示与部署。

一、实现功能

  • 只保留检测框 + 类别 + 置信度,无冗余绘制
  • 英文标签自动映射中文:cola/ksf/lc/qc → 可乐 / 康师傅 / 云雾绿茶 / 茉莉清茶
  • 解决 OpenCV 中文乱码问题
  • 高置信度过滤,减少误检
  • 支持 RTSP 视频流,画面全屏显示
  • q键退出程序

二、完整代码

python

运行

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont
from ultralytics import YOLO

# 加载训练好的YOLOv11模型
model = YOLO('runs/detect/runs/train/retail_yolo11_optimized7/weights/best.pt')

# 英文标签映射中文名称
label_map = {
    "cola": "可乐",
    "ksf": "康师傅",
    "lc": "云雾绿茶",
    "qc": "茉莉清茶"
}

# 视频源与分辨率
WIDTH, HEIGHT = 1920, 1080
CAMERA_SOURCE = "rtsp://192.168.1.13:554/stream1"

# 打开视频流
cap = cv2.VideoCapture(CAMERA_SOURCE)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)

if not cap.isOpened():
    print("Error: 无法打开摄像头/RTSP流")
    exit()

# 加载中文字体,解决乱码
try:
    font = ImageFont.truetype("simhei.ttf", 18)
except:
    font = ImageFont.load_default()

# 设置窗口全屏
cv2.namedWindow("Unmanned Cabinet Detection", cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty("Unmanned Cabinet Detection", 
                      cv2.WND_PROP_FULLSCREEN, 
                      cv2.WINDOW_FULLSCREEN)

# 主检测循环
while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        print("Error: 视频读取失败")
        break

    # YOLO预测:conf置信度阈值,iou为NMS去重阈值
    results = model.predict(frame, conf=0.6, iou=0.5)

    # 转为PIL格式实现中文绘制
    frame_pil = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))
    draw = ImageDraw.Draw(frame_pil)

    # 遍历检测结果
    for det in results[0].boxes:
        x1, y1, x2, y2 = map(int, det.xyxy[0].cpu().numpy())
        cls_name = model.names[int(det.cls.item())]
        conf = det.conf.item()

        # 映射中文标签
        show_name = label_map.get(cls_name, cls_name)
        label = f"{show_name} {conf:.2f}"

        # 绘制检测框
        draw.rectangle([(x1, y1), (x2, y2)], outline=(0, 255, 0), width=2)
        # 绘制中文标签
        draw.text((x1, y1 - 22), label, font=font, fill=(0, 255, 0))

    # 转回OpenCV格式显示
    annotated_frame = cv2.cvtColor(np.array(frame_pil), cv2.COLOR_RGB2BGR)
    cv2.imshow("Unmanned Cabinet Detection", annotated_frame)

    # 按q退出
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放资源
cap.release()
cv2.destroyAllWindows()

三、关键参数说明

1. conf(置信度阈值)

python

运行

conf=0.6
  • 只保留置信度 ≥ 60% 的检测结果
  • 数值越高,误检越少,漏检可能增加
  • 货柜场景建议:0.5~0.7

2. iou(NMS 去重阈值)

python

运行

iou=0.5
  • 去除同一物体的重复框
  • IoU>0.5 视为同一目标,只保留置信度最高框
  • 建议范围:0.45~0.6

3. 中文乱码解决方案

使用 PIL 替代 OpenCV 原生文字绘制,加载系统黑体字库 simhei.ttf,完美支持中文显示。

4. 全屏显示

通过以下两行实现窗口全屏,适合现场演示:

python

运行

cv2.namedWindow(..., cv2.WND_PROP_FULLSCREEN)
cv2.setWindowProperty(...)

四、使用说明

  1. 将模型路径替换为自己的best.pt
  2. RTSP 地址改为实际摄像头地址
  3. 安装依赖:

bash

运行

pip install ultralytics opencv-python pillow numpy
  1. 运行后自动全屏展示检测效果
  2. q关闭程序

五、效果展示

  • 绿色框标注商品位置
  • 左上角显示中文商品名 + 置信度
  • 无杂乱轨迹与 ID,画面简洁清爽
  • 低误检、高流畅度,适合无人柜实时识别
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐