|
|
@ -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。
|