OpenCv:车牌识别

OpenCv: License Plate Recognition

本文关键字:识别 OpenCv      更新时间:2023-10-16

我一直致力于基于github存储库的车牌识别https://github.com/MicrocontrollersAndMore/OpenCV_3_License_Plate_Recognition_Cpp

但我需要检测小字符。但我想不通。我想我需要更改尺码,但我想不通。

https://github.com/MicrocontrollersAndMore/OpenCV_3_License_Plate_Recognition_Cpp/blob/master/DetectChars.cpp

bool checkIfPossibleChar(PossibleChar &possibleChar) {
// this function is a 'first pass' that does a rough check on a contour to see if it could be a char,
// note that we are not (yet) comparing the char to other chars to look for a group
if (possibleChar.boundingRect.area() > MIN_PIXEL_AREA &&
possibleChar.boundingRect.width > MIN_PIXEL_WIDTH && possibleChar.boundingRect.height > MIN_PIXEL_HEIGHT &&
MIN_ASPECT_RATIO < possibleChar.dblAspectRatio && possibleChar.dblAspectRatio < MAX_ASPECT_RATIO) {
return(true);
} else {
return(false);
}}

double dblDistanceBetweenChars = distanceBetweenChars(possibleChar,     possibleMatchingChar);
double dblAngleBetweenChars = angleBetweenChars(possibleChar, possibleMatchingChar);
double dblChangeInArea = (double)abs(possibleMatchingChar.boundingRect.area() - possibleChar.boundingRect.area()) / (double)possibleChar.boundingRect.area();
double dblChangeInWidth = (double)abs(possibleMatchingChar.boundingRect.width - possibleChar.boundingRect.width) / (double)possibleChar.boundingRect.width;
double dblChangeInHeight = (double)abs(possibleMatchingChar.boundingRect.height - possibleChar.boundingRect.height) / (double)possibleChar.boundingRect.height;
// check if chars match
if (dblDistanceBetweenChars < (possibleChar.dblDiagonalSize * MAX_DIAG_SIZE_MULTIPLE_AWAY) &&
dblAngleBetweenChars < MAX_ANGLE_BETWEEN_CHARS &&
dblChangeInArea < MAX_CHANGE_IN_AREA &&
dblChangeInWidth < MAX_CHANGE_IN_WIDTH &&
dblChangeInHeight < MAX_CHANGE_IN_HEIGHT) {
vectorOfMatchingChars.push_back(possibleMatchingChar);      // if the chars are a match, add the current char to vector of matching chars
}

提前非常感谢。

您应该首先进行调试,看看两个A,A在什么条件下失败。

  1. MIN_PIXEL_AREA、MIN_PIXEL_WIDTH&MIN_PIXEL_HEIGHT可能无法容纳小尺寸的A.

  2. 在您提供的第二个代码片段中,从if(condition1 && cond2 &&...)到语法CCD_ 2。这会告诉你这些条件在哪里失效。

  3. 最后,在第二个片段中,检查边界矩形是否为字符的许多条件在很大程度上取决于过去看到的字符类型。因为在您的情况下,字符AA在大小、距离和方向(垂直)上也有所不同。因此,最好重新初始化AA,而不是使用以前的字符,或者应该添加更多的条件来验证字符。[就像高度和宽度都减小一样]

一旦您知道步骤2中哪些条件失败以及为什么失败,那么对步骤3进行相关更改应该很简单。


编辑:我进一步查看了repo,并检查了函数findVectorOfVectorsOfMatchingChars和findVectorOfMatchingChars。

findVectorOfMatchingChars函数的分析:该函数获取一个可能的char,并检查该char是否与vectorOfChars的任何可能的char接近(如果条件全部通过)。如果有匹配项,将所有匹配项存储在一起并返回结果

findVectorOfVectorsOfMatchingChars函数的分析:此函数从vectorOfPossibleChars中选择任何可能的Char,并使用findVectorOfMatchingChars查找所有匹配的Char。如果找到了良好的匹配,此函数将使用(vectorOfPossibleChars-matchedPossibleChars)调用自己。

现在,问题来了。

假设每个可能的Char都是图G的一个顶点,并且当两个可能的Char满足findVectorOfMatchingChars函数中定义的条件时,它们之间有一条边。

现在,假设我们有一个图,a,B,C,D,X尽可能接近。Char顶点,X离a,B、C,D足够近,但a、B、C、D彼此相距足够远,不被认为是紧密匹配。

现在,让我们将findVectorOfVectorsOfMatchingChars应用于这个可能的Chars向量。

选项1:如果我们首先选择X,我们会找到A、B、C、D作为其匹配的可能Char,从而得到所有可能Char。

选项2:如果我们先选择A,我们会发现X与A的可能Char匹配,但与B、C、D不匹配。因此,我们从vectorOfPossibleChars中删除A、X,并在B、C、D上重新应用findVectorOfVectorsOfMatchingChars。现在,由于B、C、D之间没有匹配,我们最终没有匹配B、C或D。

整改方案:

  1. 创建一个图形类,并将其中每个可能的Char注册为Vertex。使用findVectorOfMatchingChars中定义的条件在每对顶点之间创建边
  2. 您可能需要自定义条件以合并其他顶点和2A的顶点之间的边。为此,您应该使用更多的数据集,这样您创建或更改阈值的条件就不会太通用,无法容纳非牌照字符
  3. 在图中查找连接树以查找所有字符。这可能会添加所有可能的Chars。为了避免这种情况,可以使用加权边来限制加法