枚舉類型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;
}