OpenCv:车牌识别

4
我一直在使用基于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);
}}

AND

    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
    }

非常感谢您的提前帮助。

1个回答

3

首先需要调试以查看哪些条件导致两个A,A失败。

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

  2. 在您提供的第二段代码中,将if语句的语法从 if(condition1 && cond2 &&...) 更改为语法 if(condition1) {if(codition2) {....}}。这会告诉您这些条件失败的位置。

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

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


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

对findVectorOfMatchingChars函数的分析:此函数接受一个possibleChar并检查该字符是否与vectorOfChars中的任何possibleChar匹配(当所有if条件通过时)。如果有匹配,将所有匹配项存储在一起并返回结果。

对findVectorOfVectorsOfMatchingChars函数的分析:此函数从vectorOfPossibleChars中选择任何possibleChar,并使用findVectorOfMatchingChars找到它的所有匹配项。如果找到了好的匹配项,此函数会使用(vectorOfPossibleChars - matchedPossibleChars)调用自身。

现在,问题来了。

假设每个possibleChar都是图G的一个顶点,如果它们满足findVectorOfMatchingChars函数中定义的条件,则两个possibleChar之间存在一条边。

现在,假设我们有一个具有A、B、C、D、X作为可能的字符顶点的图,其中X足够接近A、B、C、D,但A、B、C、D彼此之间距离太远,不能被视为紧密匹配。

现在让我们在这个可能字符的向量上应用findVectorOfVectorsOfMatchingChars。

选项1:如果我们首先选择X,我们会发现A、B、C、D是其匹配的可能字符,因此我们得到所有可能的字符。

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

纠正解决方案:

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

谢谢你的回答!但是你说的重新初始化AA是什么意思?你能再具体一点吗?非常感谢。 - user1814210
@user1814210:请查看我的编辑答案。请忽略我之前提供的重新初始化想法。对此我很抱歉。更新后的答案显示了代码错误,并建议您可以采取哪些方法。请记住,您对条件所做的任何更改都不应基于单个图像。您应该使用足够大的数据库,并通过查看整个数据库上准确性的增加来测试您的更改。 - saurabheights
非常感谢。虽然我仍然无法弄清楚。 - user1814210
嗨,运行两个for循环,并对每一对possibleChar应用if条件进行匹配,看看为什么任意两个possibleChar不匹配。分析和研究它,这样你就可以构建自己的算法,或者调整你正在使用的算法。祝你好运。 - saurabheights

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接