本文实例为大家分享了opencv实现车牌识别的具体代码,供大家参考,具体内容如下
(1)提取车牌位置,将车牌从图中分割出来;
(2)车牌字符的分割;
(3)通过模版匹配识别字符;
(4)将结果绘制在图片上显示出来。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
|
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( 'img。png' ) # 复制一张图片,在复制图上进行图像操作,保留原图 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.5 )) and (weight < (height * 4 )): image = origin_image[y:y + height, x:x + weight] plt_show0(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, ( 2 , 2 )) 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 = sorted (words,key = lambda s:s[ 0 ],reverse = False ) i = 0 for word in words: if (word[ 3 ] > (word[ 2 ] * 1.5 )) and (word[ 3 ] < (word[ 2 ] * 3.5 )) and (word[ 2 ] > 25 ): i = i + 1 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( './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( './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( './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) image_ = image.copy() height, width = image_.shape 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 in eng_num_word_list: result = template_score(eng_num_word,word_image) score.append(result) best_score.append( max (score)) i = best_score.index( max (best_score)) # print(template[i]) r = template[i] results.append(r) continue return results word_images_ = word_images.copy() result = template_matching(word_images_) print (result) print ( "".join(result)) # 未完结---------------- |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/weixin_52465909/article/details/121739263