如何使用OpenCV Python检测车牌?
我们将使用Haar级联分类器来检测图像中的车牌号码。Haar级联分类器是一种有效的目标检测方法。它是一种基于机器学习的方法。
要训练车牌分类器,该算法最初需要大量正图像(带有车牌的图像)和负图像(没有车牌的图像)。分类器会从这些正的和负的图像中训练。然后用它来检测其他图像中的物体(车牌)。我们可以使用已经训练好的haar级联来进行目标检测。
如何下载Haarcascade?
您可以在以下GitHub网址找到不同的Haarcascade:
https://github.com/opencv/opencv/tree/master/data/haarcascades
要下载俄罗斯车牌haarcascade,请单击 haarcascade_russian_plate_number.xml 文件。打开它的原始格式,右键单击并保存。
步骤
要在图像中检测车牌,我们可以按以下步骤进行 –
- 导入所需库。在以下所有示例中,所需的Python库是 OpenCV 。请确保您已经安装了它。
-
使用 cv2.imread() 读取输入图像。指定完整的图像路径。将图片转换成灰度图像。
-
为车牌检测初始化Haarcascade分类器对象 plate_cascade = cv2.CascadeClassifier() 。通过haar级联xml文件的完整路径。您可以使用haar级联文件 haarcascade_russian_plate_number.xml 来检测图像中的车牌。
-
使用 plate_cascade.detectMultiScale() 在输入图像中检测车牌。它以 (x,y,w,h) 格式返回检测到的车牌的坐标。
-
使用 cv2.rectangle() 在原始图像中绘制检测到的车牌周围的边界矩形。
-
显示带有绘制了车牌周围边界的图像。
让我们查看一些示例以获得更清晰的理解。
示例
在这个Python程序中,我们使用 haarcascade 检测输入图像中的车牌号码。
# 导入所需库
import cv2
import numpy as np
# 读取输入图像
img = cv2.imread("audi.jpg")
# 将输入图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 读取检测车牌的haarcascade
cascade = cv2.CascadeClassifier('haarcascades\haarcascade_russian_plate_number.xml')
# 检测车牌号码
plates = cascade.detectMultiScale(gray, 1.2, 5)
print('Number of detected license plates:', len(plates))
# 循环遍历所有车牌
for (x,y,w,h) in plates:
# 在车牌周围绘制边界矩形
cv2.rectangle(img, (x,y), (x+w, y+h), (0,255,0), 2)
gray_plates = gray[y:y+h, x:x+w]
color_plates = img[y:y+h, x:x+w]
# 保存检测到的车牌
cv2.imwrite('Numberplate.jpg', gray_plates)
cv2.imshow('Number Plate', gray_plates)
cv2.imshow('Number Plate Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
我们将使用下面这张图像作为 输入文件 进行本程序的运行 −
输出
执行后,将会产生以下 输出 −
Number of detected license plates: 1
我们得到以下的 输出 窗口−