什么是车牌检测的好算法?

时间:2011-01-16 19:40:21

标签: c# image computer-vision ocr object-detection

背景

对于我在大学的最终项目,我正在开发车辆牌照检测应用程序。我认为自己是一名中级程序员,但是我的数学知识在中学以上缺乏任何东西,这使得生成正确的公式比它应该更难。

我花了很多时间查阅学术论文,例如:

说到数学,我迷路了。由于这种测试,各种图形图像被证明是有效的,例如:

alt text

alt text

然而,这种方法仅适用于该特定图像,如果将这些技术应用于不同的图像,我肯定会发生较差的转换。我读过一个名为“底帽形态变换”的公式,它执行以下操作:

  

基本上,变换保留了图片的所有暗部细节,并消除了其他一切(包括更大的暗区和亮区)。

我找不到很多关于此的信息,但是报告末尾附近的文档中的图像显示了它的有效性。

其他约束

  • 用C#开发
  • 仅将项目限制在英国注册牌照
  • 我可以选择要转换为演示的图像

问题

我需要建议我应该关注哪些转换技术,以及哪些算法可以帮助我。

编辑:Continued - Vehicle License Plate Detection

上的新信息

8 个答案:

答案 0 :(得分:13)

您可以采取多种方法,但首先要考虑的策略是:

  • 发现/研究:确定您可能需要识别的颜色和字体集。如果您的样本图片代表了大多数英国版块,那么您的工作将变得更加容易。例如。简单,单一的字体和白色背景上的黑色字体
  • 代码:尝试识别图像的矩形区域,其中颜色主要是白色和黑色。这不是一个非常严重的数学问题,它应该让你专注于车牌区域。
  • 代码:对您的子区域进行一些清理,例如转换为纯黑色和白色(单色),并可能缩放/转换为漂亮,紧密的矩形。
  • 使用API​​:接下来在您选择的子图像区域使用现有的OCR(光学字符识别)算法,看看您是否可以阅读文本。

就像我说的那样,这是许多策略中的一种策略,但我想到的是需要最少量的数学运算......就是如果你能找到适合你的OCR实现。

答案 1 :(得分:3)

几年前我在Java做过一个类似的项目,首先我应用了Sobel operator,然后用一个盘子的图像掩盖了所有图像(同时应用了Sobel算子)。最大重合区域是板的位置。然后将OCR应用于所选区域以获取数字。

答案 2 :(得分:3)

以下是我建议您应该执行此任务的方法。阅读我的详细答案here

  1. 转换为灰度。
  2. 使用3x3或5x5滤镜的高斯模糊。
  3. 应用Sobel滤镜查找垂直边缘。

    Sobel(gray, dst, -1, 1, 0)

  4. 对结果图像进行阈值处理以获得二进制图像。
  5. 使用合适的结构元素进行形态学闭合操作。
  6. 查找生成图像的轮廓。
  7. 查找每个轮廓的minAreaRect。根据纵横比,最小和最大面积选择矩形。
  8. 对于每个选定的轮廓,找到边缘密度。设置边缘密度的阈值,并选择超出该阈值的矩形作为可能的板区域。
  9. 此后几乎没有矩形。您可以根据方向或您认为合适的任何标准对其进行过滤。
  10. 在原始(灰度)图像的adaptiveThreshold之后从图像中剪切这些检测到的矩形部分并应用OCR。

答案 3 :(得分:1)

它告诉你究竟如何计算底帽变换(看起来像一个倒置的渐变阈值变换给我)。

首先要做的是实现两种形态函数的膨胀和侵蚀。

要做到这一点,你需要你的f和b然后你在一个保持最大值的点上计算图像的一个小区域的函数。

(f ⊕ b)(s, t) = max{f (s − x, t − y) + b(x, y)
|(s − x), (t − y) ∈ Df ; (x, y)∈Db}

这就是说,在域区域中的所有点上取表达式的最大值(例如以点(s,t)为中心的小矩形。

简单的伪代码将是

max = -infinity // for the point (s,t) on the image, must compute this for all points
for(x = -5 to 5)
for(y = -5 to 5)
max = Max(max, f(s - x, t - y) + b(x,y))

实际上我们现在有了一个最大值的新图像。

它实际上非常简单,所以不要让它变得比它更难(我们只是将b(x,y)添加到区域中的每个点并找出哪一个给出最大值)。

你对侵蚀做了同样的事情(非常类似于上面)

现在开幕式和闭幕式是两个

的组成

你可以先把它想象为扩张,然后是开口的侵蚀。

它说最后从原始图像中减去结束,你应该进行转换。

答案 4 :(得分:1)

英国已经有一个系统可以做到这一点。我记得看到一个电视节目,他们证明他们可以在10分钟内在伦敦找到一辆车(假设他们知道号码并且汽车正在开车) 阅读维基百科可以为您提供开始思考问题所需的指示: http://en.wikipedia.org/wiki/Automatic_number_plate_recognition

答案 5 :(得分:1)

如果您对检测到牌照的存在感兴趣(而不是识别它),您应该查看图像中的文本检测,因为它与您正在做的事情有关。

此问题与您的问题有关:Algorithm to detect presence of text on image

答案 6 :(得分:1)

你也可以参考 Automatic License Plate Recognition library& this query。这也将为您提供有关如何处理事物以及现有解决方案的一些想法。

但正如保罗所回答的那样,您应首先尝试从完整图像中找到矩形数字牌,然后将其二值化,然后使用可用的OCR库(建议使用Tesseract)

您可以参考此link,它将帮助您找到矩形板。你需要使用openCV库,所以你不需要很多数学,但是基本了解幕后发生的事情可以帮助你更好地解决问题。

答案 7 :(得分:1)

我建议为此使用服务或第三方。 Open ALPR,提供了一个非常准确的开源软件包。

打开ALPR-https://www.openalpr.com/

视频打开ALPR演示

https://www.youtube.com/watch?v=E-U_H9EbW60

或者您可以使用API​​-

Macgyver计算机视觉API

https://askmacgyver.com/explore/program/license-plate-recognition/3X5D3d2k

在此API中,您只需向--

https://macgyver.services

有效负载示例

{
id: "3X5D3d2k",
key: "free",
data: {
    "image_url": "https://storage.googleapis.com/marketing-files/program-markdown-assets/license-detection/license-plate.jpg",
    "country": "us",
    "numberCandidates": 2
  }
}

enter image description here

上面的图像将返回以下内容-

"plate": "284FH8"
"confidence": 90.601013