你好,LLLLLLLL!
既然你只需要 2D 标注(点、框、文字),那完全不需要 GPU 渲染 —— CPU + OpenCV 就能高效完成,这也是社区主流做法。
推荐方案:CPU 渲染 + Display 接口输出
方案架构
模型推理 (BPU/CPU) → 获取检测结果 → OpenCV绘制 (CPU) → Display接口 → HDMI显示
实现步骤
步骤 1:使用 OpenCV 在 CPU 上绘制
import cv2
import numpy as np
def draw_detections(image, boxes, points, texts):
"""
image: 原始图像 (BGR格式)
boxes: [[x1, y1, x2, y2], ...] 检测框
points: [[x, y], ...] 关键点
texts: [str, ...] 标注文字
"""
# 绘制检测框
for box in boxes:
x1, y1, x2, y2 = map(int, box)
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 绘制关键点
for pt in points:
x, y = map(int, pt)
cv2.circle(image, (x, y), 5, (0, 0, 255), -1)
# 绘制文字
for i, text in enumerate(texts):
cv2.putText(image, text, (10, 30 + i * 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
return image
步骤 2:通过 Display 接口输出到 HDMI
from hobot_dv import Display
# 创建 Display 对象
display = Display()
# 将绘制后的图像转换为 NV12 格式(Display 接口要求)
def bgr_to_nv12(bgr_image):
yuv = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2YUV_I420)
# I420 转 NV12
y = yuv[0]
u = yuv[1]
v = yuv[2]
nv12 = np.vstack([y, u.reshape(-1, 2)])
return nv12
# 主循环
while True:
# 1. 获取相机帧
frame = camera.read()
# 2. 模型推理获取检测结果
boxes, points, texts = model_inference(frame)
# 3. CPU 绘制
rendered = draw_detections(frame, boxes, points, texts)
# 4. 格式转换并输出
nv12_frame = bgr_to_nv12(rendered)
display.show(nv12_frame)
参考资源
| 资源 | 链接 |
|---|---|
| Display API 文档 | RDK 多媒体 API |
| 社区讨论 | RDK X5 GPU 如何使用 |
| OpenGL ES 支持状态 | rdkos-3.3.1 是否支持 gles |
注意事项
- 图像格式:Display 接口要求 NV12/YUV420SP 格式,需从 BGR 转换
- 分辨率匹配:输出分辨率需与 HDMI 显示器匹配(如 1920x1080)
- 性能:OpenCV 绘制 2D 框/文字对 CPU 负载极低,不会影响推理性能
- 无需 GPU:2D 标注不需要 GPU 加速,CPU 完全够用
如果遇到问题
- Display 不显示:检查
hobot_dv包是否安装,确认 HDMI 连接正常 - 格式错误:确认 NV12 格式转换正确,可先用
cv2.imwrite保存验证绘制效果 - 需要代码示例:可参考社区 YOLO 网页渲染案例 的绘制逻辑
如果这个方案满足你的需求,可以直接开始实现。如果遇到具体问题(如 Display 调用、格式转换等),欢迎继续发帖,可以把错误日志贴出来一起排查!