From 12f677eca7800d2b7e8535a4e17f53d36533722a Mon Sep 17 00:00:00 2001 From: zhangtengyuan <1321485497@qq.com> Date: Mon, 22 Jan 2024 16:14:36 +0800 Subject: [PATCH] 2 --- src/src/core/params.cpp | 3 +- src/src/core/plate_detect.cpp | 21 ++++++++++-- src/src/core/plate_recognize.cpp | 59 ++++++++++++++++++++++---------- 3 files changed, 61 insertions(+), 22 deletions(-) diff --git a/src/src/core/params.cpp b/src/src/core/params.cpp index 8809043..2b0ccef 100644 --- a/src/src/core/params.cpp +++ b/src/src/core/params.cpp @@ -9,4 +9,5 @@ namespace easypr { } return instance_; } -}/*! \namespace easypr*/ \ No newline at end of file +}/*! \namespace easypr*/ +//这段代码是一个单例模式的实现。CParams类的instance_成员变量被初始化为nullptr,然后instance()函数用来获取CParams类的唯一实例。如果instance_为空,就会创建一个新的实例并返回,否则直接返回现有的实例。这样可以确保在程序运行期间只有一个CParams类的实例存在。 \ No newline at end of file diff --git a/src/src/core/plate_detect.cpp b/src/src/core/plate_detect.cpp index 26d1ad9..37dedfc 100644 --- a/src/src/core/plate_detect.cpp +++ b/src/src/core/plate_detect.cpp @@ -11,7 +11,7 @@ namespace easypr { m_type = 0; m_showDetect = false; } - +// 这段代码是CPlateDetect类的构造函数,初始化了一些成员变量,包括m_plateLocate指针、m_maxPlates、m_type和m_showDetect。 CPlateDetect::~CPlateDetect() { SAFE_RELEASE(m_plateLocate); } int CPlateDetect::plateDetect(Mat src, std::vector &resultVec, int type, @@ -24,6 +24,11 @@ namespace easypr { mser_Plates.reserve(16); std::vector all_result_Plates; all_result_Plates.reserve(64); + // 这部分代码定义了CPlateDetect类的析构函数和plateDetect方法。 +// 在plateDetect方法中,使用了OpenMP并行处理来同时进行Sobel、颜色和MSER三种车牌定位方法。 +// 最后使用NMS(非极大值抑制)来判断车牌,并返回结果。 +// plateDetect方法还有一个重载版本,其中showDetectArea参数为false。 +// LoadSVM方法用于加载SVM模型。 #pragma omp parallel sections { #pragma omp section @@ -32,12 +37,16 @@ namespace easypr { m_plateLocate->plateSobelLocate(src, sobel_Plates, img_index); } } + // 这部分代码使用了OpenMP并行处理来进行Sobel车牌定位方法。 +// 如果type为0或者包含PR_DETECT_SOBEL标志位,则调用m_plateLocate的plateSobelLocate方法。 +// plateSobelLocate方法用于进行Sobel算子定位车牌。 #pragma omp section { if (!type || type & PR_DETECT_COLOR) { m_plateLocate->plateColorLocate(src, color_Plates, img_index); } } + //这段代码是使用OpenMP并行处理来调用m_plateLocate的plateColorLocate方法,用于进行颜色定位车牌。根据type参数的值,判断是否需要进行颜色定位 #pragma omp section { if (!type || type & PR_DETECT_CMSER) { @@ -64,7 +73,11 @@ namespace easypr { showDectectResults(src, resultVec, m_maxPlates); return 0; } - +// 这部分代码是CPlateDetect类的plateDetect方法的一部分。 +// 首先通过OpenMP并行处理调用plateMserLocate方法来进行MSER车牌定位。 +// 然后将定位结果分别设置为对应的类型(SOBEL、COLOR、CMSER)并存入all_result_Plates中。 +// 最后使用NMS(非极大值抑制)来判断车牌,并将结果存入resultVec中。 +// 代码中的if (0)条件语句似乎没有实际作用,可能需要进一步确认其意图。 int CPlateDetect::plateDetect(Mat src, std::vector &resultVec, int img_index) { int result = plateDetect(src, resultVec, m_type, false, img_index); return result; @@ -74,4 +87,6 @@ namespace easypr { PlateJudge::instance()->LoadModel(path); } -} \ No newline at end of file +} +// 这段代码中的plateDetect方法是CPlateDetect类的成员函数,用于调用另一个重载版本的plateDetect方法,并返回结果。 +// LoadSVM方法用于加载SVM模型,其中调用了PlateJudge类的LoadModel方法。 \ No newline at end of file diff --git a/src/src/core/plate_recognize.cpp b/src/src/core/plate_recognize.cpp index 0e18a5b..175659e 100644 --- a/src/src/core/plate_recognize.cpp +++ b/src/src/core/plate_recognize.cpp @@ -7,7 +7,10 @@ namespace easypr { CPlateRecognize::CPlateRecognize() { m_showResult = false; } - +// 这段代码是C++中的类定义,定义了CPlateRecognize类的构造函数,初始化了m_showResult成员变量为false。 +// 该类包含plateRecognize方法,用于车牌识别,包括车牌检测和字符识别两部分。 +// 还包含了一些Load方法,用于加载模型文件。 +// 代码中使用了OpenCV库中的Mat类和一些自定义的类和方法。 // main method, plate recognize, contain two parts // 1. plate detect @@ -19,10 +22,11 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector &plateVe // 1. plate detect std::vector plateVec; - //Ƽ int resultPD = plateDetect(img, plateVec, img_index); + // 这段代码是C++中的类方法CPlateRecognize::plateRecognize的一部分,用于车牌识别。 +// 首先对输入图像进行统一尺寸的调整,然后进行车牌检测,将结果存储在plateVec中。 +// 返回值resultPD表示车牌检测的结果,0表示成功,非0表示失败。 if (resultPD == 0) { - //ʾͼã size_t num = plateVec.size(); for (size_t j = 0; j < num; j++) { CPlate& item = plateVec.at(j); @@ -30,14 +34,17 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector &plateVe SHOW_IMAGE(plateMat, 0); // scale the rect to src; - //ż⵽ijƾλá item.setPlateScale(scale); RotatedRect rect = item.getPlatePos(); item.setPlatePos(scaleBackRRect(rect, 1.f / scale)); - +// 如果车牌检测成功(resultPD == 0),则对每个检测到的车牌进行处理: +// 1. 获取车牌图像并显示 +// 2. 调整车牌位置和大小 +// 3. 获取车牌颜色并识别字符 +// 4. 将识别结果存储,并根据识别结果设置车牌字符串 +// 5. 根据显示类型展示检测结果或识别结果 // get plate color Color color = item.getPlateColor(); - //óɫΪƶԡ if (color == UNKNOWN) { color = getPlateType(plateMat, true); item.setPlateColor(color); @@ -46,17 +53,16 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector &plateVe if (0) { std::cout << "plateColor:" << plateColor << std::endl; } - +// 这段代码用于获取车牌颜色并进行处理。 +// 首先获取车牌颜色,如果颜色为UNKNOWN,则调用getPlateType方法获取颜色并设置到item中。 +// 然后将颜色转换为字符串形式并存储在plateColor中。 +// 最后,通过条件判断,如果条件为0,则输出plateColor到控制台。 // 2. chars recognize std::string plateIdentify = ""; - //ַʶ - // charsRecognise ַʶ - //ӵɫַǰγյijַ int resultCR = charsRecognise(item, plateIdentify); if (resultCR == 0) { std::string license = plateColor + ":" + plateIdentify; item.setPlateStr(license); - //ʶַijƶ item ӵ plateVecOut С plateVecOut.push_back(item); if (0) std::cout << "resultCR:" << resultCR << std::endl; } @@ -67,6 +73,11 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector &plateVe if (0) std::cout << "resultCR:" << resultCR << std::endl; } } + // 这段代码是C++中的类方法CPlateRecognize::plateRecognize的一部分,用于字符识别。 +// 首先定义了一个空字符串plateIdentify,并调用charsRecognise方法进行字符识别,结果存储在resultCR中。 +// 如果resultCR为0,则将plateColor和plateIdentify拼接成license字符串,并设置到item中,然后将item存入plateVecOut中。 +// 否则,只将plateColor设置到license字符串中,然后将item存入plateVecOut中。 +// 最后,根据条件判断,如果条件为0,则输出resultCR到控制台。 if (getResultShow()) { // param type: 0 detect, 1 recognize; int showType = 1; @@ -78,28 +89,36 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector &plateVe } return resultPD; } -//֧(SVM)ģͣڳжϡ +// 这段代码是C++中的类方法CPlateRecognize::plateRecognize的一部分,用于根据getResultShow()的返回值决定是否展示检测结果或识别结果。 +// 如果getResultShow()返回true,则根据showType的值选择展示检测结果或识别结果。 +// 最后返回resultPD,表示车牌检测的结果。 void CPlateRecognize::LoadSVM(std::string path) { PlateJudge::instance()->LoadModel(path); } -//˹(ANN)ģַͣʶ + void CPlateRecognize::LoadANN(std::string path) { CharsIdentify::instance()->LoadModel(path); } -//ַʶANNģ͡ +// 评注该代码 + +// 这部分代码定义了CPlateRecognize类的两个方法:LoadSVM和LoadANN。 +// LoadSVM方法用于加载SVM模型,调用PlateJudge类的实例的LoadModel方法加载模型。 +// LoadANN方法用于加载ANN模型,调用CharsIdentify类的实例的LoadModel方法加载模型。 +// 这些方法用于在车牌识别过程中加载相关的机器学习模型。 void CPlateRecognize::LoadChineseANN(std::string path) { CharsIdentify::instance()->LoadChineseModel(path); } -//ڻҶַʶANNģ͡ void CPlateRecognize::LoadGrayChANN(std::string path) { CharsIdentify::instance()->LoadGrayChANN(path); } -// ַӳ + void CPlateRecognize::LoadChineseMapping(std::string path) { CharsIdentify::instance()->LoadChineseMapping(path); } - +// 这部分代码定义了CPlateRecognize类的三个方法:LoadChineseANN、LoadGrayChANN和LoadChineseMapping。 +// 这些方法用于在字符识别过程中加载相关的中文字符识别模型和映射文件。 +// 分别调用CharsIdentify类的实例的LoadChineseModel、LoadGrayChANN和LoadChineseMapping方法加载模型和映射文件。 // deprected int CPlateRecognize::plateRecognize(const Mat& src, std::vector &licenseVec) { vector plates; @@ -111,4 +130,8 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector &li return resultPR; } -} \ No newline at end of file +} +// 这段代码定义了CPlateRecognize类的一个新方法plateRecognize,接受一个输入图像和一个字符串向量作为参数。 +// 在方法内部,首先创建了一个CPlate类型的向量plates,并调用了原有的plateRecognize方法来进行车牌识别。 +// 然后遍历plates向量中的每个车牌,将其车牌字符串存入传入的licenseVec向量中。 +// 最后返回了车牌识别的结果resultPR。 \ No newline at end of file