OpenCv:车牌识别

时间:2016-05-28 20:37:41

标签: c++ opencv image-processing

我一直致力于基于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 个答案:

答案 0 :(得分:3)

您应首先调试以查看两个A,A失败的条件。

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

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

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

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

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

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

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

    现在,问题在于此。

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

    现在,假设我们有一个A,B,C,D,X作为可能的图形顶点,其中X足够接近A,B,C,D但是A,B,C,D远远超过每个其他不被视为近距离比赛。

    现在让我们在thisChars这个向量上应用findVectorOfVectorsOfMatchingChars。

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

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

    纠正解决方案:

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