📜  使用 OpenCV 和 Tesseract OCR 进行车牌识别(1)

📅  最后修改于: 2023-12-03 15:22:15.144000             🧑  作者: Mango

使用 OpenCV 和 Tesseract OCR 进行车牌识别

介绍

本文介绍使用 OpenCV 和 Tesseract OCR 对车牌进行识别的方法。OpenCV 是一个开源的计算机视觉库,Tesseract OCR是一个免费的OCR引擎,可用于识别印刷文本。

在这个项目中,我们将使用 OpenCV 图像处理技术来查找和提取车牌区域,然后使用 Tesseract OCR 引擎识别车牌上的文字。最终输出的结果是车牌上的文字信息,实现车牌识别。

步骤
1. 安装 OpenCV 和 Tesseract OCR 库

在使用 OpenCV 和 Tesseract OCR 进行车牌识别前,我们需要先安装这两个库。

安装 OpenCV

安装 OpenCV 的方法因操作系统而异。在 Ubuntu 系统中,可以使用以下命令进行安装:

$ sudo apt-get install libopencv-dev

在 Windows 系统下,可以从 OpenCV 的官网上下载安装包进行安装。

安装 Tesseract OCR

Tesseract OCR 也可以根据操作系统进行安装。在 Ubuntu 系统中,可以使用以下命令进行安装:

$ sudo apt-get install tesseract-ocr

在 Windows 系统下,可以从 Tesseract OCR 的官网上下载安装包进行安装。

2. 车牌区域检测和提取

在这个步骤中,我们将使用 OpenCV 图像处理技术来查找车牌区域并提取出来。

# 导入 OpenCV 库
import cv2

# 读取车牌图片
img = cv2.imread('car_plate.jpg')

# 将原图转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 对灰度图进行高斯模糊
gray_blur = cv2.GaussianBlur(gray, (5, 5), 0)

# 使用 Canny 边缘检测算法进行边缘检测
edges = cv2.Canny(gray_blur, 150, 200)

# 查找轮廓并选择最大的轮廓
_, contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

contour_sizes = [(cv2.contourArea(contour), contour) for contour in contours]
biggest_contour = max(contour_sizes, key=lambda x: x[0])[1]

# 绘制轮廓
cv2.drawContours(img, [biggest_contour], -1, (0, 255, 0), 3)

# 提取车牌区域图片
x, y, w, h = cv2.boundingRect(biggest_contour)
plate_image = gray[y:y + h, x:x + w]

在上面的代码中,我们首先使用 cv2.imread() 函数读取待识别的车牌图片。然后,我们将该图片转换为灰度图,再对灰度图进行高斯模糊。接下来,我们使用 Canny 边缘检测算法进行边缘检测。然后,在边缘检测的结果中,我们查找出最大的轮廓,即车牌所在的区域。使用 cv2.drawContours() 函数绘制出车牌的轮廓,方便我们进行调试。

最后,我们使用 cv2.boundingRect() 函数提取车牌区域图片,并将其保存为 plate_image

3. 车牌文字识别

在车牌区域检测和提取步骤中,我们已经得到了车牌区域图片。在这个步骤中,我们将使用 Tesseract OCR 引擎来识别车牌上的文字。

# 导入 Pytesseract 库
import pytesseract

# 设置 Tesseract OCR 路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 车牌文字识别
plate_text = pytesseract.image_to_string(plate_image)

# 打印识别结果
print('Plate Text: ', plate_text)

在上面的代码中,我们首先导入 Pytesseract 库,然后设置 Tesseract OCR 引擎的路径。最后,我们使用 pytesseract.image_to_string() 函数对车牌区域图片进行文字识别,并将识别结果保存为 plate_text

4. 完整代码

下面是完整的识别车牌上文字的代码:

# 导入 OpenCV 和 Pytesseract 库
import cv2
import pytesseract

# 设置 Tesseract OCR 路径
pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

# 读取车牌图片
img = cv2.imread('car_plate.jpg')

# 将原图转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 对灰度图进行高斯模糊
gray_blur = cv2.GaussianBlur(gray, (5, 5), 0)

# 使用 Canny 边缘检测算法进行边缘检测
edges = cv2.Canny(gray_blur, 150, 200)

# 查找轮廓并选择最大的轮廓
_, contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

contour_sizes = [(cv2.contourArea(contour), contour) for contour in contours]
biggest_contour = max(contour_sizes, key=lambda x: x[0])[1]

# 绘制轮廓
cv2.drawContours(img, [biggest_contour], -1, (0, 255, 0), 3)

# 提取车牌区域图片
x, y, w, h = cv2.boundingRect(biggest_contour)
plate_image = gray[y:y + h, x:x + w]

# 车牌文字识别
plate_text = pytesseract.image_to_string(plate_image)

# 打印识别结果
print('Plate Text: ', plate_text)
5. 结果展示

最终的识别结果如下图所示:

识别结果

总结

本文介绍了使用 OpenCV 和 Tesseract OCR 进行车牌识别的方法。我们首先使用 OpenCV 实现车牌区域检测和提取,并将其保存为图片。然后,我们使用 Tesseract OCR 引擎对车牌区域图片进行文字识别,以获得车牌上的文字信息。通过这个项目,我们不仅学习了 OpenCV 和 Tesseract OCR 这两个强大的计算机视觉工具,还可以将其应用于实际场景中。