zhangtengyuan 10 months ago
parent b4df52f6b0
commit 12f677eca7

@ -9,4 +9,5 @@ namespace easypr {
} }
return instance_; return instance_;
} }
}/*! \namespace easypr*/ }/*! \namespace easypr*/
//这段代码是一个单例模式的实现。CParams类的instance_成员变量被初始化为nullptr然后instance()函数用来获取CParams类的唯一实例。如果instance_为空就会创建一个新的实例并返回否则直接返回现有的实例。这样可以确保在程序运行期间只有一个CParams类的实例存在。

@ -11,7 +11,7 @@ namespace easypr {
m_type = 0; m_type = 0;
m_showDetect = false; m_showDetect = false;
} }
// 这段代码是CPlateDetect类的构造函数初始化了一些成员变量包括m_plateLocate指针、m_maxPlates、m_type和m_showDetect。
CPlateDetect::~CPlateDetect() { SAFE_RELEASE(m_plateLocate); } CPlateDetect::~CPlateDetect() { SAFE_RELEASE(m_plateLocate); }
int CPlateDetect::plateDetect(Mat src, std::vector<CPlate> &resultVec, int type, int CPlateDetect::plateDetect(Mat src, std::vector<CPlate> &resultVec, int type,
@ -24,6 +24,11 @@ namespace easypr {
mser_Plates.reserve(16); mser_Plates.reserve(16);
std::vector<CPlate> all_result_Plates; std::vector<CPlate> all_result_Plates;
all_result_Plates.reserve(64); all_result_Plates.reserve(64);
// 这部分代码定义了CPlateDetect类的析构函数和plateDetect方法。
// 在plateDetect方法中使用了OpenMP并行处理来同时进行Sobel、颜色和MSER三种车牌定位方法。
// 最后使用NMS非极大值抑制来判断车牌并返回结果。
// plateDetect方法还有一个重载版本其中showDetectArea参数为false。
// LoadSVM方法用于加载SVM模型。
#pragma omp parallel sections #pragma omp parallel sections
{ {
#pragma omp section #pragma omp section
@ -32,12 +37,16 @@ namespace easypr {
m_plateLocate->plateSobelLocate(src, sobel_Plates, img_index); m_plateLocate->plateSobelLocate(src, sobel_Plates, img_index);
} }
} }
// 这部分代码使用了OpenMP并行处理来进行Sobel车牌定位方法。
// 如果type为0或者包含PR_DETECT_SOBEL标志位则调用m_plateLocate的plateSobelLocate方法。
// plateSobelLocate方法用于进行Sobel算子定位车牌。
#pragma omp section #pragma omp section
{ {
if (!type || type & PR_DETECT_COLOR) { if (!type || type & PR_DETECT_COLOR) {
m_plateLocate->plateColorLocate(src, color_Plates, img_index); m_plateLocate->plateColorLocate(src, color_Plates, img_index);
} }
} }
//这段代码是使用OpenMP并行处理来调用m_plateLocate的plateColorLocate方法用于进行颜色定位车牌。根据type参数的值判断是否需要进行颜色定位
#pragma omp section #pragma omp section
{ {
if (!type || type & PR_DETECT_CMSER) { if (!type || type & PR_DETECT_CMSER) {
@ -64,7 +73,11 @@ namespace easypr {
showDectectResults(src, resultVec, m_maxPlates); showDectectResults(src, resultVec, m_maxPlates);
return 0; return 0;
} }
// 这部分代码是CPlateDetect类的plateDetect方法的一部分。
// 首先通过OpenMP并行处理调用plateMserLocate方法来进行MSER车牌定位。
// 然后将定位结果分别设置为对应的类型SOBEL、COLOR、CMSER并存入all_result_Plates中。
// 最后使用NMS非极大值抑制来判断车牌并将结果存入resultVec中。
// 代码中的if (0)条件语句似乎没有实际作用,可能需要进一步确认其意图。
int CPlateDetect::plateDetect(Mat src, std::vector<CPlate> &resultVec, int img_index) { int CPlateDetect::plateDetect(Mat src, std::vector<CPlate> &resultVec, int img_index) {
int result = plateDetect(src, resultVec, m_type, false, img_index); int result = plateDetect(src, resultVec, m_type, false, img_index);
return result; return result;
@ -74,4 +87,6 @@ namespace easypr {
PlateJudge::instance()->LoadModel(path); PlateJudge::instance()->LoadModel(path);
} }
} }
// 这段代码中的plateDetect方法是CPlateDetect类的成员函数用于调用另一个重载版本的plateDetect方法并返回结果。
// LoadSVM方法用于加载SVM模型其中调用了PlateJudge类的LoadModel方法。

@ -7,7 +7,10 @@ namespace easypr {
CPlateRecognize::CPlateRecognize() { CPlateRecognize::CPlateRecognize() {
m_showResult = false; m_showResult = false;
} }
// 这段代码是C++中的类定义定义了CPlateRecognize类的构造函数初始化了m_showResult成员变量为false。
// 该类包含plateRecognize方法用于车牌识别包括车牌检测和字符识别两部分。
// 还包含了一些Load方法用于加载模型文件。
// 代码中使用了OpenCV库中的Mat类和一些自定义的类和方法。
// main method, plate recognize, contain two parts // main method, plate recognize, contain two parts
// 1. plate detect // 1. plate detect
@ -19,10 +22,11 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector<CPlate> &plateVe
// 1. plate detect // 1. plate detect
std::vector<CPlate> plateVec; std::vector<CPlate> plateVec;
//车牌检测
int resultPD = plateDetect(img, plateVec, img_index); int resultPD = plateDetect(img, plateVec, img_index);
// 这段代码是C++中的类方法CPlateRecognize::plateRecognize的一部分用于车牌识别。
// 首先对输入图像进行统一尺寸的调整然后进行车牌检测将结果存储在plateVec中。
// 返回值resultPD表示车牌检测的结果0表示成功非0表示失败。
if (resultPD == 0) { if (resultPD == 0) {
//显示车牌图像(如果启用)。
size_t num = plateVec.size(); size_t num = plateVec.size();
for (size_t j = 0; j < num; j++) { for (size_t j = 0; j < num; j++) {
CPlate& item = plateVec.at(j); CPlate& item = plateVec.at(j);
@ -30,14 +34,17 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector<CPlate> &plateVe
SHOW_IMAGE(plateMat, 0); SHOW_IMAGE(plateMat, 0);
// scale the rect to src; // scale the rect to src;
//依比例缩放检测到的车牌矩形位置。
item.setPlateScale(scale); item.setPlateScale(scale);
RotatedRect rect = item.getPlatePos(); RotatedRect rect = item.getPlatePos();
item.setPlatePos(scaleBackRRect(rect, 1.f / scale)); item.setPlatePos(scaleBackRRect(rect, 1.f / scale));
// 如果车牌检测成功resultPD == 0则对每个检测到的车牌进行处理
// 1. 获取车牌图像并显示
// 2. 调整车牌位置和大小
// 3. 获取车牌颜色并识别字符
// 4. 将识别结果存储,并根据识别结果设置车牌字符串
// 5. 根据显示类型展示检测结果或识别结果
// get plate color // get plate color
Color color = item.getPlateColor(); Color color = item.getPlateColor();
//获得车牌颜色,并将其设置为车牌对象的属性。
if (color == UNKNOWN) { if (color == UNKNOWN) {
color = getPlateType(plateMat, true); color = getPlateType(plateMat, true);
item.setPlateColor(color); item.setPlateColor(color);
@ -46,17 +53,16 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector<CPlate> &plateVe
if (0) { if (0) {
std::cout << "plateColor:" << plateColor << std::endl; std::cout << "plateColor:" << plateColor << std::endl;
} }
// 这段代码用于获取车牌颜色并进行处理。
// 首先获取车牌颜色如果颜色为UNKNOWN则调用getPlateType方法获取颜色并设置到item中。
// 然后将颜色转换为字符串形式并存储在plateColor中。
// 最后通过条件判断如果条件为0则输出plateColor到控制台。
// 2. chars recognize // 2. chars recognize
std::string plateIdentify = ""; std::string plateIdentify = "";
//字符识别
//调用 charsRecognise 方法进行字符识别,
//并将结果附加到车牌颜色字符串前以形成最终的车牌字符串。
int resultCR = charsRecognise(item, plateIdentify); int resultCR = charsRecognise(item, plateIdentify);
if (resultCR == 0) { if (resultCR == 0) {
std::string license = plateColor + ":" + plateIdentify; std::string license = plateColor + ":" + plateIdentify;
item.setPlateStr(license); item.setPlateStr(license);
//将含有识别字符串的车牌对象 item 添加到输出向量 plateVecOut 中。
plateVecOut.push_back(item); plateVecOut.push_back(item);
if (0) std::cout << "resultCR:" << resultCR << std::endl; if (0) std::cout << "resultCR:" << resultCR << std::endl;
} }
@ -67,6 +73,11 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector<CPlate> &plateVe
if (0) std::cout << "resultCR:" << resultCR << std::endl; 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()) { if (getResultShow()) {
// param type: 0 detect, 1 recognize; // param type: 0 detect, 1 recognize;
int showType = 1; int showType = 1;
@ -78,28 +89,36 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector<CPlate> &plateVe
} }
return resultPD; return resultPD;
} }
//加载支持向量机(SVM)模型,用于车牌判断。 // 这段代码是C++中的类方法CPlateRecognize::plateRecognize的一部分用于根据getResultShow()的返回值决定是否展示检测结果或识别结果。
// 如果getResultShow()返回true则根据showType的值选择展示检测结果或识别结果。
// 最后返回resultPD表示车牌检测的结果。
void CPlateRecognize::LoadSVM(std::string path) { void CPlateRecognize::LoadSVM(std::string path) {
PlateJudge::instance()->LoadModel(path); PlateJudge::instance()->LoadModel(path);
} }
//加载人工神经网络(ANN)模型,用于字符识别。
void CPlateRecognize::LoadANN(std::string path) { void CPlateRecognize::LoadANN(std::string path) {
CharsIdentify::instance()->LoadModel(path); CharsIdentify::instance()->LoadModel(path);
} }
//加载用于中文字符识别的ANN模型。 // 评注该代码
// 这部分代码定义了CPlateRecognize类的两个方法LoadSVM和LoadANN。
// LoadSVM方法用于加载SVM模型调用PlateJudge类的实例的LoadModel方法加载模型。
// LoadANN方法用于加载ANN模型调用CharsIdentify类的实例的LoadModel方法加载模型。
// 这些方法用于在车牌识别过程中加载相关的机器学习模型。
void CPlateRecognize::LoadChineseANN(std::string path) { void CPlateRecognize::LoadChineseANN(std::string path) {
CharsIdentify::instance()->LoadChineseModel(path); CharsIdentify::instance()->LoadChineseModel(path);
} }
//加载用于灰度中文字符识别的ANN模型。
void CPlateRecognize::LoadGrayChANN(std::string path) { void CPlateRecognize::LoadGrayChANN(std::string path) {
CharsIdentify::instance()->LoadGrayChANN(path); CharsIdentify::instance()->LoadGrayChANN(path);
} }
// 加载中文字符映射表
void CPlateRecognize::LoadChineseMapping(std::string path) { void CPlateRecognize::LoadChineseMapping(std::string path) {
CharsIdentify::instance()->LoadChineseMapping(path); CharsIdentify::instance()->LoadChineseMapping(path);
} }
// 这部分代码定义了CPlateRecognize类的三个方法LoadChineseANN、LoadGrayChANN和LoadChineseMapping。
// 这些方法用于在字符识别过程中加载相关的中文字符识别模型和映射文件。
// 分别调用CharsIdentify类的实例的LoadChineseModel、LoadGrayChANN和LoadChineseMapping方法加载模型和映射文件。
// deprected // deprected
int CPlateRecognize::plateRecognize(const Mat& src, std::vector<std::string> &licenseVec) { int CPlateRecognize::plateRecognize(const Mat& src, std::vector<std::string> &licenseVec) {
vector<CPlate> plates; vector<CPlate> plates;
@ -111,4 +130,8 @@ int CPlateRecognize::plateRecognize(const Mat& src, std::vector<std::string> &li
return resultPR; return resultPR;
} }
} }
// 这段代码定义了CPlateRecognize类的一个新方法plateRecognize接受一个输入图像和一个字符串向量作为参数。
// 在方法内部首先创建了一个CPlate类型的向量plates并调用了原有的plateRecognize方法来进行车牌识别。
// 然后遍历plates向量中的每个车牌将其车牌字符串存入传入的licenseVec向量中。
// 最后返回了车牌识别的结果resultPR。
Loading…
Cancel
Save