我开始做车牌识别,也是用字符切割和模板匹配,不仅成功率低,还十分麻烦。后把模块匹配改为SVM算法,结果好了一点。最好我决定用百度AL的paddleocr直接进行识别,用HSV来扫描车牌位置。
结果简单,实用。
直接上代码。下载好库,和图片路径就可以用了
import cv2
import numpy as np
import pytesseract
import matplotlib.pyplot as plt
from paddleocr import PaddleOCR
import os
os.environ['KMP_DUPLICATE_LIB_OK']='True'
#上面两行是为了防止调用paddleocr时出错,可以用也可以不用。
# 车牌检测函数
def detect_license_plate(image):
# 将图像转换为HSV颜色空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义蓝色的范围,这里采用了一个比较宽的范围
lower_blue = np.array([100, 50, 50])
upper_blue = np.array([130, 255, 255])
# 进行颜色分割
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 对二值图像进行形态学操作,以去除噪声和增强字符
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
# 查找轮廓
mask, contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 对轮廓进行筛选,选出可能的车牌轮廓
candidates = []
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
aspect_ratio = w / h
if 1.5 < aspect_ratio < 4 and h > 10 and w > 80:
candidates.append(contour)
# 如果没有找到车牌轮廓,返回None
if not candidates:
return None
# 选择最大的车牌轮廓
license_plate = max(candidates, key=cv2.contourArea)
# 使用灰度图像进行车牌分割
x, y, w, h = cv2.boundingRect(license_plate)
plate_image = cv2.cvtColor(image[y:y+h, x:x+w], cv2.COLOR_BGR2GRAY)
# 调用PaddleOCR进行车牌号码识别
ocr = PaddleOCR(lang='ch')
result = ocr.ocr(plate_image)
# 在原图上圈出车牌位置
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示原图和识别结果
cv2.imshow('Original Image', image)
print(result)
#for line in result:
# print(line[1][0])
cv2.waitKey(0)
cv2.destroyAllWindows()
# 测试
image=cv2.imread('C:/Users/dell/Pictures/Saved Pictures/100.png')#照片路径
detect_license_plate(image)
结果显示
![](https://img-blog.csdnimg.cn/img_convert/bbc57f0b2cfdad8d6e9701be29ec02b4.png)
![](https://img-blog.csdnimg.cn/img_convert/3c10b9b3b789c736dd5aa5980d472f77.png)
总结
paddlecor有自带的图片识别,用HSV来提取图片位置,判断有没有图片。最好,paddlecor比较难下载,自行要研究一下