跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++AI算法

RK3588 Linux RGA 使用教程

介绍 RK3588 Linux 环境下 RGA 硬件加速单元的使用方法。RGA 用于加速 2D 图形操作如缩放、旋转及格式转换。主要流程包括检查驱动版本、下载测试代码、配置 CMake 构建环境以及编写 C++ 主程序。核心步骤涉及定义和初始化图像缓冲区结构体,导入句柄,调用 RGA API 执行图像处理,最后释放资源。结合 OpenCV 可实现图像数据的读写与格式转换,最终输出处理后的图片。

ApiHolic发布于 2026/3/28更新于 2026/9/1069 浏览
RK3588 Linux RGA 使用教程

概述

RGA (Raster Graphic Acceleration Unit) 是一个独立的 2D 硬件加速器,可用于加速点/线绘制,执行图像缩放、旋转、bitBlt、alpha 混合等常见的 2D 图形操作。假设驱动环境已就绪,可直接使用。

环境准备

1. 查看驱动版本

cat /sys/kernel/debug/rkrga/driver_version

2. 下载测试代码

参考 GitHub 仓库:TRQ-UP/Rk3588-linux-rga

代码实现

1. CMakeLists.txt 配置

后续 RGA 或 OpenCV 的更新版本,直接放到 3rdparty 文件夹中,在 CMakeLists 中配置即可。

cmake_minimum_required(VERSION 3.16)
project(opencv_411_test)
set(CMAKE_CXX_STANDARD 11)
# 设置库架构
set(LIB_ARCH "aarch64")
set(DEVICE_NAME "RK3588")
# 设置 OpenCV 路径
set(OpenCV_DIR ./3rdparty/opencv/opencv-linux-aarch64/share/OpenCV)
find_package(OpenCV REQUIRED)
# 输出 OpenCV 信息
message(STATUS "OpenCV include dirs: ${OpenCV_INCLUDE_DIRS}")
message(STATUS "Found OpenCV Version: ${OpenCV_VERSION}")
set(3RDPARTY_PATH ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty)
# 设置 RGA 的路径
set(RGA_DIR ${3RDPARTY_PATH}/rga/${DEVICE_NAME})
set(RGA_LIB ${RGA_DIR}/lib/Linux/${LIB_ARCH}/librga.so)
# 用来搜索头文件的目录
include_directories(${OpenCV_INCLUDE_DIRS})
include_directories(${RGA_DIR}/include)
# 编译源代码
add_executable(opencv_411_test src/main.cpp)
# 链接 OpenCV 和 RGA 库
target_link_libraries(opencv_411_test ${OpenCV_LIBS} ${RGA_LIB})

2. 主程序逻辑

完整功能请参考 RGA IM2D API 开发指南。

使用 RGA 的基本步骤:

  1. 定义图像缓冲区的描述结构体(如 rga_buffer_t)。
  2. 初始化这些结构体(通常通过 memset 清零)。
  3. 创建或获取图像缓冲区的句柄(如 rga_buffer_handle_t)。
  4. 使用这些结构体和句柄进行图像处理操作(如缩放、旋转、格式转换等)。
#include "opencv2/opencv.hpp"
#include <iostream>
#include "im2d_version.h"
#include "im2d_type.h"
#include "im2d_single.h"
#include "im2d_common.h"
#include "im2d_buffer.h"
#include "RgaUtils.h"
using namespace std;

const char* querystring(int name);
/* RGA_VENDOR - 厂商信息
   RGA_VERSION - 版本信息
   RGA_MAX_INPUT - 支持的最大输入分辨率
   RGA_MAX_OUTPUT - 支持的最大输出分辨率
   RGA_SCALE_LIMIT - 支持的缩放倍数
   RGA_INPUT_FORMAT - 支持的输入格式
   RGA_OUTPUT_FORMAT - 支持的输出格式
   RGA_EXPECTED - 预期性能
   RGA_ALL - 输出所有信息 */
void print_rga_info() {
    cout << querystring(RGA_ALL) << endl;
}

