gpt4 book ai didi

c++ - OpenCv:车牌识别

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:34 24 4
gpt4 key购买 nike

我一直在研究基于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
}

非常感谢。

最佳答案

你应该先debug,看看A、A这两个在什么情况下会失败。

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

  2. 在您提供的第二个代码片段中,将 if 语句的语法从如果(条件 1 && 条件 2 &&...)语法if(condition1) {if(codition2) {....}}。这将告诉您这些条件在哪里失败。

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

一旦知道第 2 步中哪些条件失败以及原因,对第 3 步进行相关更改应该很简单。


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

findVectorOfMatchingChars 函数的分析:这个函数接受一个 possibleChar 并检查这个 char 是否接近(当所有 if 条件都通过时)与 vectorOfChars 的任何 possibleChar 匹配。如果有匹配,则将所有匹配存储在一起并返回结果

findVectorOfVectorsOfMatchingChars 函数分析:该函数从 vectorOfPossibleChars 中选取任何 possibleChar,并使用 findVectorOfMatchingChars 找到所有匹配的字符。如果找到合适的匹配项,此函数将使用 (vectorOfPossibleChars - matchedPossibleChars) 调用自身。

问题来了。

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

现在,假设我们有一个尽可能包含 A、B、C、D、X 的图,其中 X 足够接近 A、B、C、D 但 A、B、C、D 距离每个顶点足够远其他不被视为势均力敌。

现在让我们在这个 possibleChars vector 上应用 findVectorOfVectorsOfMatchingChars。

选项 1:如果我们先选择 X,我们找到 A,B,C,D 作为其匹配的 possibleChar,因此我们得到所有 possibleChar。

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

整改方案:

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

关于c++ - OpenCv:车牌识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37503548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com