PiscCode实现用 YOLO 给现实世界加上「NPC 血条 HUD」

目标

不画检测框,只给被识别到的目标加一个"游戏风格 NPC HUD":

  • 血条(用置信度当 HP)

  • 名字 + 百分比

  • 自动避开画面边界

  • 支持实时视频 / 摄像头 / 流媒体


一、效果说明

传统目标检测长这样:

❌ 红框 + 类别 + 置信度(很工程)

我们要的效果是这样:

NPC 头顶血条 HUD

  • 没有检测框

  • 血条宽度 = 置信度

  • 颜色从绿 → 红

  • 文本在血条上方

  • 像 RPG / FPS 游戏一样

非常适合:

  • AI 游戏化演示

  • 直播互动

  • 装置艺术

  • 科技展览


二、核心思路

1️⃣ YOLO 负责「我是谁、在哪」

YOLO 输出:

  • xyxy:目标位置

  • conf:置信度

  • cls:类别 ID

2️⃣ 我们只做一件事

不画框,只画 HUD

HUD 包含三层:

  1. 血条背景

  2. 血条(HP)

  3. 文本(名字 + 百分比)


三、完整代码(可直接运行)

使用 Ultralytics YOLO

支持 YOLOv8 / YOLO11

复制代码
复制代码
import cv2
import numpy as np
from ultralytics import YOLO


class YOLOsObject:
    def __init__(
        self,
        model_path="yolo11n.pt",
        device="cuda",
    ):
        self.model = YOLO(model_path).to(device)
        self.device = device
        self.names = self.model.names

    # =====================================================
    # NPC HUD 绘制(无检测框,文字在血条上方)
    # =====================================================

    def _draw_npc_hud(self, img, box, cls_id, conf):
        x1, y1, x2, y2 = map(int, box)
        w = x2 - x1

        bar_h = 20
        text_h = 14
        gap = 2

        # ---------- HUD 位置 ----------
        bar_y2 = y1 - 2
        bar_y1 = bar_y2 - bar_h
        text_y = bar_y1 - gap

        # 防止越界:整体下移
        if text_y - text_h < 0:
            text_y = y2 + text_h + gap
            bar_y1 = text_y + gap
            bar_y2 = bar_y1 + bar_h

        # ---------- 血条背景 ----------
        cv2.rectangle(
            img,
            (x1, bar_y1),
            (x2, bar_y2),
            (35, 35, 35),
            -1
        )

        # ---------- 血条(置信度) ----------
        hp_w = int(w * conf)
        hp_color = (
            int(255 * (1 - conf)),   # R
            int(200 * conf),         # G
            60                        # B
        )

        cv2.rectangle(
            img,
            (x1, bar_y1),
            (x1 + hp_w, bar_y2),
            hp_color,
            -1
        )

        # ---------- 血条边框 ----------
        cv2.rectangle(
            img,
            (x1, bar_y1),
            (x2, bar_y2),
            (180, 180, 180),
            1
        )

        # ---------- 文本(在血条上方) ----------
        label = f"{self.names[int(cls_id)]} {int(conf * 100)}%"
        (tw, th), _ = cv2.getTextSize(
            label,
            cv2.FONT_HERSHEY_SIMPLEX,
            0.45,
            1
        )

        tx = x1
        ty = text_y

        # 文本底色(增强可读性)
        cv2.rectangle(
            img,
            (tx, ty - th - 2),
            (tx + tw + 4, ty + 2),
            (0, 0, 0),
            -1
        )

        cv2.putText(
            img,
            label,
            (tx + 2, ty),
            cv2.FONT_HERSHEY_SIMPLEX,
            0.45,
            (255, 255, 255),
            1,
            cv2.LINE_AA
        )

    # =====================================================
    # 主入口(device 必须存在)
    # =====================================================

    def do(self, frame, device):
        if frame is None:
            return None

        img = frame.copy()

        res = self.model.track(
            frame,
            persist=True,
            verbose=False,
            device=device
        )[0]

        if res.boxes is None:
            return img

        boxes = res.boxes.xyxy.cpu().numpy()
        confs = res.boxes.conf.cpu().numpy()
        clss  = res.boxes.cls.cpu().numpy()

        for box, conf, cls_id in zip(boxes, confs, clss):
            self._draw_npc_hud(
                img,
                box,
                cls_id,
                conf
            )

        return img

四、为什么不用检测框?

方式 观感
检测框 工程 / Debug
HUD 游戏 / 视觉化

现实世界 + HUD = "数字世界叠加现实"

这是很多:

  • AR

  • AI 艺术

  • 互动装置

都会用到的视觉范式。


五、几个可以继续进化的方向

🔥 1. 真·血量系统

复制代码

hp -= damage hp = max(0, hp)

🧠 2. 跟踪 ID → NPC 身份

复制代码

res.boxes.id

✨ 3. 状态特效

  • 低血量闪烁

  • 被锁定变红

  • Boss 专属 HUD

🎮 4. 与你前面的「泡泡 / 掉魂 / 佛光」组合

你现在这套代码已经是:

YOLO + 游戏特效引擎

不是"检测 demo"了。


六、总结

YOLO 不只是检测

它是一个:

  • 世界理解器

  • 实时语义引擎

  • 游戏 UI 触发器

对 PiscTrace or PiscCode感兴趣?更多精彩内容请移步官网看看~🔗 PiscTrace

相关推荐
夏幻灵3 小时前
C++ 中手动重载赋值运算符(operator=)时实现部分复制的思路和方法
开发语言·c++·算法
yy我不解释3 小时前
关于comfyui的token顺序打乱(二)
人工智能·python·flask
Blossom.1183 小时前
AI边缘计算实战:基于MNN框架的手机端文生图引擎实现
人工智能·深度学习·yolo·目标检测·智能手机·边缘计算·mnn
九河云3 小时前
人工智能驱动企业数字化转型:从效率工具到战略引擎
人工智能·物联网·算法·机器学习·数字化转型
superman超哥3 小时前
仓颉语言中包与模块系统的深度剖析与工程实践
c语言·开发语言·c++·python·仓颉
王德博客3 小时前
【题解】求分数序列(C++)
算法
再__努力1点3 小时前
LBP纹理特征提取:高鲁棒性的纹理特征算法
开发语言·人工智能·python·算法·计算机视觉
山沐与山3 小时前
【设计模式】Python模板方法模式:从入门到实战
python·设计模式·模板方法模式
ZPC82103 小时前
PPO算法训练机器人时,如何定义状态/动作/奖励
人工智能·算法·机器人