< 所有主题
打印

6.1.RKNN模型推理流程模拟程序-模型加载(rknn_init)→ 参数查询 → 推理 → 资源释放(rknn_destroy)

演示视频:https://www.bilibili.com/video/BV1K9A6zJEoz/

//模拟RKNN推理接口
//RKNN模型推理流程模拟程序-模型加载(rknn_init)→ 参数查询 → 推理 → 资源释放(rknn_destroy)

typedef void* rknn_context;

// 2. 模拟 RKNN 初始化接口(接收 rknn_context 指针)
int rknn_init(rknn_context *ctx, const char *model_path)
{
    std::cout << "模拟加载模型:" << model_path << std::endl;
    *ctx = malloc(1024); 
	if (*ctx == nullptr) { // 必须检查 malloc 是否成功(工程必备)
        std::cerr << "内存分配失败,初始化模型失败" << std::endl;
        return -2;
    }
    
    std::cout << "分配的句柄地址:" << *ctx << std::endl; // 打印真实分配的地址
    return 0;
}

// 3. 释放资源(接收 rknn_context 指针)
int rknn_destroy(rknn_context *ctx)
{
	if (ctx == nullptr || *ctx == nullptr) {
        std::cerr << "句柄为空,无需释放" << std::endl;
        return -1;
    }
    std::cout << "释放模型句柄:" << *ctx << std::endl;
    free(*ctx); // 释放 malloc 分配的内存
    *ctx = nullptr; // 置空防止野指针
    return 0;
}

// 获取输入尺寸/获取参数
int rknn_get_input_size(rknn_context ctx, int *width, int *height)
{
    *width = 640; // 模拟 YOLO 输入尺寸
    *height = 640;
    return 0;
}

// 模拟推理
int rknn_run(rknn_context ctx, const unsigned char *img_data, int w, int h)
{
    std::cout << "模拟推理:宽=" << w << ", 高=" << h << std::endl;
    return 0;
}

int main() {
#ifdef _WIN32
    // Windows 平台下,设置控制台输出编码为 UTF-8
    system("chcp 65001 > nul");
#endif
    rknn_context ctx = nullptr; // 定义 rknn_context 变量
    const char *model_path = "./yolo11.rknn"; // 模拟模型路径

    // 1. 初始化模型
    if (rknn_init(&ctx, model_path) != 0) {
        std::cerr << "模型初始化失败" << std::endl;
        return -1;
    }

    // 2. 获取输入尺寸
    int width, height;
    if (rknn_get_input_size(ctx, &width, &height) != 0) {
        std::cerr << "获取输入尺寸失败" << std::endl;
        rknn_destroy(&ctx); // 释放资源
        return -1;
    }  
    
    // 3. 模拟推理
    unsigned char *img_data = new unsigned char[width * height * 3]; // 模拟 RGB 图像数据
    if (rknn_run(ctx, img_data, width, height) != 0) {
        std::cerr << "推理失败" << std::endl;
        delete[] img_data; // 释放图像数据
        rknn_destroy(&ctx); // 释放资源
        return -1;
    }

    delete[] img_data; // 释放图像数据
    // 4. 释放资源
    rknn_destroy(&ctx); // 释放资源 

    return 0;
}
目录