Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别
目录
Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之五 简单进行车牌检测和识别
一、简单介绍
二、简单进行车牌检测和识别实现原理
三、简单进行车牌检测和识别案例实现简单步骤
四、注意事项
一、简单介绍
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。
这里使用 Python 基于 OpenCV 进行视觉图像处理,......
OpenCV 提供了一些已经训练好的级联分类器,这些级联分类器以XML文件的方式保存在以下路径中:
...\Python\Lib\site-packages\cv2\data\
OpenCV提供了一些经过预训练的人脸检测器模型文件,这些文件通常包含在OpenCV的安装包中。你也可以在OpenCV的官方GitHub页面或者OpenCV官方网站的下载页面找到这些模型文件的下载链接。
一般来说,你可以从以下位置获取OpenCV的预训练模型文件:
OpenCV GitHub Release 页面:在 Releases · opencv/opencv · GitHub 找到你需要的版本,然后在下载的压缩包中找到位于 opencv\data 目录下的人脸检测器模型文件。
OpenCV 官方网站下载页面:访问 OpenCV 官方网站 Releases - OpenCV ,下载你需要的版本,并在相应的压缩包中查找人脸检测器模型文件。请确保下载与你使用的OpenCV版本兼容的模型文件。
二、简单进行车牌检测和识别实现原理
车牌检测和识别是计算机视觉领域的一项技术,用于自动识别车辆车牌上的信息。它通常包括两个主要步骤:
-
车牌检测:这一步骤旨在从图像或视频中准确地定位车牌的位置。车牌检测可以通过使用各种技术和算法来实现,例如使用基于特征的方法、基于深度学习的方法或级联分类器等。检测到车牌后,通常会将车牌区域用矩形框标出。
-
车牌识别:一旦车牌被成功检测到,下一步就是从检测到的车牌区域中提取出文字信息。这个过程通常使用光学字符识别(OCR)技术来实现,它能够将图像中的文字转换为可识别的文本。识别后的文本可以包括车牌号码、车牌所属地区等信息。
综合而言,车牌检测和识别技术可以自动地从图像或视频中提取出车辆的车牌信息,用于诸如交通管理、停车场管理、车辆监控等应用中。
该案例实现了使用 OpenCV 中的级联分类器检测车牌,并利用 Tesseract OCR 对车牌区域进行字符识别的功能。
实现原理:
- 首先,加载了一个预先训练好的车牌检测器级联分类器。
- 然后,读取图像并将其转换为灰度图像。
- 接下来,使用级联分类器检测车牌区域,并在检测到的车牌区域上应用 Tesseract OCR 进行字符识别。
- 最后,在原始图像上绘制检测到的车牌区域的矩形框,并显示识别的车牌号码。
实现方法:
- 使用 OpenCV 加载级联分类器,并调用
detectMultiScale
方法检测车牌区域。- 利用 Tesseract OCR 对车牌区域进行字符识别。
- 绘制矩形框和在图像上显示识别结果。
涉及到了以下几个关键函数:
cv2.CascadeClassifier()
- 功能: 加载级联分类器。
- 参数: 级联分类器文件的路径。
- 返回值: 级联分类器对象。
cv2.imread()
- 功能: 读取图像文件。
- 参数: 图像文件的路径。
- 返回值: 读取到的图像对象。
cv2.cvtColor()
- 功能: 将图像从一个颜色空间转换到另一个颜色空间。
- 参数: 待转换的图像对象,目标颜色空间的转换标志。
- 返回值: 转换后的图像对象。
cv2.CascadeClassifier.detectMultiScale()
- 功能: 检测图像中的目标对象。
- 参数: 图像对象、尺度因子、邻居数、最小尺寸等。
- 返回值: 检测到的目标对象的矩形区域。
pytesseract.image_to_string()
- 功能: 对图像中的文字进行识别。
- 参数: 待识别的图像对象,识别配置参数。
- 返回值: 识别结果的字符串。
cv2.rectangle()
- 功能: 在图像上绘制矩形框。
- 参数: 图像对象、矩形框的左上角坐标、右下角坐标、颜色、线条宽度等。
- 返回值: 绘制了矩形框的图像对象。
cv2.putText()
- 功能: 在图像上绘制文本。
- 参数: 图像对象、文本内容、文本位置、字体、字体大小、颜色、线条宽度等。
- 返回值: 绘制了文本的图像对象。
这些关键函数共同完成了车牌检测和识别的功能,通过级联分类器检测到车牌区域后,利用 Tesseract OCR 对车牌区域进行字符识别,并在原始图像上绘制矩形框和显示识别结果
三、简单进行车牌检测和识别案例实现简单步骤
环境:win 10,python ,opencv-python,pytesseract
1、下载安装 tesseract
下载最新的安装 exe ,双击按步骤安装即可
Index of /tesseract
2、安装完后,配置好 tesseract 环境
3、在 cmd 中测试环境是否安装成功
输入命令:tesseract -v
4、如果有需要可以下载配置一下 Tesseract 中文识别语言包
下载连接:tesseract_zh
将下载的chi_sim.traineddata文件复制到安装路径下的tessdata文件夹,如图所示:
5、编写代码
6、运行效果
7、具体代码
"""
简单进行车牌检测和识别
1、使用 OpenCV 加载级联分类器,并调用 detectMultiScale 方法检测车牌区域。
2、利用 Tesseract OCR 对车牌区域进行字符识别。
3、绘制矩形框和在图像上显示识别结果。
"""
import cv2
import pytesseract
def detect_license_plate(image_path, scale_factor=1.1, min_neighbors=5, min_size=(30, 30)):
"""
使用级联分类器检测车牌并绘制矩形框
:param image_path: (str) 输入图像的路径
:param scale_factor: (float) 每次图像尺寸减小的比例,默认为1.1
:param min_neighbors: (int) 每个候选矩形应该保留的邻居数,默认为5
:param min_size: (tuple) 矩形的最小尺寸,默认为(30, 30)
:return:
"""
# 参数安全校验
if not isinstance(image_path, str) or not image_path.strip():
raise ValueError("Invalid image path.")
if not isinstance(scale_factor, float) or scale_factor <= 1.0:
raise ValueError("Scale factor must be a float greater than 1.0.")
if not isinstance(min_neighbors, int) or min_neighbors <= 0:
raise ValueError("Min neighbors must be a positive integer.")
if not isinstance(min_size, tuple) or len(min_size) != 2 or min_size[0] <= 0 or min_size[1] <= 0:
raise ValueError("Min size must be a tuple of two positive integers.")
# 加载车牌检测器
plate_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_russian_plate_number.xml')
# 读取图像
image = cv2.imread(image_path)
# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测车牌
plates = plate_cascade.detectMultiScale(gray, scaleFactor=scale_factor, minNeighbors=min_neighbors,
minSize=min_size)
if len(plates) > 0:
for (x, y, w, h) in plates:
plate_img = gray[y:y + h, x:x + w] # 裁剪出车牌区域
plate_text = pytesseract.image_to_string(plate_img, config='--psm 8') # 使用Tesseract OCR进行字符识别
plate_text = plate_text.strip() # 去除空白字符
# 在原始图像上绘制车牌区域的矩形框
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 在图像上显示识别结果
cv2.putText(image, plate_text, (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
# 显示结果
cv2.imshow("License Plate Detection", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
else:
print("No license plate detected.")
# 测试车牌检测函数
if __name__ == "__main__":
image_path = "Images/CarPlate.jpeg"
detect_license_plate(image_path, scale_factor=1.077, min_neighbors=3)
四、注意事项
- 需要提前安装并配置 Tesseract OCR,并确保其能够识别正确的字符。
- 车牌检测的准确性可能受多种因素影响,包括图像质量、光照条件和车牌遮挡等。
- 可能需要根据实际情况调整级联分类器的参数,以提高车牌检测的准确性。
- 图像处理过程中需要考虑参数的安全性,例如确保图像路径的有效性以及参数的合法性等。