社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何使用 Python 检测和识别车牌(附代码)

机器学习社区 • 2 年前 • 371 次点击  

推荐关注↓

来源:51CTO技术

原文链接:https://www.makeuseof.com/python-car-license-plates-detect-and-recognize/

车牌检测与识别技术用途广泛,可以用于道路系统、无票停车场、车辆门禁等。这项技术结合了计算机视觉和人工智能。

本文将使用Python创建一个车牌检测和识别程序。该程序对输入图像进行处理,检测和识别车牌,最后显示车牌字符,作为输出内容。


/ 01 /
创建Python环境

要轻松地完成本教程,您需要熟悉Python基础知识。应先创建程序环境。

在开始编程之前,您需要在环境中安装几个库。打开任何Python IDE,创建一个Python文件。在终端上运行命令以安装相应的库。您应该在计算机上预先安装Python PIP。

  • OpenCV-Python:您将使用这个库对输入图像进行预处理,并显示各个输出图像。
    pipinstallOpenCV-Python
  • imutils:您将使用这个库将原始输入图像裁剪成所需的宽度。
    pipinstallimutils
  • pytesseract:您将使用这个库提取车牌字符,并将它们转换成字符串。
    pipinstallpytesseract
    pytesseract库依赖Tesseract OCR引擎进行字符识别。


/ 02 /
如何在您的计算机上
安装Tesseract OCR?

Tesseract OCR是一种可以识别语言字符的引擎。在使用pytesseract库之前,您应该在计算机上安装它。步骤如下:


1. 打开任何基于Chrome的浏览器。
2. 下载Tesseract OCR安装程序。
3. 运行安装程序,像安装其他程序一样安装它。

准备好环境并安装tesseract OCR后,您就可以编写程序了。

导入库

首先导入在环境中安装的库。导入库让您可以在项目中调用和使用它们的函数。

  • importcv2
  • importimutils
  • importpytesseract


您需要以cv2形式导入OpenCV-Python库。使用与安装时相同的名称导入其他库。


获取输入

然后将pytesseract指向安装Tesseract引擎的位置。使用cv2.imread函数将汽车图像作为输入。将图像名称换成您在使用的那个图像的名称。将图像存储在项目所在的同一个文件夹中,以方便操作。
pytesseract.pytesseract.tesseract_cmd = 'C:\\Program Files\\Tesseract-OCR\\tesseract.exe'
original_image = cv2.imread('image3.jpeg')
左右滑动查看完整代码


您可以将下面的输入图像换成想要使用的图像。

预处理输入

将图像宽度调整为500像素,然后将图像转换成灰度图像,因为canny边缘检测函数只适用于灰度图像。最后,调用bilateralFilter函数以降低图像噪声。
original_image = imutils.resize(original_image, width=500 )
gray_image = cv2.cvtColor(original_image, cv2.COLOR_BGR2GRAY)
gray_image = cv2.bilateralFilter(gray_image, 11, 17, 17)
左右滑动查看完整代码

在输入端检测车牌

检测车牌是确定汽车上有车牌字符的那部分的过程。

(1)执行边缘检测

先调用cv2.Canny函数,该函数可自动检测预处理图像上的边缘。
edged_image = cv2.Canny(gray_image, 30,200)
我们将通过这些边缘找到轮廓。

(2)寻找轮廓

调用cv2.findContours函数,并传递边缘图像的副本。这个函数将检测轮廓。使用cv2.drawContours函数,绘制原始图像上已检测的轮廓。最后,输出所有可见轮廓已绘制的原始图像。
contours, new = cv2.findContours(edged_image.copy(), cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
img1 = original_image.copy()
cv2.drawContours(img1, contours, -1, (0, 255, 0), 3)
cv2.imshow("img1", img1)
左右滑动查看完整代码

该程序绘制它在汽车图像上找到的所有轮廓。



找到轮廓后,您需要对它们进行筛选,以确定最佳候选轮廓。


(3)筛选轮廓


根据最小面积30对轮廓进行筛选。忽略小于这个面积的轮廓,因为它们不太可能是车牌轮廓。复制原始图像,在图像上绘制前30个轮廓。最后,显示图像。
contours = sorted(contours, key = cv2.contourArea, reverse = True)[:30]
# stores the license plate contour
screenCnt = None
img2 = original_image.copy()

# draws top 30 contours
cv2.drawContours(img2, contours, -1, (0, 255, 0), 3)
cv2.imshow("img2", img2)
左右滑动查看完整代码


现在轮廓数量比开始时要少。唯一绘制的轮廓是那些近似含有车牌的轮廓。



最后,您需要遍历已筛选的轮廓,确定哪一个是车牌。


(4)遍历前30个轮廓


创建遍历轮廓的for循环。寻找有四个角的轮廓,确定其周长和坐标。存储含有车牌的轮廓的图像。最后,在原始图像上绘制车牌轮廓并加以显示。
count = 0
idx = 7

for c in contours:
    # approximate the license plate contour
    contour_perimeter = cv2.arcLength(c, True)
    approx = cv2.approxPolyDP(c, 0.018 * contour_perimeter, True)

    # Look for contours with 4 corners
    if len(approx) == 4:
        screenCnt = approx

        # find the coordinates of the license plate contour
        x, y, w, h = cv2.boundingRect(c)
        new_img = original_image [ y: y + h, x: x + w]

        # stores the new image
        cv2.imwrite('./'+str(idx)+'.png',new_img)
        idx += 1
        break

# draws the license plate contour on original image
cv2.drawContours(original_image , [screenCnt], -1, (0, 255, 0), 3)
cv2.imshow("detected license plate", original_image )
左右滑动查看完整代码

循环之后,程序已识别出含有车牌的那个轮廓。



识别检测到的车牌

识别车牌意味着读取已裁剪车牌图像上的字符。加载之前存储的车牌图像并显示它。然后,调用pytesseract.image_to_string函数,传递已裁剪的车牌图像。这个函数将图像中的字符转换成字符串。
# filename of the cropped license plate image
cropped_License_Plate = './7.png'
cv2.imshow("cropped license plate", cv2.imread(cropped_License_Plate))

# converts the license plate characters to string
text = pytesseract.image_to_string(cropped_License_Plate, lang='eng')
左右滑动查看完整代码


已裁剪的车牌如下所示。上面的字符将是您稍后在屏幕上输出的内容。



检测并识别车牌之后,您就可以显示输出了。

显示输出


这是最后一步。您将提取的文本输出到屏幕上。该文本含有车牌字符。
print("License plate is:", text)
cv2.waitKey(0)
cv2.destroyAllWindows()
程序的预期输出应该如下图所示:



车牌文本可以在终端上看到。



/ 03 /
磨砺您的Python技能


用Python检测和识别车牌是一个有意思的项目。它有挑战性,所以应该会帮助您学到关于Python的更多知识。

说到编程,实际运用是掌握一门语言的关键。为了锻炼技能,您需要开发有意思的项目。

(完)


欢迎大家加入机器学习社区技术交流群,加入方式非常简单,在下方二维码后台回复:加群,备注说明:你的研究方向,小助手拉你入群。

长按扫码,申请入群



推荐阅读

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/152952
 
371 次点击