使用 Python 进行车牌识别

2025年3月17日 | 阅读 8 分钟

在以下教程中,我们将了解如何使用 Python 编程语言识别车牌。我们将利用 OpenCV 来识别车牌,并使用 Python 的 pytesseract 来从车牌中提取字符和数字。在本教程结束时,我们将构建一个自动识别车牌的 Python 程序。

了解自动车牌识别系统

自动车牌识别系统有各种形状和大小。

  1. 在可预测的车牌类型和受控照明条件下执行的 ANPR(自动车牌识别)可以使用基本的图像处理技术。
  2. 更高级的 ANPR 系统使用专用的目标检测器,如 HOG + 线性 SVM、SSD、YOLO 和 Faster R-CNN,来定位图像中的车牌。
  3. 最先进的 ANPR 软件使用循环神经网络(RNN)和长短期记忆网络(LSTM),以帮助更好地对车牌上的文本进行 OCR(光学字符识别)。
  4. 更高级的 ANPR 系统利用专门的神经网络架构,在 OCR 之前对图像进行预处理和清理,从而提高 ANPR 的准确性。

使自动车牌识别更加复杂的事实可能需要实时操作。

例如,让我们考虑一个安装在收费公路上的 ANPR 系统。它必须能够检测每辆经过车辆的车牌,对车牌上的字符进行 OCR,然后将这些数据存储在数据库中,以便向车主收取通行费。

一些复合因素使得 ANPR 极具挑战性,其中包括寻找一套可用于训练 ANPR 自定义模型的数据集。用于训练最先进模型的大型、稳健的 ANPR 数据集受到严格保护,很少(如果有的话)公开发布。

  1. 这些数据集包含与车辆、驾驶员和位置相关的敏感识别详细信息。
  2. ANPR 数据集整理起来很繁琐,需要令人难以置信的时间投入和工作人员小时数来解释。
  3. ANPR 与地方和联邦政府的合同往往非常合理。有价值的往往不是训练好的模型;而是某个特定公司整理的数据集。
  4. 出于同样的原因,我们将看到 ANPR 行业被收购,不是因为它们的 ANPR 系统,而是因为数据本身。

项目先决条件

我们将使用 Python OpenCV 库。它是一个用于机器学习的开源库,并为计算机视觉提供通用基础设施。我们还将使用 Pytesseract 进行项目。Pytesseract 是一个 Tesseract-OCR 引擎,用于读取图像类型并提取图像中可用的详细信息。

安装

我们可以使用 pip 安装程序通过以下语法安装 OpenCV 库:

语法

将遵循相同的程序来安装 Pytesseract 引擎。其语法如下所示:

语法

OpenCV 的特性

  1. 在下面的 Python 项目中,我们将利用 OpenCV 的以下特性来识别输入图像中的车牌:
  2. 高斯模糊:在这里,我们将使用高斯核进行图像平滑处理。该技术对于去除高斯噪声非常有效。OpenCV 为此任务提供了名为 GaussianBlur() 的函数。
  3. 形态学变换:这些是基于图像形状的操作,并在二值图像上进行处理。基本的形态学操作包括开运算、闭运算、腐蚀、膨胀等等。OpenCV 提供的一些函数如下所示:
    1. cv2.erode()
    2. cv2.dilate()
    3. cv2.morphologyEx()
  4. Sobel:在这里,我们将计算图像的导数。此功能对于基于计算机视觉的各种任务非常重要。借助这些导数,我们可以计算梯度,梯度中的更高变化表示图像中的显著变化。OpenCV 提供 Sobel() 函数来计算 Sobel 算子。
  5. 轮廓:轮廓是由所有连续的相同强度点组成的曲线。这些曲线对于对象识别非常有用。OpenCV 为此功能提供了 findContours() 函数。

理解 Python 代码

既然我们已经涵盖了项目的理论部分,那么让我们进入编码部分。为了更好地理解和清晰,我们将项目的整个源代码分为不同的步骤。

