Rockchip RGA 简单使用

一、简介

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>

// 1. 分配用户态内存
uint8_t* src_buf = malloc(width * height * 3);

// 2. 导入到 RGA (虚拟地址方式)
rga_buffer_handle_t src_handle = importbuffer_virtualaddr(src_buf, buf_size);

// 3. 包装成 rga_buffer_t
rga_buffer_t src_img = wrapbuffer_handle(src_handle, width, height, RK_FORMAT_BGR_888);

// 4. 释放
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);

// 导入 buffer
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
// BGR -> RGB
imcvtcolor(src_img, dst_img, RK_FORMAT_BGR_888, RK_FORMAT_RGB_888);

// BGR -> YUV (NV12)
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);

// 灰色: B=114, G=114, R=114 (按 BGR 顺序)
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);

// 参数说明:
// src_img, dst_img: 源和目标 buffer
// {}: 第三个参数是 pat (pattern),一般不用
// srect: 源区域 {x, y, width, height}
// drect: 目标区域 {x, y, width, height}
// {}: prect,一般不用
// -1: acquire_fence_fd
// nullptr: release_fence_fd
// nullptr: opt_ptr
// IM_SYNC: 同步执行

Rockchip RGA 简单使用
http://example.com/2026/08/16/Rockchip-RGA-简单使用/
作者
Yu xin
发布于
2026年8月16日
许可协议