赞
踩
直接上代码:
import os import cv2 import numpy as np # 显示图片 def cvShow(img): cv2.imshow('0', img) cv2.waitKey() Img = cv2.imread("D:\python.code\carRead\car/img.png")#D:\python.code\carRead\car\img3.png cvShow(Img) # 高斯去燥 Img1 = cv2.GaussianBlur(Img, (3, 3), 0) # cvShow(Img1) # 灰度处理 grayImg = cv2.cvtColor(Img1, cv2.COLOR_BGR2GRAY) # cvShow(grayImg) # 边缘检测 # Soble算子边缘检测 Sobel_x = cv2.Sobel(grayImg, cv2.CV_16S, 1, 0) sImg = cv2.convertScaleAbs(Sobel_x) # cvShow(sImg) # 自适应阈值处理 ret, img = cv2.threshold(sImg, 0, 255, cv2.THRESH_OTSU) # cvShow(img) # 闭运算 # 先膨胀在腐蚀 kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (14, 3)) # print(kernelX) image = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernelX, iterations=2) # cvShow(image) # 去除小白点 kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 1)) kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 19)) # 膨胀,腐蚀 image = cv2.dilate(image, kernelX) image = cv2.erode(image, kernelX) # 腐蚀,膨胀 image = cv2.erode(image, kernelY) image = cv2.dilate(image, kernelY) # cvShow(image) # 中值滤波去除噪点 image = cv2.medianBlur(image, 15) # cvShow(image) # 轮廓检测 # cv2 RETR_EXTERNAL 表示只检测外轮廓 # cv2.CHAIN_APPROX_SIMPLE压水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮只需4个点来保存轮席信息 contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 绘制轮廓 Img2 = Img.copy() cv2.drawContours(Img2, contours, -1, (0, 0, 255), 1) # cvShow(Img2) # 筛选车牌位置的轮廓 # 车牌长宽比在3:1到4:1之间 for item in contours: # cv2.boundingRect用一个最小的巨型,把形状包起来 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)): rectImg = Img[y:y + height, x:x + weight] cv2.imwrite('D:\python.code\carRead\license/license_plate.png', rectImg)#\是路径,/是文件名 # cvShow(rectImg) # 高斯去噪 carImg = cv2.GaussianBlur(rectImg, (3, 3), 0) # cvShow(carImg) # 灰度化 grayCarImg = cv2.cvtColor(carImg, cv2.COLOR_BGR2GRAY) # cvShow(grayCarImg) # 自适应阈值处理 ret, image = cv2.threshold(grayCarImg, 0, 255, cv2.THRESH_OTSU) # cvShow(image) # 膨胀 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) img = cv2.dilate(image, kernel) # cvShow(img) # 轮廓检测 contours1, hierarchy1 = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) img1 = rectImg.copy() cv2.drawContours(img1, contours1, -1, (0, 0, 255), 1) # cvShow(img1) # 筛选出各个字符的位置轮廓 words = [] for item in contours1: 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 = sorted(words, key=lambda s: s[0], reverse=False) # print(words) i = 0 for word in words: # 根据每个字符的高度进行筛选 # if (word[3] > (word[2] * 1.5)) and (word[3] < (word[2] * 4.0)): if (word[3] > 20) and (word[3] < 50) and (word[2] > 3) and (word[2] < 25): i = i + 1 if i == 8: break else: image = rectImg[word[1]:word[1] + word[3], word[0]:word[0] + word[2]] # cvShow(image) # print(word) cv2.imwrite('D:\python.code\carRead\words/' + str(i) + '.png', image) templates = ['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_img(road): referImg_list = [] for filename in os.listdir(road): #print(filename) referImg_list.append(road + '/' + filename) # print(referImg_list) return referImg_list #read_img('D:\python.code\carRead\model') # 匹配中文 c_words = [] for i in range(34, 65): c_word = read_img('D:/python.code/carRead/model/' + templates[i]) c_words.append(c_word) #print(c_words) # 读取车牌字符 img = cv2.imread('D:\python.code\carRead\words/1.png') #cvShow(img) # 高斯去噪 image = cv2.GaussianBlur(img, (3, 3), 0) # 灰度处理 grayimg = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) # cvShow(grayimg) # 自适应阈值处理 ret, image1 = cv2.threshold(grayimg, 0, 255, cv2.THRESH_OTSU) # cvShow(image) best_score = [] # 存取每个省市最高的得分 for c_word in c_words: score = [] # 存取的时每个省市的得分 for word in c_word: # 读取模板中的照片 # formfile()函数读回数据时需要用户指定元素类型,并对数组形状进行适当的修改 template_img = cv2.imdecode(np.fromfile(word, 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 = image1.copy() # 让两者具有相同的长宽 image = cv2.resize(image, (width, height)) # 两者进行匹配 TM_CCOEFFF 匹配程度越高,计算出来的值越大 result = cv2.matchTemplate(image, template_img, cv2.TM_CCOEFF) score.append(result[0][0]) best_score.append(max(score)) # 获取最高得分元素的下标 num = best_score.index(max(best_score)) print(templates[num + 34],end='') # 识别车牌第二个字母 # 读取图片 img = cv2.imread('D:\python.code\carRead\words/2.png') # cvShow(img01) # 高斯去噪 img = cv2.GaussianBlur(img, (3, 3), 0) # 灰度处理 img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # cvShow(img) # 自适应阈值处理 ret, image2 = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU) # cvShow(image2) # 字母模板匹配 c_words = [] for i in range(10, 34): # print(templates[i]) c_word = read_img('D:/python.code/carRead/model/' + templates[i]) c_words.append(c_word) # print(c_words) best_score = [] # 存取每个省市最高的得分 for c_word in c_words: score = [] # 存取的时每个省市的得分 for word in c_word: # 读取模板中的照片 # formfile()函数读回数据时需要用户指定元素类型,并对数组形状进行适当的修改 template_img = cv2.imdecode(np.fromfile(word, 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 = image2.copy() # 让两者具有相同的长宽 image = cv2.resize(image, (width, height)) # 两者进行匹配 TM_CCOEFFF 匹配程度越高,计算出来的值越大 result = cv2.matchTemplate(image, template_img, cv2.TM_CCOEFF) score.append(result[0][0]) # print(word) # print(score) best_score.append(max(score)) # print(best_score) # 获取最高得分元素的下标 num = best_score.index(max(best_score)) print(templates[10 + num],end='') def strOrnum(path): # 读取图片 img = cv2.imread(path) # cvShow(img01) # 高斯去噪 img = cv2.GaussianBlur(img, (3, 3), 0) # 灰度处理 img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) # cvShow(img) # 自适应阈值处理 ret, image2 = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU) # cvShow(image2) # 字母模板匹配 c_words = [] for i in range(0, 34): # print(templates[i]) c_word = read_img('D:/python.code/carRead/model/' + templates[i]) c_words.append(c_word) # print(c_words) best_score = [] # 存取每个省市最高的得分 for c_word in c_words: score = [] # 存取的时每个省市的得分 for word in c_word: # 读取模板中的照片 # formfile()函数读回数据时需要用户指定元素类型,并对数组形状进行适当的修改 template_img = cv2.imdecode(np.fromfile(word, 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 = image2.copy() # 让两者具有相同的长宽 image = cv2.resize(image, (width, height)) # 两者进行匹配 TM_CCOEFFF 匹配程度越高,计算出来的值越大 result = cv2.matchTemplate(image, template_img, cv2.TM_CCOEFF) score.append(result[0][0]) best_score.append(max(score)) # 获取最高得分元素的下标 num = best_score.index(max(best_score)) print(templates[num],end='') strOrnum('D:\python.code\carRead\words/3.png') strOrnum('D:\python.code\carRead\words/4.png') strOrnum('D:\python.code\carRead\words/5.png') strOrnum('D:\python.code\carRead\words/6.png') strOrnum('D:\python.code\carRead\words/7.png')
可以用作学习参考
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。