# 导入所需模块
import cv2
from matplotlib import pyplot as plt
import os
import numpy as np
# plt显示彩色图片
def plt_show0(img):
#cv2与plt的图像通道不同:cv2为[b,g,r];plt为[r, g, b]
b,g,r = cv2.split(img)
img = cv2.merge([r, g, b])
plt.imshow(img)
plt.show()
# plt显示灰度图片
def plt_show(img):
plt.imshow(img,cmap='gray')
plt.show()
# 图像去噪灰度处理
def gray_guss(image):
image = cv2.GaussianBlur(image, (3, 3), 0)
gray_image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
return gray_image
# 读取待检测图片
origin_image = cv2.imread('D:/image/car2.jpg')
# 复制一张图片,在复制图上进行图像操作,保留原图
image = origin_image.copy()
# 图像去噪灰度处理
gray_image = gray_guss(image)
# x方向上的边缘检测(增强边缘信息)
Sobel_x = cv2.Sobel(gray_image, cv2.CV_16S, 1, 0)
absX = cv2.convertScaleAbs(Sobel_x)
image = absX
# 图像阈值化操作——获得二值化图
ret, image = cv2.threshold(image, 0, 255, cv2.THRESH_OTSU)
# 显示灰度图像
plt_show(image)
# 形态学(从图像中提取对表达和描绘区域形状有意义的图像分量)——闭操作
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (30, 10))
image = cv2.morphologyEx(image, cv2.MORPH_CLOSE, kernelX,iterations = 1)
# 显示灰度图像
plt_show(image)
# 腐蚀(erode)和膨胀(dilate)
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (50, 1))
kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20))
#x方向进行闭操作(抑制暗细节)
image = cv2.dilate(image, kernelX)
image = cv2.erode(image, kernelX)
#y方向的开操作
image = cv2.erode(image, kernelY)
image = cv2.dilate(image, kernelY)
# 中值滤波(去噪)
image = cv2.medianBlur(image, 21)
# 显示灰度图像
plt_show(image)
# 获得轮廓
contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for item in contours:
rect = cv2.boundingRect(item)
x = rect[0]
y = rect[1]
weight = rect[2]
height = rect[3]
# 根据轮廓的形状特点,确定车牌的轮廓位置并截取图像
if (weight > (height * 3)) and (weight < (height * 4.5)):
image = origin_image[y:y + height, x:x + weight]
plt_show(image)
#车牌字符分割
# 图像去噪灰度处理
gray_image = gray_guss(image)
# 图像阈值化操作——获得二值化图
ret, image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_OTSU)
plt_show(image)
#膨胀操作,使“苏”字膨胀为一个近似的整体,为分割做准备
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (4, 4))
image = cv2.dilate(image, kernel)
plt_show(image)
# 查找轮廓
contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
words = []
word_images = []
#对所有轮廓逐一操作
for item in contours:
word = []
rect = cv2.boundingRect(item)
x = rect[0]
y = rect[1]
weight = rect[2]
height = rect[3]
word.append(x)
word.append(y)
word.append(weight)
word.append(height)
words.append(word)
# 排序,车牌号有顺序。words是一个嵌套列表
words = sorted(words,key=lambda s:s[0],reverse=False)
i = 0
#word中存放轮廓的起始点和宽高
for word in words:
# 筛选字符的轮廓
if (word[3] > (word[2] * 1.5)) and (word[3] < (word[2] * 5.5)) and (word[2] > 10):
i = i+1
if word[2] < 15:
splite_image = image[word[1]:word[1] + word[3], word[0]-word[2]:word[0] + word[2]*2]
else:
splite_image = image[word[1]:word[1] + word[3], word[0]:word[0] + word[2]]
word_images.append(splite_image)
print(i)
print(words)
for i,j in enumerate(word_images):
plt.subplot(1,7,i+1)
plt.imshow(word_images[i],cmap='gray')
plt.show()
#模版匹配
# 准备模板(template[0-9]为数字模板;)
template = ['0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z',
'藏','川','鄂','甘','赣','贵','桂','黑','沪','吉','冀','津','晋','京','辽','鲁','蒙','闽','宁',
'青','琼','陕','苏','皖','湘','新','渝','豫','粤','云','浙']
# 读取一个文件夹下的所有图片,输入参数是文件名,返回模板文件地址列表
def read_directory(directory_name):
referImg_list = []
for filename in os.listdir(directory_name):
referImg_list.append(directory_name + "/" + filename)
return referImg_list
# 获得中文模板列表(只匹配车牌的第一个字符)
def get_chinese_words_list():
chinese_words_list = []
for i in range(34,64):
#将模板存放在字典中
c_word = read_directory('D:/refer1/'+ template[i])
chinese_words_list.append(c_word)
return chinese_words_list
chinese_words_list = get_chinese_words_list()
# 获得英文模板列表(只匹配车牌的第二个字符)
def get_eng_words_list():
eng_words_list = []
for i in range(10,34):
e_word = read_directory('D:/refer1/'+ template[i])
eng_words_list.append(e_word)
return eng_words_list
eng_words_list = get_eng_words_list()
# 获得英文和数字模板列表(匹配车牌后面的字符)
def get_eng_num_words_list():
eng_num_words_list = []
for i in range(0,34):
word = read_directory('D:/refer1/'+ template[i])
eng_num_words_list.append(word)
return eng_num_words_list
eng_num_words_list = get_eng_num_words_list()
# 读取一个模板地址与图片进行匹配,返回得分
def template_score(template,image):
#将模板进行格式转换
template_img=cv2.imdecode(np.fromfile(template,dtype=np.uint8),1)
template_img = cv2.cvtColor(template_img, cv2.COLOR_RGB2GRAY)
#模板图像阈值化处理——获得黑白图
ret, template_img = cv2.threshold(template_img, 0, 255, cv2.THRESH_OTSU)
# height, width = template_img.shape
# image_ = image.copy()
# image_ = cv2.resize(image_, (width, height))
image_ = image.copy()
#获得待检测图片的尺寸
height, width = image_.shape
# 将模板resize至与图像一样大小
template_img = cv2.resize(template_img, (width, height))
# 模板匹配,返回匹配得分
result = cv2.matchTemplate(image_, template_img, cv2.TM_CCOEFF)
return result[0][0]
# 对分割得到的字符逐一匹配
def template_matching(word_images):
results = []
for index,word_image in enumerate(word_images):
if index==0:
best_score = []
for chinese_words in chinese_words_list:
score = []
for chinese_word in chinese_words:
result = template_score(chinese_word,word_image)
score.append(result)
best_score.append(max(score))
i = best_score.index(max(best_score))
# print(template[34+i])
r = template[34+i]
results.append(r)
continue
if index==1:
best_score = []
for eng_word_list in eng_words_list:
score = []
for eng_word in eng_word_list:
result = template_score(eng_word,word_image)
score.append(result)
best_score.append(max(score))
i = best_score.index(max(best_score))
# print(template[10+i])
r = template[10+i]
results.append(r)
continue
else:
best_score = []
for eng_num_word_list in eng_num_words_list:
score = []
for eng_num_word
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
在这个实战项目中,我们将利用Python结合OpenCV库来实现车牌识别功能。整个过程涵盖图像预处理、车牌定位、车牌字符分割以及模板匹配识别等关键步骤,对智能交通、车辆管理等实际应用领域具有显著价值。 首先,我们需要对获取的车辆图像进行预处理,这通常包括灰度化、二值化、滤波去噪等操作,以便更好地凸显车牌区域。接着,利用OpenCV的图像处理功能,我们可以实现车牌定位。这通常涉及边缘检测、轮廓查找以及形态学操作,以准确提取出车牌区域。 在车牌定位完成后,我们需要对车牌进行字符分割。这一步的目的是将车牌中的每个字符独立提取出来,以便后续进行识别。常用的字符分割方法包括垂直投影法、滑动窗口法等。通过这些方法,我们可以将车牌图像划分为多个字符区域。 最后,我们利用模板匹配的方法对分割出的字符进行识别。通过预先准备的字符模板库,我们将每个字符区域与模板库中的字符进行匹配,从而确定字符的具体内容。经过这一过程,我们可以得到完整的车牌号码。 该项目不仅可用于车牌识别技术的学习和研究,还具有实际应用价值。通过自动识别车牌号码,我们可以实现车辆追踪、违章查询、停车场管理等功能,从而提高交通管理的
资源推荐
资源详情
资源评论
收起资源包目录
【Python实战】-Python+Opencv是实现车牌自动识别(源码+数据+字符匹配模板) (2000个子文件)
car1.jpg 112KB
car3.jpg 109KB
car2.jpg 78KB
car.jpg 24KB
鄂_17.jpg 1KB
鄂_35.jpg 1KB
豫_27.jpg 1KB
鄂_52.jpg 1KB
豫_29.jpg 1KB
豫_53.jpg 1KB
豫_55.jpg 1KB
豫_62.jpg 1KB
豫_67.jpg 1KB
豫_54.jpg 1KB
豫_57.jpg 1KB
豫_48.jpg 1KB
鄂_20.jpg 1KB
鄂_6.jpg 1KB
z36.jpg 1KB
z94.jpg 1KB
黑_24.jpg 1KB
z16.jpg 1KB
鄂_26.jpg 1KB
n21.jpg 1KB
豫_58.jpg 1KB
鄂_30.jpg 1KB
黑_13.jpg 1KB
黑_11.jpg 1KB
鄂_22.jpg 1KB
黑_37.jpg 1KB
浙_36.jpg 1KB
浙_38.jpg 1KB
浙_23.jpg 1KB
z72.jpg 1KB
鄂_14.jpg 1KB
鄂_15.jpg 1KB
豫_28.jpg 1KB
豫_59.jpg 1KB
鄂_18.jpg 1KB
z100.jpg 1KB
z42.jpg 1KB
豫_39.jpg 1KB
豫_56.jpg 1KB
浙_37.jpg 1KB
鄂_10.jpg 1KB
鄂_8.jpg 1KB
豫_49.jpg 1KB
豫_45.jpg 1KB
豫_42.jpg 1KB
豫_43.jpg 1KB
豫_34.jpg 1KB
豫_38.jpg 1KB
豫_44.jpg 1KB
豫_33.jpg 1KB
豫_32.jpg 1KB
豫_30.jpg 1KB
豫_46.jpg 1KB
豫_31.jpg 1KB
豫_65.jpg 1KB
豫_50.jpg 1KB
豫_35.jpg 1KB
豫_41.jpg 1KB
豫_36.jpg 1KB
豫_47.jpg 1KB
豫_40.jpg 1KB
黑_34.jpg 1KB
鄂_40.jpg 1KB
鄂_34.jpg 1KB
鄂_42.jpg 1KB
豫_60.jpg 1KB
黑_15.jpg 1KB
z31.jpg 1KB
黑_51.jpg 1KB
黑_43.jpg 1KB
黑_53.jpg 1KB
黑_52.jpg 1KB
豫_52.jpg 1KB
鄂_32.jpg 1KB
黑_38.jpg 1KB
黑_48.jpg 1KB
黑_44.jpg 1KB
鄂_9.jpg 1KB
黑_18.jpg 1KB
黑_42.jpg 1KB
黑_20.jpg 1KB
黑_33.jpg 1KB
浙_3.jpg 1KB
鄂_23.jpg 1KB
鄂_46.jpg 1KB
黑_12.jpg 1KB
z68.jpg 1KB
n15.jpg 1KB
鄂_53.jpg 1KB
鄂_29.jpg 1KB
黑_45.jpg 1KB
黑_49.jpg 1KB
黑_46.jpg 1KB
黑_40.jpg 1KB
黑_21.jpg 1KB
黑_47.jpg 1KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
小墨&晓末
- 粉丝: 3245
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功