< 所有主题
打印

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