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;
}