步骤 1:导入所需的模块

首先,我们必须导入 OpenCVpytessaract 以及 matplotlib、globOS

文件:anpr.py

注意:文件名称必须与车牌图像中的实际号码完全一致。例如,如果车牌号码是“FTY348U”,则图像文件名称将是“FTY348U.jpg”。

步骤 2:使用 Tesseract 引擎对车牌执行 OCR

对于以下步骤,我们必须借助 Tesseract 引擎对车牌执行 OCR。可以在以下代码片段中观察到相同的情况。

文件:anpr.py

说明

在上面的代码片段中,我们使用 OS 模块指定了车牌图像文件的路径。我们还定义了两个空列表,分别为 NP_listpredicted_NP。然后,我们使用 append() 函数将实际车牌追加到列表中。然后,我们使用 OpenCV 模块读取每个车牌图像文件,并将它们存储在 NP_img 变量中。然后,我们借助 Python 库包装器将每个车牌图像文件传递给 Tesseract OCR 引擎。然后,我们获得了车牌的 predicted_res,并将其追加到列表中,并与真实的车牌进行比较。

现在,既然我们已经预测了车牌,但我们不知道预测结果。因此,为了查看数据和预测结果,我们将进行一些可视化,如下所示。我们还将不借助任何核心函数来估计预测的准确性。

文件:anpr.py

输出

Original Number Plate    Predicted Number Plate      Accuracy
--------------------     -----------------------     --------
DL3CAM0857               DL3CAM0857                  100 %
MD06NYW                  MDOGNNS                     40 %
TN21TC706                TN21TC706                   100 %
TN63DB5481               TN63DB5481                  100 %
UP14DR4070               UP14DR4070                  100 %
W5KHN                    WSKHN                       80 %

说明

在上面的代码片段中,我们定义了一个计算预测准确性的函数。在该函数中,我们使用 for 循环遍历原始车牌列表和预测车牌列表,并检查它们是否匹配。我们还根据数字的长度检查了准确性,以获得更好和更合适的结果。

我们可以观察到 Tesseract OCR 引擎大多以 100% 的准确率正确预测所有车牌。Tesseract OCR 引擎对这些车牌的预测不正确,我们将对这些车牌文件应用图像处理技术,并将其再次传递给 Tesseract OCR。我们可以通过应用图像处理技术来提高 Tesseract 引擎对预测不正确的车牌的准确率。

步骤 3:图像处理技术

让我们考虑以下代码片段来理解图像处理技术。

文件:anpr.py

输出

Number Plate Recognition using Python

说明

在上面的代码片段中,我们从 matplotlib 库中导入了 image 模块,并使用 for 循环从指定文件夹中提取图像。然后,我们使用 imread() 函数读取提取的图像。然后,我们使用 matplotlib 库的 plot 模块向用户显示图像。

  1. 图像大小调整:我们可以借助 resize 将图像文件在水平和垂直方向上按 2 倍因子调整大小。
  2. 转换为灰度:然后,我们可以将调整大小的图像文件转换为灰度,以优化检测并大幅减少图像中可用的颜色数量,这将使我们能够轻松检测车牌。
  3. 图像去噪:我们可以使用高斯模糊技术对图像进行去噪。它使图像的边缘更清晰、更平滑,使字符更易于阅读。

让我们考虑以下示例来理解这一点。

文件:anpr.py

说明

在上面的代码片段中,我们使用 OpenCV 模块的一些工具来调整图像大小、将其转换为灰度并对图像进行去噪。

一旦完成上述步骤,我们就可以将转换后的车牌文件传递给 Tesseract OCR 引擎并查看预测结果。

可以在以下代码片段中观察到相同的情况。

文件:anpy.py

输出

W5KHN

说明

在上面的代码片段中,我们将最终处理的图像传递给 Tesseract OCR 引擎,以从车牌中提取号码。

同样,我们可以对所有其他准确率不是 100% 的车牌执行此图像处理。因此,车牌识别模型已准备就绪。