6.2.类和结构体演示模拟rknn推理
演示视频:https://www.bilibili.com/video/BV1fAAUzxEn9/
#include <iostream>
#include <string>
#include <cstdlib>
// 定义 RKNN 上下文结构体
struct RKNNContext
{
void *handle; // 模拟 RKNN 模型的句柄
};
// 另一种上下文类型
typedef struct
{
void *handle; // 模拟 RKNN 模型的句柄
} rknn_app_context_t;
class RknnModel
{
private:
RKNNContext ctx_; // 使用结构体包装 handle
int model_width_;
int model_height_;
bool loaded_;
// 禁止拷贝构造和赋值,防止资源管理问题
RknnModel(const RknnModel &) = delete;
RknnModel &operator=(const RknnModel &) = delete;
public:
// 构造函数:初始化状态
RknnModel(const std::string &model_path)
: loaded_(false), model_width_(640), model_height_(640)
{
std::cout << "1. 创建模型对象" << std::endl;
if (!model_path.empty())
{
loadModel(model_path);
}
}
// 析构函数:自动释放资源
~RknnModel()
{
std::cout << "4. 开始释放资源..." << std::endl;
if (ctx_.handle != nullptr)
{
free(ctx_.handle); // 释放模拟的内存句柄
ctx_.handle = nullptr;
}
loaded_ = false;
std::cout << "5. 资源释放完成" << std::endl;
}
// 加载模型:模拟分配内存
int loadModel(const std::string &model_path)
{
std::cout << "2. 正在加载模型: " << model_path << std::endl;
// 模拟加载:为 handle 分配一块内存
ctx_.handle = malloc(1024);
if (ctx_.handle == nullptr) // 处理内存分配失败
{
std::cerr << " -> 模型句柄分配内存失败!" << std::endl;
loaded_ = false;
return -1;
}
loaded_ = true;
model_width_ = 640;
model_height_ = 640;
std::cout << " -> 模型加载成功,输入尺寸:" << model_width_ << "x" << model_height_ << std::endl;
return 0;
}
// 推理函数
int inference(const std::string &image_path)
{
if (!loaded_)
{
std::cerr << "错误:模型未加载!" << std::endl;
return -1;
}
if (image_path.empty())
{
std::cerr << "错误:图像路径为空!" << std::endl;
return -2;
}
std::cout << "3. 执行推理:处理 "<< image_path << " 的图像" << std::endl;
// 模拟推理过程
std::cout << " -> 模拟推理完成,输出结果(示例):" << std::endl;
return 0;
}
int getWidth() const { return model_width_; }
int getHeight() const { return model_height_; }
bool isLoaded() const { return loaded_; }
};
// 测试主函数
int main()
{
#ifdef _WIN32
// Windows 平台下,设置控制台输出编码为 UTF-8
system("chcp 65001 > nul");
#endif
std::cout << "程序开始运行\n" << std::endl;
{
// 创建模型对象
RknnModel model("./yolo11.rknn");
if (model.isLoaded())
{
model.inference("./image.jpg");
}
}
// model 的析构函数在此处自动被调用
std::cout << "程序结束" << std::endl;
return 0;
}
