From e1779670977fde5fb6c03ad7cd69fe4018d91064 Mon Sep 17 00:00:00 2001 From: gewenlin <3074038122@qq.com> Date: Sun, 3 Dec 2023 23:50:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/src/core/chars_recognise.cpp | 40 ++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/src/src/core/chars_recognise.cpp b/src/src/core/chars_recognise.cpp index d101fd3..26831a9 100644 --- a/src/src/core/chars_recognise.cpp +++ b/src/src/core/chars_recognise.cpp @@ -6,29 +6,43 @@ namespace easypr { CCharsRecognise::CCharsRecognise() { m_charsSegment = new CCharsSegment(); } +//定义了CCharsRecognise类的构造函数,创建一个新的CCharsSegment类的实例,并将其地址赋值给成员变量m_charsSegment CCharsRecognise::~CCharsRecognise() { SAFE_RELEASE(m_charsSegment); } +//定义了CCharsRecognise类的析构函数, +//调用了SAFE_RELEASE宏来释放(即删除并置空)m_charsSegment指针指向的CCharsSegment对象 int CCharsRecognise::charsRecognise(Mat plate, std::string& plateLicense) { + //车牌字符识别函数,接收两个参数,一个是Mat类型的plate,它是需要进行识别的车牌图像; + //另一个是std::string&类型的plateLicense,它是一个引用,用于存储识别出来的车牌号码。 std::vector matChars; + //matChars,用于存储经过字符分割后的单个字符图像。 int result = m_charsSegment->charsSegment(plate, matChars); + //调用m_charsSegment对象的charsSegment函数进行字符分割, + //将分割后的字符存储在matChars中。charsSegment函数的返回值存储在result变量中。 if (result == 0) { + //result = 0则表示字符分割成功,接着进行车牌号码的识别 int num = matChars.size(); for (int j = 0; j < num; j++) { Mat charMat = matChars.at(j); + //循环遍历matChars中的每个字符图像 bool isChinses = false; float maxVal = 0; if (j == 0) { bool judge = true; isChinses = true; + //第一个字符,则认为是中文汉字 auto character = CharsIdentify::instance()->identifyChinese(charMat, maxVal, judge); plateLicense.append(character.second); + //调用CharsIdentify::instance()->identifyChinese函数进行识别,并将识别结果追加到plateLicense中 } else { isChinses = false; + //如果不是第一个字符,则认为不是中文汉字, auto character = CharsIdentify::instance()->identify(charMat, isChinses); plateLicense.append(character.second); + //调用CharsIdentify::instance()->identify函数进行识别,并将识别结果追加到plateLicense中。 } } @@ -36,20 +50,27 @@ int CCharsRecognise::charsRecognise(Mat plate, std::string& plateLicense) { if (plateLicense.size() < 7) { return -1; } + // 检查plateLicense的长度是否小于7,如果小于7,则返回 - 1,表示车牌号码识别失败。否则,返回result,表示车牌号码识别成功。 return result; } int CCharsRecognise::charsRecognise(CPlate& plate, std::string& plateLicense) { +//同样是用来识别车牌的函数,数接收两个参数,一个是CPlate&类型的plate,它是需要进行识别的车牌对象; +// 另一个是std::string&类型的plateLicense,它是一个引用,用于存储识别出来的车牌号码 std::vector matChars; std::vector grayChars; + //matChars用于存储经过字符分割后的单个字符图像,grayChars用于存储灰度图像。 Mat plateMat = plate.getPlateMat(); + //调用plate.getPlateMat()获取车牌图像,并将其存储在plateMat中。 if (0) writeTempImage(plateMat, "plateMat/plate"); Color color; if (plate.getPlateLocateType() == CMSER) { color = plate.getPlateColor(); } + //选择不同的方式来获取车牌颜色。如果车牌定位类型为CMSER,则直接使用plate.getPlateColor()获取车牌颜色; + //否则,从车牌图像中截取一部分区域,并调用getPlateType()函数获取车牌类型。 else { int w = plateMat.cols; int h = plateMat.rows; @@ -58,35 +79,42 @@ int CCharsRecognise::charsRecognise(CPlate& plate, std::string& plateLicense) { } int result = m_charsSegment->charsSegmentUsingOSTU(plateMat, matChars, grayChars, color); - + //调用charsSegmentUsingOSTU方法对输入的车牌图像进行字符分割 if (result == 0) { int num = matChars.size(); for (int j = 0; j < num; j++) { + //for循环遍历每一个字符图像 Mat charMat = matChars.at(j); Mat grayChar = grayChars.at(j); + //通过matChars.at(j)和grayChars.at(j)获取第j个字符图像和其灰度图像 if (color != Color::BLUE) grayChar = 255 - grayChar; - + //如果车牌颜色不是蓝色,则对灰度图像进行操作 bool isChinses = false; std::pair character; float maxVal; if (0 == j) { isChinses = true; bool judge = true; + //设定第一个字符为中文字符 character = CharsIdentify::instance()->identifyChineseGray(grayChar, maxVal, judge); plateLicense.append(character.second); - + //使用CharsIdentify::instance()->identifyChineseGray方法识别灰度图像grayChar, + // 并将结果存储在character对中。 // set plate chinese mat and str plate.setChineseMat(grayChar); plate.setChineseKey(character.first); + //设置车牌的中文图像和字符串。 if (0) writeTempImage(grayChar, "char_data/" + character.first + "/chars_"); } else if (1 == j) { isChinses = false; bool isAbc = true; character = CharsIdentify::instance()->identify(charMat, isChinses, isAbc); + //使用CharsIdentify::instance()->identify方法识别字符图像charMat plateLicense.append(character.second); + //将识别的第二个字符串添加到plateLicense } else { isChinses = false; @@ -96,17 +124,21 @@ int CCharsRecognise::charsRecognise(CPlate& plate, std::string& plateLicense) { } CCharacter charResult; + //创建CCharacter对象并设置其图像和字符串。 charResult.setCharacterMat(charMat); charResult.setCharacterGrayMat(grayChar); if (isChinses) charResult.setCharacterStr(character.first); else charResult.setCharacterStr(character.second); - + + //如果isChinses为true,则使用识别的第一个字符串作为字符的字符串;否则,使用识别的第二个字符串。 plate.addReutCharacter(charResult); + //字符结果添加到车牌对象中。 } if (plateLicense.size() < 7) { return -1; + //最后,如果识别的字符数量少于7个,函数返回 - 1;否则返回result } }