枚举类型enum使用技巧
工程目的
在工程中经常会使用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;
}