识别车牌是基于摄像头的安防系统中一项至关重要的任务。我们可以利用一些计算机视觉技术从图像中提取车牌,然后使用光学字符识别(OCR)来识别车牌号。在这里,我将引导大家完成整个任务流程。
环境要求:
> opencv-python >= 3.4.x
> numpy >= 1.17.2
> skimage >= 0.16.2
> tensorflow >= 2.x.
> imutils >= 0.5.3
.
示例:
输入:
输出:
29A33185
!image实施思路:
- 在图像中找到所有轮廓。
- 找到每个轮廓的边界矩形。
- 将每个边界矩形的长宽比和面积与标准车牌进行比较和验证。
- 在经过验证的轮廓内部应用图像分割,以查找其中的字符。
- 使用 OCR 识别字符。
方法步骤:
1. 为了减少噪声,我们需要先使用<a href="https://docs.opencv.org/4.x/d4/d13/tutorialpyfiltering.html">高斯模糊处理输入图像,然后将其转换为灰度图。
2. 在图像中查找垂直边缘。
3. 为了显示车牌区域,我们必须对图像进行二值化。为此,我们在垂直边缘图像上应用大津阈值法。在其他阈值处理方法中,我们需要手动选择一个阈值值来对图像进行二值化,而大津阈值法会自动确定该值。
4. 对阈值处理后的图像应用闭运算形态学变换。闭运算对于填充阈值图像中白色区域之间的小黑色区域非常有用。它能显示出车牌的矩形白色方框。
5. 为了检测车牌,我们需要在图像中查找轮廓。在查找轮廓之前对图像进行二值化和形态学处理非常重要,这样可以在图像中找到更相关且数量更少的轮廓。如果你在原始图像上绘制所有提取的轮廓,它看起来会是这样的:
6. 现在,找到每个轮廓所包围的<a href="https://docs.opencv.org/2.4/modules/imgproc/doc/structuralanalysisandshapedescriptors.html?highlight=minarearect#minarearect">最小面积矩形并验证它们的长宽比和面积。我们定义了车牌的最小和最大面积分别为 4500 和 30000。
7. 现在,在验证后的区域内查找轮廓,并验证该区域内最大轮廓的边界矩形的长宽比和面积。通过验证后,你将获得一个完美的车牌轮廓。现在从原始图像中提取该轮廓。你将得到车牌的图像:
!image这一步是通过 PlateFinder 类中的 clean_plate 和 ratioCheck 方法执行的。
8. 为了精确识别车牌上的字符,我们需要应用图像分割。第一步是从车牌图像的 HSV 格式中提取 Value(明度)通道。
9. 现在对车牌的 Value 通道图像应用自适应阈值处理以对其进行二值化并显示字符。车牌图像的不同区域可能具有不同的光照条件,在这种情况下,自适应阈值处理更适合进行二值化,因为它根据周围区域像素的亮度为不同区域使用不同的阈值。
10. 二值化后,对图像应用按位非操作,以查找图像中的连通分量,以便我们可以提取字符候选。
11. 构建一个掩码以显示所有字符分量,然后在掩码中查找轮廓。提取轮廓后,取最大的一个,找到其边界矩形并验证长宽比。
12. 验证长宽比后,找到轮廓的凸包并将其绘制在字符候选掩码上。
13. 现在,在字符候选掩码中查找所有轮廓,并从车牌的 Value 阈值图像中提取这些轮廓区域,你将分别获得所有字符。
步骤 8 到 13 是由 segment_chars 函数执行的,你可以在下面的完整源代码中找到该函数。用于步骤 6 到 13 中函数的驱动代码已编写在…