尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

rknn_model_zoo 中的 librga:基于 RGA 2D 硬件加速器的图像处理编程指南

rknn_model_zoo 中的 librga:基于 RGA 2D 硬件加速器的图像处理编程指南 示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载导读RGARaster Graphic Acceleration Unit是 Rockchip 平台上一颗独立的 2D 硬件加速器可承担点/线绘制、图像缩放、旋转、bitBlt、alpha 混合等常见 2D 图形操作将 CPU 从高频的图像搬运与变换中解放出来。本仓库在3rdparty/librga目录下内置了 librga —— RGA 的用户空间驱动库及其 2D 图形操作 API当前版本 v1.10.0并针对 Android 与 Linux 提供了多种 CPU 架构的预编译产物。阅读本文后你将掌握 librga 的目录结构、im2d API 分层、核心数据结构与状态码语义能够在自己的 C/C 应用中完成缩放、裁剪、格式转换、旋转、混合、填充等硬件加速操作并了解它在本仓库utils/image_utils.c中的真实调用方式。librga 在仓库中的定位根据 3rdparty/librga/README.md 的说明librga 实现了 RGA 的用户空间驱动并提供一系列 2D 图形操作 API其上游来源是 airockchip 维护的 librga 开源项目当前仓库内置版本为 v1.10.0。该版本号与头文件 im2d_version.h 中的版本定义完全一致RGA_API_MAJOR_VERSION 1、RGA_API_MINOR_VERSION 10、RGA_API_REVISION_VERSION 0并可通过RGA_API_FULL_VERSION宏在运行时打印完整版本字符串。在 rknn_model_zoo 的整体架构中librga 属于3rdparty第三方依赖库与 fftw、jpeg_turbo、opencv、rknpu2 等并列为上层图像预处理链路如模型输入图像的缩放、格式转换提供 2D 硬件加速选项。目录结构与预编译产物librga 目录的核心布局如下include/全部公共头文件包括 im2d 系列 API 头文件与底层 rga.hLinux/Linux 平台预编译库按aarch64、armhf、armhf_uclibc架构划分每种架构同时提供librga.a静态库与librga.so动态库Android/Android 平台预编译库提供arm64-v8a与armeabi-v7a两套 ABI 的librga.a/librga.soREADME.md来源与版本说明。实际开发中可直接链接对应架构的库文件也可以自行从上游源码构建后替换使用方式与 OpenCV 等第三方库一致。头文件体系im2d API 的分层结构include目录下最核心的入口是 im2d.h它通过简单的 include 组合将整套 API 暴露给使用者#include im2d_version.h #include im2d_type.h #include im2d_common.h #include im2d_buffer.h #include im2d_single.h #include im2d_task.h #include im2d_mpi.h各头文件分工明确可以按功能边界将其划分为五层头文件职责im2d_version.hAPI 版本宏用于运行时校验头文件与库的版本匹配im2d_type.h核心类型缓冲区描述rga_buffer_t、矩形im_rect、选项im_opt_t、枚举IM_USAGE/IM_STATUS等im2d_buffer.h缓冲区导入importbuffer 系列与包装wrapbuffer 系列im2d_single.h单任务模式 APIcopy/resize/crop/rotate/flip/blend/fill 等im2d_task.h多任务队列模式 APIimbeginJob / imendJob 与各类 xxxTaskim2d_common.h通用工具querystring、imStrError、imcheck、imsync、imconfigim2d_mpi.h面向 rockit-ko 的上下文ctx接口如 improcess_ctxim2d_expand.hAndroid 扩展GraphicBuffer / AHardwareBuffer 的导入与包装另外 rga.h 属于底层头文件定义了RK_FORMAT_*像素格式枚举im2d_type.h 会依赖它RockchipRga.h 则提供较早期的面向对象封装Rga 类适合旧代码兼容场景。核心数据结构与枚举1. 像素格式RK_FORMAT_*RGA 支持 RGB 与 YUV 两大类格式定义在 rga.h 中格式值统一左移 8 位以与 Android 的 HAL_PIXEL_FORMAT_* 区分。常用格式包括RGB 类RK_FORMAT_RGBA_8888、RK_FORMAT_RGBX_8888、RK_FORMAT_RGB_888、RK_FORMAT_BGRA_8888、RK_FORMAT_RGB_565、RK_FORMAT_BGR_888YUV 半平面/平面类RK_FORMAT_YCbCr_420_SPNV12 风格、RK_FORMAT_YCrCb_420_SPNV21 风格、RK_FORMAT_YCbCr_420_P、RK_FORMAT_YCbCr_422_SP等10 bit 类RK_FORMAT_YCbCr_420_SP_10B、RK_FORMAT_YCrCb_420_SP_10B、RK_FORMAT_YCbCr_422_SP_10B等打包格式RK_FORMAT_YUYV_422、RK_FORMAT_UYVY_422等。2. 缓冲区描述rga_buffer_t所有 im2d 函数都通过rga_buffer_t描述一块图像缓冲区其定义位于 im2d_type.htypedef struct { void* vir_addr; /* 虚拟地址 */ void* phy_addr; /* 物理地址 */ int fd; /* dma-buf 共享 fd */ int width; /* 图像宽度 */ int height; /* 图像高度 */ int wstride; /* 宽度方向的像素 stride */ int hstride; /* 高度方向的像素 stride */ int format; /* 像素格式取自 RK_FORMAT_* */ int color_space_mode; /* 色彩空间模式 */ int global_alpha; /* 全局 alpha 值 */ int rd_mode; /* 读取模式raster/fbc/tile */ int color; /* 颜色填充时使用的颜色 */ im_colorkey_range colorkey_range; im_nn_t nn; int rop_code; rga_buffer_handle_t handle; /* RGA 驱动中的缓冲区句柄 */ } rga_buffer_t;注意wstride/hstride与width/height的区别前者是缓冲区在内存中实际的对齐 stride后者是参与运算的可视区域尺寸。对齐不满足硬件要求时通常需要设置 stride 大于 width。3. 矩形与选项im_rect描述图像上的操作区域含x、y、width、height四个字段im_opt_t单次任务的完整配置项包含颜色填充值color、colorkey 范围、NN 量化参数nn、ROP 码、调度优先级priority、核心选择core、马赛克模式mosaic_mode、OSD 配置osd_config、中断配置intr_config以及预留字段reserve[128]结构体第一个成员version默认取RGA_CURRENT_API_HEADER_VERSION用于版本校验。4. 状态码IM_STATUS任何 blit 类函数的返回值都取自IM_STATUS其语义定义清晰状态码值含义IM_STATUS_NOERROR2无错误IM_STATUS_SUCCESS1执行成功IM_STATUS_FAILED0执行失败IM_STATUS_NOT_SUPPORTED-1不支持该操作/格式组合IM_STATUS_OUT_OF_MEMORY-2内存不足IM_STATUS_INVALID_PARAM-3参数无效IM_STATUS_ILLEGAL_PARAM-4参数非法IM_STATUS_ERROR_VERSION-5头文件与库版本不匹配配合imStrError(status)宏定义于 im2d_common.h可将状态码转换为可读的错误描述字符串便于调试。5. 操作位图IM_USAGEIM_USAGE以位图方式描述一次任务要启用的硬件能力im2d_type.h几何变换IM_HAL_TRANSFORM_ROT_90/180/270、IM_HAL_TRANSFORM_FLIP_H/V混合模式IM_ALPHA_BLEND_SRC_OVER默认 Porter-Duff SRC over DST、IM_ALPHA_BLEND_SRC、IM_ALPHA_BLEND_DST、IM_ALPHA_BLEND_SRC_IN、IM_ALPHA_BLEND_DST_IN、IM_ALPHA_BLEND_XOR等高级特性IM_ALPHA_COLORKEY_NORMAL/INVERTED颜色键控、IM_SYNC/IM_ASYNC同步/异步、IM_COLOR_FILL、IM_COLOR_PALETTE、IM_NN_QUANTIZE、IM_ROP、IM_ALPHA_BLEND_PRE_MUL、IM_MOSAIC、IM_OSD等。此外还有调度核心枚举IM_SCHEDULER_CORE可指定 RGA3 Core0/Core1 或 RGA2 Core0与缩放插值枚举IM_SCALE_MODEINTER_NEAREST / INTER_LINEAR / INTER_CUBIC。单任务 API一次调用完成一项操作单任务模式是最常用的编程方式每个 API 的典型签名为「输入缓冲 输出缓冲 操作参数 同步标志默认同步执行」全部声明在 im2d_single.h 中。C 下使用默认参数即可C 环境下则通过宏自动展开为_t后缀函数并填充默认值。常用 API 一览API功能关键参数imcopy图像拷贝src、dst、syncimresize缩放src、dst、fx/fy 缩放因子、interpolationimcrop裁剪src、dst、im_rect源图像上的裁剪区域imtranslate平移src、dst、目标起始坐标 x/yimcvtcolor色彩空间/格式转换src、dst、sfmt、dfmt、modeBT601/BT709 等imrotate旋转src、dst、IM_HAL_TRANSFORM_ROT_90/180/270imflip镜像翻转src、dst、IM_HAL_TRANSFORM_FLIP_H/Vimblend双通道混合前景背景→背景fg、bg、Porter-Duff modeimcomposite三通道混合SRCASRCB→DSTsrcA、srcB、dst、modeimcolorkey颜色键控src、dst、im_colorkey_range、modeimquantizeNN 量化src、dst、im_nn_t各通道 scale/offsetimfill / imfillArray颜色填充dst、im_rect、colorimrectangle画矩形框dst、rect、color、thickness负值实心immosaic马赛克image、rect、IM_MOSAIC_8/16/32/64/128impalette调色板/LUT 映射src、dst、lutimprocess通用单任务处理src/dst/pat 三通道 三个矩形 im_opt_t usageimmakeBorder扩边src、dst、top/bottom/left/right、border_type、value以缩放入口为例C 接口签名为IM_API IM_STATUS imresize(const rga_buffer_t src, rga_buffer_t dst, double fx 0, double fy 0, int interpolation 0, int sync 1, int *release_fence_fd NULL);当sync 1时函数阻塞等待任务完成并直接返回状态码当sync 0时异步提交通过release_fence_fd输出用于查询任务状态的 fence fd之后可配合imsync(release_fence_fd)等待完成适合流水线并行场景。任务队列 API一次提交多个操作当需要对同一批图像连续执行多个操作如先裁剪再缩放再格式转换时可以使用任务模式im2d_task.h将多个 task 打包成一个 RGA job 一次性提交减少用户态与内核态的往返开销。基本流程为im_job_handle_t job imbeginJob(); // 创建 job imcropTask(job, src, tmp, rect); // 加入裁剪任务 imresizeTask(job, tmp, dst, 0, 0, INTER_LINEAR); // 加入缩放任务 imcvtcolorTask(job, tmp, dst, sfmt, dfmt); // 加入格式转换任务 IM_STATUS ret imendJob(job); // 提交并执行默认 IM_SYNC核心接口包括imbeginJob(uint64_t flags 0)创建 job返回im_job_handle_t句柄imendJob(job, sync_mode IM_SYNC, acquire_fence_fd 0, int *release_fence_fd NULL)提交 job支持同步/异步两种运行模式imcancelJob(job)取消并销毁 job各类imxxxTask(job, ...)向 job 追加任务包括 imcopyTask、imresizeTask、imcropTask、imrotateTask、imflipTask、imblendTask、imcompositeTask、imfillTask、immosaicTask、impaletteTask、improcessTask 等与单任务 API 一一对应。任务模式的任务全部在硬件端串行/流水执行可避免中间结果的多次内存搬运适合对性能敏感的预处理链路。缓冲区管理importbuffer 与 wrapbufferRGA 硬件不能直接访问普通 malloc 内存因此 im2d 提供了两套缓冲区接口im2d_buffer.h导入importbuffer——把外部分配的缓冲区注册到 RGA 驱动返回rga_buffer_handle_t句柄importbuffer_fd(int fd, ...)传入 dma-buf 的 fd推荐方式drm 分配importbuffer_virtualaddr(void *va, ...)传入虚拟地址需映射为连续物理内存场景importbuffer_physicaladdr(uint64_t pa, ...)传入物理地址releasebuffer_handle(handle)任务结束后释放句柄。导入接口存在三组重载仅传size、传width/height/format、或传im_handle_param_t结构体内含 width、height、format 三字段。包装wrapbuffer——把已导入的句柄或内存描述包装成rga_buffer_twrapbuffer_handle(handle, width, height, format, ...)基于句柄包装wrapbuffer_virtualaddr / wrapbuffer_physicaladdr / wrapbuffer_fd基于地址/fd 直接包装此时无需先 importbuffer可选的第 4、5 个参数为wstride、hstride省略时默认wstride width、hstride height。典型使用模式rga_buffer_handle_t hnd importbuffer_fd(dma_fd, width, height, fmt); rga_buffer_t src wrapbuffer_handle(hnd, width, height, fmt, wstride, hstride); // ... 执行 im2d 操作 ... releasebuffer_handle(hnd);在 Android 平台上im2d_expand.h 还提供了importbuffer_GraphicBuffer、wrapbuffer_AHardwareBuffer等扩展接口可直接对接 Android 图形缓冲区。通用工具能力查询与参数校验im2d_common.h 提供一组与具体操作无关的辅助接口querystring(RGA_VENDOR / RGA_VERSION / RGA_MAX_INPUT / RGA_MAX_OUTPUT / RGA_INPUT_FORMAT / RGA_OUTPUT_FORMAT / RGA_EXPECTED / RGA_ALL)查询 RGA 硬件的基本信息、支持的最大分辨率与格式集合返回描述字符串imStrError(IM_STATUS)将状态码转为错误信息字符串imcheckHeader()校验头文件版本与库版本是否一致避免因 API 不匹配导致未定义行为imcheck(src, dst, src_rect, dst_rect, mode_usage)在提交任务前检查输入输出缓冲、区域与 usage 是否被当前硬件支持返回IM_STATUS_NOERROR表示可执行imconfig(IM_CONFIG_NAME, value)配置调度核心、优先级等全局行为imsync(int release_fence_fd)阻塞等待指定 fence fd 对应的任务完成。建议在正式业务代码前先调用imcheckHeader()并在每次任务后检查返回值这是 librga 编程中保证稳定性的基本实践。在 rknn_model_zoo 中的真实应用本仓库的 utils/image_utils.c 在实现图像预处理/后处理时提供了基于 librga 的加速路径文件第 7 行直接#include im2d.h随后根据缓冲区来源物理地址 / dma fd / 虚拟地址分别调用importbuffer_physicaladdr、importbuffer_fd、importbuffer_virtualaddr导入源/目标缓冲区源码第 585-613 行再通过wrapbuffer_handle/wrapbuffer_physicaladdr/wrapbuffer_fd/wrapbuffer_virtualaddr包装出rga_buffer_t参与后续处理源码第 596-627 行。这一实现是 librga 接口在真实工程中的典型范例展示了「导入 → 包装 → 执行 → 释放」的完整调用链可作为开发者将 RGA 加速引入自研预处理管线的参考模板。平台适配与集成建议根据预编译产物目录librga 覆盖的部署环境包括Linuxaarch64、armhf、armhf_uclibc静态库与动态库Androidarm64-v8a、armeabi-v7a。集成时需注意三点其一RGA 是 Rockchip SoC 上的硬件单元librga 只能运行于具备 RGA 硬件如 RK356x/RK3588 等系列的目标板上x86 宿主机无法直接使用其二使用前确认内核已加载 rga 驱动节点其三头文件版本与库版本需保持一致可使用imcheckHeader()或RGA_API_FULL_VERSION宏在运行时校验。对于本仓库的模型推理场景当输入图像尺寸与模型输入不一致、或需要将相机帧通常为 YUV转换为模型所需的 RGB 布局时都可以借助 imresize imcvtcolor 的组合把预处理卸载到 RGA 上降低 CPU 占用与整体延迟。小结librga 通过一套分层清晰的 im2d API把 Rockchip RGA 2D 硬件加速器的能力以「缓冲区 单任务/任务队列」两种模式暴露给应用层rga_buffer_t描述图像IM_USAGE声明能力IM_STATUS汇报结果importbuffer/wrapbuffer 负责内存对接。结合本仓库 3rdparty/librga 内置的 v1.10.0 头文件与多架构预编译库以及 utils/image_utils.c 的实践范例开发者可以快速在 Rockchip 平台上构建出高性能的图像缩放、格式转换、旋转与混合流水线。赞分享示例工程人工智能嵌入式边缘计算计算机视觉模型优化【免费下载链接】rknn_model_zoo项目地址https://gitcode.com/gh_mirrors/rk/rknn_model_zoo点击查看免费下载相关推荐终极指南5步掌握librga硬件加速图像处理技术终极指南5步掌握librga硬件加速图像处理技术 在当今多媒体应用爆炸式增长的时代图像处理性能已成为决定应用成败的关键因素。面对高分辨率视频实时处理、游戏图图像处理图形学驱动开发嵌入式上一篇Mikage中断处理机制从硬件异常到模拟器事件调度下一篇HsMod插件终极指南5分钟安装解锁32倍速和200皮肤定制创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表