如何从图像中识别车辆牌照/号码牌(ANPR)?

72

我有一个网站,允许用户上传汽车图片,并希望设置隐私过滤器来检测车辆上的车牌并对其进行模糊处理。

模糊处理不是问题,但是否有库或组件(最好是开源的)可以帮助在照片中找到车牌?

注意事项:

  1. 我知道没有什么是完美的,这种类型的图像识别会提供错误的正面和负面结果。
  2. 我知道我们可以要求用户选择要模糊处理的区域,我们也将这样做,但问题特别是关于以编程方式查找该数据,因此“请让某个人检查每张图像”这样的答案无益处。
  3. 在英国,这种软件方法称为“自动车牌识别”,但我找不到任何库的实现。
  4. 任何编程语言都可以,尽管首选.NET。

你也可以尝试一下SimpleLPR http://www.warelogic.com - user308852
有没有任何网络服务可以做到这一点?发送图片当然是数据密集型的,但在发送之前它们可以被调整大小并设置为灰度。 - Somatik
11个回答

36

编辑: 我为此编写了一个Python脚本

由于您的目标是模糊(用于隐私保护),因此您基本上需要一个高召回率检测器作为第一步。以下是如何进行此操作的说明。其中包含的代码提示使用Python的OpenCV。

  1. 转换为灰度。
  2. 应用高斯模糊。

img = cv2.imread('input.jpg',1)
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
img_gray = cv2.GaussianBlur(img_gray, (5,5), 0)  

让输入图像如下所示。

enter image description here

  1. 应用Sobel滤波器以检测垂直边缘。
  2. 使用严格阈值或OTSU二值化对结果图像进行阈值处理。
cv2.Sobel(image, -1, 1, 0)
cv2.threshold() 
  • 使用适当的结构元素进行形态学闭合操作。(我使用了16x4作为结构元素)

  • se = cv2.getStructuringElement(cv2.MORPH_RECT,(16,4))
    cv2.morphologyEx(image, cv2.MORPH_CLOSE, se)  
    

    第5步后的结果图像。

    enter image description here

    1. 查找该图像的外轮廓。

    cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 
    
  • 对于每个轮廓,找到包围它的最小矩形(minAreaRect()).
  • 根据长宽比、最小和最大面积以及与水平线的夹角选择矩形。(我使用了2.2<=长宽比<=8, 500<=面积<=15000, 夹角<=45度)
  • 所有minAreaRect()都显示为橙色,满足我们条件的矩形是绿色的。

    enter image description here

    1. 此步骤可能会出现误检,可以使用边缘密度过滤。边缘密度定义为矩形中的白色像素数/总像素数。设置边缘密度阈值。(我使用了0.5)

    enter image description here

    1. 模糊检测到的区域。

    enter image description here

    您可以应用其他适当的过滤器来增加召回率和精度。检测也可以使用HOG+SVM进行训练以提高精度。


    这是很棒的工作,pyANPD.py库可以很好地检测区域,但您能否为我们这些非Python程序员指出如何对它们进行模糊处理? - fooquency
    你能在网页上使用这个吗?用户上传一张汽车照片,你需要提取出车牌号码。 - Xerri

    34

    5
    我必须说,那非常令人印象深刻。干得好。 - Ryan O'Neill
    尝试在x64机器上使用它,但很快发现自己陷入了DLL地狱。它应该能够与OpenCvSharp x64一起工作吗? - SteveCav
    接受的答案是一个纯链接,但该链接已经不存在了 :( - DFTR

    14

    在GitHub上有一个新的开源库,可以识别美国和欧洲车牌的自动号码识别系统(ANPR)。它看起来非常准确,并且应该能够准确地识别车牌区域。这是GitHub项目链接: https://github.com/openalpr/openalpr


    这是个好的! - MikeTeX

    10

    我找到了一个用Java编写的库:javaANPR,我也想要一个C#库。

    我需要一个系统,可以在视频摄像头拍摄到一些带有大号码的帆船时,识别这些帆船并在它们通过视频摄像头时发送一条tweet。


    我已经转换了几个类,但这需要一些时间。 - Ryan O'Neill
    逐行转换从来不是一件有趣或快速的事情。 - Bruce McLeod
    @Ryan,你完成转换了吗? - Rowland Shaw
    抱歉,不行。看起来很受欢迎,但仍然忙得不可开交。 - Ryan O'Neill
    这看起来不错... 如果你想让它在.NET上工作,你可以使用IKVM或者只是将其抽象成一个Web服务... - Mauricio Scheffer

    8

    我几个月前查过这个问题的谷歌,有相当多的论文涉及此主题,但我从未找到任何具体的开源实现。虽然有很多商业实现,但没有一个给出价格报价,所以它们可能非常昂贵。


    谢谢,之前我没有看到这些研究论文,可能是被谷歌弄瞎了眼睛。我会去查看它们的。 - Ryan O'Neill
    我决定将此标记为答案,因为虽然它没有提供开源解决方案,但它给了我足够的线索。 - Ryan O'Neill
    7
    如果你找到或者创建了一个开源解决方案,请告知我们! - Mauricio Scheffer
    http://licenseplate.sourceforge.net/ 我们还没有测试过它。 - Somatik
    @Somatik:你能把那个变成一个答案吗? - Mauricio Scheffer

    5

    3

    看看Java ANPR。免费的车牌识别技术...


    2

    是的,我在http://jocr.sourceforge.net/上使用gocr。它是一个命令行应用程序,您可以从您的应用程序中执行。我在我的一些应用程序中使用它。


    2

    我与OpenALPR进行了比较测试,但这个库远远不及它!我有15张图片用于测试,OpenALPR检测到了6张,而这个库一个也没检测出来。我猜测这个库非常依赖于摄像头的位置和光线条件。 - XMight

    2

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