OpenCV 车牌检测
- 级联分类器
- 算法流程
- 车牌检测
- 相关链接
级联分类器
假设我们需要识别汽车图像中车牌的位置,利用深度学习目标检测技术可以采取基于锚框的模型,但这需要在大量图像上训练模型。
但是,级联分类器可以作为预训练文件直接使用,我们可以使用它来识别汽车图像中车牌的位置。级联分类器由多个级联的分类器组成,每个分类器都是一个弱分类器(如 Haar
特征分类器)。级联分类器通过级联地应用这些弱分类器来逐步筛选出目标对象。
在级联分类器中,每个级别都有一个分类器,根据特征判别规则对输入图像进行分类。如果一个图像区域被当前级别的分类器判定为非目标,则该区域将被丢弃,不再参与后续的分类器判断。只有当一个图像区域通过了所有级别的分类器判断,才会被认定为目标对象。
这些分类器类似于卷积核,但与深度神经网络需要学习的卷积核不同,级联分类器采用的卷积核列表是经过事先标识和筛选的,只有当多数卷积核都对目标进行了正确分类时,才会给出良好的分类得分。例如,一个面部级联分类器有多达 6,000
个核来处理面部区域,其中一些可能的核如下所示:
这些级联分类器也被称为 Haar
级联分类器。
算法流程
接下来,利用预训练的级联分类器识别汽车图像中车牌的位置,算法流程如下:
- 导入级联分类器
- 将图像转换为灰度图像
- 指定图像中感兴趣对象的最小和最大比例
- 获取来自级联分类器的区域提议
- 在区域提议周围绘制边界框
车牌检测
(1) 获取车牌识别级联分类器,在 GitHub
中下载 cascade.xml 作为级联分类器。
(2) 加载图像和级联分类器:
import cv2
from matplotlib import pyplot as plt
plate_cascade = cv2.CascadeClassifier('cascade.xml')
image = cv2.imread("11.png", 1)
(3) 将图像转换为灰度图像:
image_gray = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
(4) 利用级联分类器检测车牌:
plates = plate_cascade.detectMultiScale(image_gray, 1.48, 2, minSize=(40, 40),maxSize=(1000, 100))
plate_cascade.detectMultiScale
返回级联卷积核具有高匹配度的所有可能矩形区域,用于确定图像中车牌的位置,我们还可以指定宽度、高度的最小和最大尺寸范围。
(5) 遍历车牌区域提议 (plates
),获取稍大于区域提议的区域:
image2 = image.astype('uint8')
for (x, y, w, h) in plates:
print(x,y,w,h)
x -= w * 0.14
w += w * 0.75
y -= h * 0.15
h += h * 0.3
cv2.rectangle(image2, (int(x), int(y)), (int(x + w), int(y + h)), (0, 255, 0), 10)
plt.imshow(cv2.cvtColor(image2, cv2.COLOR_BGR2RGB))
plt.show()
从上图可以看出,预训练的级联分类器可以准确识别车牌的位置。与道路车道检测类似,在车牌检测中,我们也可能会遇到算法在一组图片上无法正常工作的情况。
相关链接
OpenCV简介与图像处理基础
人脸检测详解
使用PyTorch构建神经网络
R-CNN模型详解