58

背景

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

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

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

替代文字

替代文字

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

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

我找不到这方面的太多信息,但是报告末尾附近的文档中的图像显示了它的有效性。

其他约束

  • 用 C# 开发
  • 将项目仅限于英国车牌
  • 我可以选择要转换的图像作为演示

问题

我需要关于我应该专注于开发哪些转换技术以及哪些算法可以帮助我的建议。

编辑:新信息出现在续 - 车辆牌照检测

4

8 回答 8

15

您可以采取多种方法,但首先想到的策略是:

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

就像我说的,这是许多策略中的一种,但它是一种需要最少大量数学运算的策略……也就是说,如果您能找到适合您的 OCR 实现。

于 2011-01-16T19:54:38.310 回答
3

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

于 2011-01-16T20:01:16.520 回答
3

以下是我建议您执行此任务的方法。在这里阅读我的详细答案。

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

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

  4. 对结果图像设置阈值以获得二值图像。
  5. 使用合适的结构元素应用形态关闭操作。
  6. 找到结果图像的轮廓。
  7. 查找minAreaRect每个轮廓。根据纵横比和最小和最大面积选择矩形。
  8. 对于每个选定的轮廓,找到边缘密度。设置边缘密度的阈值,并选择超出该阈值的矩形作为可能的板块区域。
  9. 在此之后将保留几个矩形。您可以根据方向或您认为合适的任何标准过滤它们。
  10. adaptiveThreshold从原始(灰度)图像 之后的图像中剪切这些检测到的矩形部分并应用 OCR。
于 2016-05-30T10:38:33.410 回答
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) 添加到区域中的每个点并找出哪一个给出最大值)。

你对侵蚀做同样的事情(与上面非常相似)

现在开合是两者的组合

您可以首先将其视为执行膨胀,然后对开口进行侵蚀。

它说最后从原始图像中减去关闭,你应该有你的变换。

于 2011-01-16T19:56:47.700 回答
1

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

于 2011-01-16T21:58:18.523 回答
1

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

这个问题与你的问题有关:Algorithm to detect the presence of text on image

于 2011-01-18T00:59:24.333 回答
1

您还可以参考 自动车牌识别库此查询。这也将使您对如何处理事物以及现有解决方案有所了解。

但正如保罗所回答的那样,您应该首先尝试从完整图像中找到矩形车牌,然后对其进行二值化,然后使用可用的 OCR 库(推荐使用 Tesseract)

您可以参考此链接,该链接将帮助您找到矩形板。您需要使用 openCV 库,因此您不需要大量数学知识,但是对幕后发生的事情有基本的了解可以帮助您以更好的方式解决问题。

于 2016-03-03T18:58:32.430 回答
1

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

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

Video Open 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
  }
}

在此处输入图像描述

上图将返回以下内容 -

"plate": "284FH8"
"confidence": 90.601013
于 2018-11-27T01:09:28.270 回答