使用RDK X5板端GPU进行本地渲染

你好,LLLLLLLL!

既然你只需要 2D 标注(点、框、文字),那完全不需要 GPU 渲染 —— CPU + OpenCV 就能高效完成,这也是社区主流做法。


:white_check_mark: 推荐方案:CPU 渲染 + Display 接口输出

方案架构

模型推理 (BPU/CPU) → 获取检测结果 → OpenCV绘制 (CPU) → Display接口 → HDMI显示

:memo: 实现步骤

步骤 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)

:books: 参考资源

资源 链接
Display API 文档 RDK 多媒体 API
社区讨论 RDK X5 GPU 如何使用
OpenGL ES 支持状态 rdkos-3.3.1 是否支持 gles

:warning: 注意事项

  1. 图像格式:Display 接口要求 NV12/YUV420SP 格式,需从 BGR 转换
  2. 分辨率匹配:输出分辨率需与 HDMI 显示器匹配(如 1920x1080)
  3. 性能:OpenCV 绘制 2D 框/文字对 CPU 负载极低,不会影响推理性能
  4. 无需 GPU:2D 标注不需要 GPU 加速,CPU 完全够用

:magnifying_glass_tilted_left: 如果遇到问题

  • Display 不显示:检查 hobot_dv 包是否安装,确认 HDMI 连接正常
  • 格式错误:确认 NV12 格式转换正确,可先用 cv2.imwrite 保存验证绘制效果
  • 需要代码示例:可参考社区 YOLO 网页渲染案例 的绘制逻辑

如果这个方案满足你的需求,可以直接开始实现。如果遇到具体问题(如 Display 调用、格式转换等),欢迎继续发帖,可以把错误日志贴出来一起排查!