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

我看论坛的帖子说RDK X5有板端嵌入式GPU可以用于渲染,我现在希望使用板端GPU对模型识别结果再原图上进行渲染,有没有使用板端GPU进行渲染的教程呢,或者使用示例呢

你好,LLLLLLLL!

关于你提到的“使用 RDK X5 板端 GPU 进行本地渲染”的需求,根据社区现有信息和官方回复,目前暂无直接可用的板端 GPU 渲染教程或示例,原因如下:


:prohibited: 核心结论

RDK X5 的嵌入式 GPU 目前不支持 OpenGL ES 渲染,官方尚未提供相关适配支持。


:pushpin: 详细说明

  1. GPU 能力限制:

    • RDK X5 的 GPU 是一个嵌入式 GPU,仅设计用于图形渲染。
    • 不支持 CUDA,也不支持通用计算(GPGPU)。
    • 官方曾明确表示:“RDK X5 目前对 OpenGL ES 没有适配支持”(参考 帖子 33182)。
  2. 官方推荐方案:

    • 目前官方示例(如 YOLO、TTS 等)均通过 Web 端渲染 或 CPU + Display 接口 输出图像。
    • 若需 HDMI 输出,可使用 Display 接口将 YUV420SP/NV12 格式图像直接输出到屏幕,但图像数据需由 CPU 生成或解码(参考 帖子 28362)。
  3. 社区现状:

    • 多位用户尝试调用 OpenGL ES 或 OpenCL 进行渲染/计算,但均反馈无法使用或无示例支持。
    • 当前社区主流做法是:模型推理在 BPU/CPU,可视化通过 Web 或 CPU 绘制后 HDMI 输出。

:white_check_mark: 推荐替代方案

既然板端 GPU 渲染不可用,你可以考虑以下方案实现“识别结果在原图上渲染”:

方案一:CPU 渲染 + HDMI 输出(推荐)

# 使用 OpenCV 在 CPU 上绘制检测框
import cv2
# 假设已有检测结果 boxes 和原图 image
for box in boxes:
    cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 通过 Display 接口输出到 HDMI
# 参考官方文档:https://developer.d-robotics.cc/rdk_doc/Basic_Application/multi_media/multi_media_api/

方案二:Web 端渲染(官方示例常用)

方案三:使用 EGL(部分用户尝试过,但稳定性待验证)

  • 有用户提到使用 EGL Preview,但存在无法显示图像的问题(参考 帖子 28348)
  • 若你愿意尝试,可参考 RDK 文档中的 pydev_multimedia_api,但需自行调试

:magnifying_glass_tilted_left: 建议下一步

  1. 确认你的具体需求:

    • 是需要 HDMI 本地显示?还是仅需在开发机上查看?
    • 是否需要 3D 渲染?还是仅 2D 框/文字标注?
  2. 参考官方文档:

  3. 在社区沉淀你的尝试:

    • 如果你成功实现了某种渲染方案,欢迎发帖分享,帮助后续开发者!

如你能提供更具体的使用场景(如:是否需要 3D、是否必须 HDMI 输出、是否接受 Web 显示等),我可以给出更针对性的建议。

需要2D渲染,再图片上标注点和框以及文字

你好,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 调用、格式转换等),欢迎继续发帖,可以把错误日志贴出来一起排查!