【问题标题】:OpenCv: License Plate RecognitionOpenCv:车牌识别
【发布时间】:2016-05-28 20:37:41
【问题描述】:

我一直致力于基于 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
    }

非常感谢。

【问题讨论】:

    标签: c++ opencv image-processing


    【解决方案1】:

    你应该先调试看看这两个A、A在什么条件下失败了。

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

    2. 在您提供的第二个代码 sn-p 中,将 if 语句的语法从 if(condition1 &amp;&amp; cond2 &amp;&amp;...) 语法 if(condition1) {if(codition2) {....}}。这将告诉您这些条件在哪里失败。

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

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


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

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

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

    现在,问题来了。

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

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

    现在让我们对这个 possibleChars 向量应用 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. 创建一个图形类并将其中的每个可能字符注册为顶点。使用 findVectorOfMatchingChars 中定义的条件在每对顶点之间创建边。
    2. 您可能需要自定义条件以合并其他顶点和 2 A 顶点之间的边。为此,您应该使用更多数据集,以便您创建或更改阈值的条件不会太笼统,无法容纳非牌照字符。
    3. 在图中查找连通树以查找所有字符。这可能会添加所有可能的字符。为避免这种情况,您可以使用加权边缘限制加法。

    【讨论】:

    • 感谢您的回答!!但是你对AA重新初始化是什么意思?请你帮我说得更具体一点。非常感谢。
    • @user1814210 :请参阅我编辑的答案。请丢弃我给出的重新初始化想法。对此感到抱歉。更新后的答案显示了代码错误并建议您可以采取哪些道路。请记住,您对条件所做的任何更改都不应基于单个图像。您应该使用足够大的数据库并通过查看整个数据库的准确性提高来测试您的更改。
    • 非常感谢。虽然我还是想不通。
    • 嗨,运行两个 for 循环并将这些 if 条件应用于每对 possibleChar 的匹配,看看为什么任何两个可能的 Char 不匹配。分析和研究它,这样您就可以构建自己的算法,或者使用您正在使用的算法。祝你好运。
    猜你喜欢
    • 2014-11-04
    • 2010-12-30
    • 2020-07-24
    • 2021-03-27
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    相关资源
    最近更新 更多