枚舉類型enmu使用技巧

工程目的

在工程中經常會使用enum枚舉類來表示工程中所需要的事件、情況、類別,尤其對於分類、檢測,故而記錄下其使用技巧。

enum的定義

這裏使用enum定義一個分類網絡的label :

enum PlateType
{
    CommonBluePlate           = 0,       
    CommonYellowPlate         = 1,     
    DoubleYellowPlate         = 2,      
    NewEnergyBigCarPlate      = 3,       
    PlateTypeUnknow           = 99,     
};

enum的使用

typedef struct
{
    PlateType plateType; // 定義 枚舉類
    float score;
}PlateClasses;//使用一個結構體來表示網絡分類的結果

//PlateType plateType 賦值

int PlateClassify::process(const cv::Mat& img, PlateClasses& result)
{
    std::vector<float> ret;
    std::vector<int> ouputShape;

    const float* data = m_net->process(img);
    m_net->getOutputShape(ouputShape);
    int step = ouputShape[1];
    ret.insert(ret.begin(),data, data+step);

    float result_max = 0;
    for(int j = 0; j < ret.size(); j++)
    {
        if(ret[j] > result_max)
        {
            result_max = ret[j];
            result.plateType = PlateType(j);  //通過分類結果進行賦值
            result.score = result_max;
        }
    }
}

輸出分類結果enum變量字符

常用的方法有:使用數組和宏,這裏記錄宏的使用

#define Enum_chip_type_case(x) case x: return(#x);
static inline const char *enum_chip_type_string(enum PlateType x)
{
    switch (x)
    {
        Enum_chip_type_case(CommonBluePlate)
        Enum_chip_type_case(CommonYellowPlate)
        Enum_chip_type_case(DoubleYellowPlate)
        Enum_chip_type_case(NewEnergyBigCarPlate)
        Enum_chip_type_case(PlateTypeUnknow)
    }
    return "Unsupported Chip";
}
int main() {
    std::string testFolder = './file';
    std::vector<std::string> imageFiles;
    getImageFiles(testFolder,imageFiles);
    PlateClassify Instance = PlateClassify::getInstance();
    for(auto item : imageFiles)
    {
        cv::Mat img = cv::imread(item);
        PlateClasses result;
        Instance.process(img, result);
        std::cout<<item<<'\t'<<enum_chip_type_string(result.plateType)<<'\t'<<result.score<<"**"<<std::endl;  //輸出分類結果字符
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章