int main(int argc, char **argv) {
    // 输出 RGA 的信息
    print_rga_info();

    int ret = 0;
    // 原始图片的宽、高、格式
    int src_width, src_height, src_format;
    // 目标图片的宽、高、格式
    int dst_width, dst_height, dst_format;
    // 缓冲区(用于暂存输入或输出的数据,从而减少系统调用的次数)
    char *src_buf, *dst_buf;
    // 图像缓冲区大小
    int src_buf_size, dst_buf_size;

    // 描述源图像和目标图像的缓冲区属性
    rga_buffer_t src_img, dst_img;
    // 引用图像缓冲区
    rga_buffer_handle_t src_handle, dst_handle;

    // 初始化结构体变量
    memset(&src_img, 0, sizeof(src_img));
    memset(&dst_img, 0, sizeof(dst_img));

    // 使用 OpenCV 读取图片
    cv::Mat image, res;
    image = cv::imread("../img/test.jpg");
    if (image.data == nullptr) {
        cout << "图片文件不存在" << endl;
        return -1;
    }
    cout << "图像宽为:" << image.cols << "\t高度为:" << image.rows << "\t通道数为:" << image.channels() << endl;

    cv::Mat opencv_resize;
    cv::resize(image, opencv_resize, cv::Size(1920, 1080));
    cv::imwrite("../img/opencv_resize.jpg", opencv_resize);

    // 设置源图像的宽度、高度和格式
    src_width = image.cols;
    src_height = image.rows;
    src_format = RK_FORMAT_RGB_888;

    // 设置目标图像的宽度、高度和格式
    dst_width = 1920;
    dst_height = 1080;
    dst_format = RK_FORMAT_RGB_888;

    // 计算源图像和目标图像的缓冲区大小
    src_buf_size = src_width * src_height * get_bpp_from_format(src_format);
    dst_buf_size = dst_width * dst_height * get_bpp_from_format(dst_format);

    // 使用 malloc 分配内存给源图像和目标图像的缓冲区
    src_buf = (char *)malloc(src_buf_size);
    dst_buf = (char *)malloc(dst_buf_size);

    cout << "src format: " << get_bpp_from_format(src_format) << endl;
    cout << "dst format: " << get_bpp_from_format(dst_format) << endl;

    // 将源图像数据从 OpenCV 的 cv::Mat 对象复制到自定义的缓冲区 src_buf 中
    memcpy(src_buf, image.data, src_width * src_height * get_bpp_from_format(src_format));
    memset(dst_buf, 0x80, dst_buf_size);

    // 使用 importbuffer_virtualaddr 将源图像和目标图像的缓冲区导入为 RGA 可识别的句柄
    src_handle = importbuffer_virtualaddr(src_buf, src_buf_size);
    dst_handle = importbuffer_virtualaddr(dst_buf, dst_buf_size);

    if (src_handle == 0 || dst_handle == 0) {
        printf("importbuffer failed!\n");
        return -1;
    }

    // 使用 wrapbuffer_handle 将句柄包装为 rga_buffer_t 结构体
    src_img = wrapbuffer_handle(src_handle, src_width, src_height, src_format);
    dst_img = wrapbuffer_handle(dst_handle, dst_width, dst_height, dst_format);

    // 检查图像
    ret = imcheck(src_img, dst_img, {}, {});
    if (IM_STATUS_NOERROR != ret) {
        printf("%d, check error! %s", __LINE__, imStrError((IM_STATUS)ret));
        return -1;
    }
    printf("%d, check success \n", __LINE__);

    // 图像翻转
    /* 图片镜像
       0:不变
       IM_HAL_TRANSFORM_FLIP_H:左右翻转
       IM_HAL_TRANSFORM_FLIP_V:上下翻转 */
    ret = imflip(src_img, dst_img, 0);
    if (ret == IM_STATUS_SUCCESS) {
        printf("imflip running success!\n");
    } else {
        printf("running failed, %s\n", imStrError((IM_STATUS)ret));
        return -1;
    }

    // 将 rk 格式的图片转成 OpenCV 识别的图片格式并保存
    res.create(dst_height, dst_width, CV_8UC3);
    memcpy(res.data, dst_buf, dst_height * dst_width * 3);
    cv::imwrite("../img/result.jpg", res);
    printf("save picture: [ %s ] success\n", "../img/result.jpg");

    // 释放资源
release_buffer:
    if (src_handle) releasebuffer_handle(src_handle);
    if (dst_handle) releasebuffer_handle(dst_handle);
    if (src_buf) free(src_buf);
    if (dst_buf) free(dst_buf);

    return ret;
}

运行结果

[图片:原始图片]

原始图片

[图片:OpenCV 处理结果]

opencv-resize

[图片:RGA 处理结果]

rga-resize

目录

  1. 概述
  2. 环境准备
  3. 1. 查看驱动版本
  4. 2. 下载测试代码
  5. 代码实现
  6. 1. CMakeLists.txt 配置
  7. 设置库架构
  8. 设置 OpenCV 路径
  9. 输出 OpenCV 信息
  10. 设置 RGA 的路径
  11. 用来搜索头文件的目录
  12. 编译源代码
  13. 链接 OpenCV 和 RGA 库
  14. 2. 主程序逻辑
  15. 运行结果

更多推荐文章

查看全部
  • ArduPilot RemoteID Transmitter:无人机远程识别解决方案
  • AI产品经理学习路线与核心技能指南
  • 算法空间复杂度详解:概念与常见计算实例
  • Redis Hash 类型及相关指令详解
  • Polar CTF Web 简单题型解题复盘
  • C 语言常见排序算法实现与解析
  • 用 Python requests 和 pytest 搭一个接口自动化框架
  • 高原无人机测试:稀薄空气下的飞行控制算法
  • Z-Image-Turbo 对比 Stable Diffusion 核心优势分析
  • Stable Diffusion 教程:使用 Inpainting 修复局部细节(如发饰)
  • 编译型与解释型语言:核心原理、区别与应用场景
  • Node.js 与 npm 的安装与配置
  • Midjourney AI 图像生成器使用教程详解
  • 基于 Zynq FPGA 的雷龙 SD NAND 测试实践
  • AI绘画入门:从零掌握文生图核心技术
  • EasyOCR Python 开源 OCR 工具实战指南
  • 基于 ResNet50 的人脸重建技术解析与教学实践
  • 飞算 JavaAI:解决 AI 生成代码不可用与逻辑混乱问题
  • 通义千问 7B 本地部署实战方案
  • Java 优先队列 PriorityQueue

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online