一、简介
RGA (Raster Graphic Acceleration) 是 Rockchip 提供的 2D 图像处理硬件加速器,专门用于加速图像的缩放、颜色转换、格式转换等操作。在 RK3588 等芯片上可用。
典型优势:
- 硬件加速,CPU 零开销
- 高效的图像缩放 (resize)
- 色彩空间转换 (BGR↔RGB, RGB↔YUV)
- 支持 DMA 零拷贝
适用场景:
- YOLO 等目标检测的图像预处理
- 视频/图像的格式转换
- 相机 pipeline 的图像处理
RGA 的典型作用:
| 操作 |
含义 |
例子 |
| CSC |
颜色空间转换 |
NV12 -> RGB888 |
| resize |
缩放尺寸 |
640x480 -> 640x640 |
| crop |
裁剪区域 |
从 640x480 中裁出 320x240 |
| rotate |
旋转/翻转 |
90 度旋转、镜像 |
| copy |
内存拷贝 |
验证 buffer 路径 |
目录结构:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| ./ ├── CHANGELOG.md ├── COPYING ├── docs │ ├── RGA_FAQ.assets │ ├── Rockchip_Developer_Guide_RGA_CN.md │ ├── Rockchip_Developer_Guide_RGA_EN.md │ ├── Rockchip_FAQ_RGA_CN.md │ └── Rockchip_FAQ_RGA_EN.md ├── include │ ├── drmrga.h │ ├── GrallocOps.h │ ├── im2d_buffer.h │ ├── im2d_common.h │ ├── im2d_expand.h │ ├── im2d.h │ ├── im2d.hpp │ ├── im2d_mpi.h │ ├── im2d_single.h │ ├── im2d_task.h │ ├── im2d_type.h │ ├── im2d_version.h │ ├── RgaApi.h │ ├── rga.h │ ├── RgaMutex.h │ ├── RgaSingleton.h │ ├── RgaUtils.h │ └── RockchipRga.h ├── libs │ ├── AndroidNdk │ └── Linux ├── README.md ├── samples │ ├── allocator_demo │ ├── alpha_demo │ ├── async_demo │ ├── build │ ├── cmake-android.sh │ ├── cmake-linux.sh │ ├── CMakeLists.txt │ ├── config_demo │ ├── copy_demo │ ├── crop_demo │ ├── cvtcolor_demo │ ├── fill_demo │ ├── gauss_demo │ ├── im2d_api_demo │ ├── mosaic_demo │ ├── padding_demo │ ├── palette_demo │ ├── README.md │ ├── resize_demo │ ├── rop_demo │ ├── sample_file │ ├── SConscript │ ├── toolchain_local.cmake │ ├── transform_demo │ └── utils ├── toolchains │ ├── toolchain_android_ndk.cmake │ ├── toolchain_linux_1106.cmake │ ├── toolchain_linux.cmake │ └── toolchain_rt_thread.cmake └── tools └── bin
|
二、核心内容
头文件引用:
- RGA 头文件位置:
librga/include/
- C++ 调用 im2d API:
im2d.hpp
- C 调用 im2d API:
im2d.h
库文件:
- RGA 库文件位置:
librga/libs/Linux/gcc-aarch64/
librga.so
librga.a
2.1 Buffer 管理
RGA 操作的是 buffer,需要先导入再用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #include <im2d.hpp> #include <RgaUtils.h>
uint8_t* src_buf = malloc(width * height * 3);
rga_buffer_handle_t src_handle = importbuffer_virtualaddr(src_buf, buf_size);
rga_buffer_t src_img = wrapbuffer_handle(src_handle, width, height, RK_FORMAT_BGR_888);
releasebuffer_handle(src_handle); free(src_buf);
|
2.2 常用格式
| 格式 |
说明 |
RK_FORMAT_BGR_888 |
3 通道 BGR |
RK_FORMAT_RGB_888 |
3 通道 RGB |
RK_FORMAT_RGBA_8888 |
4 通道 RGBA |
RK_FORMAT_YCbCr_420_SP |
NV12 |
2.3 API 概述
| 操作 |
API |
说明 |
| 缩放 |
imresize() |
图像缩放 |
| 颜色转换 |
imcvtcolor() |
BGR↔RGB, RGB↔YUV |
| 填充边框 |
imfill() |
矩形区域填充 |
| 综合处理 |
improcess() |
crop+resize+格式转换 |
| 内存拷贝 |
imcopy() |
buffer 拷贝 |
三、代码示例
3.1 图像缩放
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| #include <im2d.hpp> #include <RgaUtils.h>
void resize_example() { int src_w = 1920, src_h = 1080; int dst_w = 640, dst_h = 640;
uint8_t* src = malloc(src_w * src_h * 3); uint8_t* dst = malloc(dst_w * dst_h * 3);
rga_buffer_handle_t src_handle = importbuffer_virtualaddr(src, src_w * src_h * 3); rga_buffer_handle_t dst_handle = importbuffer_virtualaddr(dst, dst_w * dst_h * 3);
rga_buffer_t src_img = wrapbuffer_handle(src_handle, src_w, src_h, RK_FORMAT_BGR_888); rga_buffer_t dst_img = wrapbuffer_handle(dst_handle, dst_w, dst_h, RK_FORMAT_BGR_888);
IM_STATUS ret = imresize(src_img, dst_img);
releasebuffer_handle(src_handle); releasebuffer_handle(dst_handle); free(src); free(dst); }
|
3.2 颜色转换
1 2 3 4 5
| imcvtcolor(src_img, dst_img, RK_FORMAT_BGR_888, RK_FORMAT_RGB_888);
imcvtcolor(src_img, dst_img, RK_FORMAT_BGR_888, RK_FORMAT_YCbCr_420_SP);
|
3.3 填充背景
1 2 3 4 5 6 7 8
| rga_buffer_t canvas = wrapbuffer_handle(handle, width, height, RK_FORMAT_BGR_888);
int gray = (114 << 16) | (114 << 8) | 114;
imfill(canvas, {0, 0, width, height}, gray);
|
3.4 综合处理
improcess() 是最强大的 API,可以同时完成:
- 指定源区域 (crop)
- 缩放到目标区域
- 颜色格式转换
1 2 3 4 5 6 7 8 9 10 11 12 13
| improcess(src_img, dst_img, {}, srect, drect, {}, -1, nullptr, nullptr, IM_SYNC);
|