目标 :
不画检测框,只给被识别到的目标加一个"游戏风格 NPC HUD":
血条(用置信度当 HP)
名字 + 百分比
自动避开画面边界
支持实时视频 / 摄像头 / 流媒体
一、效果说明
传统目标检测长这样:
❌ 红框 + 类别 + 置信度(很工程)
我们要的效果是这样:
✅ NPC 头顶血条 HUD

-
没有检测框
-
血条宽度 = 置信度
-
颜色从绿 → 红
-
文本在血条上方
-
像 RPG / FPS 游戏一样
非常适合:
-
AI 游戏化演示
-
直播互动
-
装置艺术
-
科技展览
二、核心思路
1️⃣ YOLO 负责「我是谁、在哪」
YOLO 输出:
-
xyxy:目标位置 -
conf:置信度 -
cls:类别 ID
2️⃣ 我们只做一件事
不画框,只画 HUD
HUD 包含三层:
-
血条背景
-
血条(HP)
-
文本(名字 + 百分比)
三、完整代码(可直接运行)
使用 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
