我看论坛的帖子说RDK X5有板端嵌入式GPU可以用于渲染,我现在希望使用板端GPU对模型识别结果再原图上进行渲染,有没有使用板端GPU进行渲染的教程呢,或者使用示例呢
你好,LLLLLLLL!
关于你提到的“使用 RDK X5 板端 GPU 进行本地渲染”的需求,根据社区现有信息和官方回复,目前暂无直接可用的板端 GPU 渲染教程或示例,原因如下:
核心结论
RDK X5 的嵌入式 GPU 目前不支持 OpenGL ES 渲染,官方尚未提供相关适配支持。
详细说明
-
GPU 能力限制:
- RDK X5 的 GPU 是一个嵌入式 GPU,仅设计用于图形渲染。
- 不支持 CUDA,也不支持通用计算(GPGPU)。
- 官方曾明确表示:“RDK X5 目前对 OpenGL ES 没有适配支持”(参考 帖子 33182)。
-
官方推荐方案:
- 目前官方示例(如 YOLO、TTS 等)均通过 Web 端渲染 或 CPU + Display 接口 输出图像。
- 若需 HDMI 输出,可使用
Display接口将 YUV420SP/NV12 格式图像直接输出到屏幕,但图像数据需由 CPU 生成或解码(参考 帖子 28362)。
-
社区现状:
- 多位用户尝试调用 OpenGL ES 或 OpenCL 进行渲染/计算,但均反馈无法使用或无示例支持。
- 当前社区主流做法是:模型推理在 BPU/CPU,可视化通过 Web 或 CPU 绘制后 HDMI 输出。
推荐替代方案
既然板端 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 端渲染(官方示例常用)
- 使用 ROS + web_video_server 或自定义 WebSocket 服务
- 将绘制后的图像推送到浏览器显示
- 参考案例:rdkx5 运行 yoloworld 网页端渲染
方案三:使用 EGL(部分用户尝试过,但稳定性待验证)
- 有用户提到使用 EGL Preview,但存在无法显示图像的问题(参考 帖子 28348)
- 若你愿意尝试,可参考 RDK 文档中的
pydev_multimedia_api,但需自行调试
建议下一步
-
确认你的具体需求:
- 是需要 HDMI 本地显示?还是仅需在开发机上查看?
- 是否需要 3D 渲染?还是仅 2D 框/文字标注?
-
参考官方文档:
-
在社区沉淀你的尝试:
- 如果你成功实现了某种渲染方案,欢迎发帖分享,帮助后续开发者!
如你能提供更具体的使用场景(如:是否需要 3D、是否必须 HDMI 输出、是否接受 Web 显示等),我可以给出更针对性的建议。
需要2D渲染,再图片上标注点和框以及文字
你好,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 调用、格式转换等),欢迎继续发帖,可以把错误日志贴出来一起排查!