最新汽车车牌识别系统实现(三)-- 车牌矫正+字符分割+代码实现,技术详细介绍

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:

目录:

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

在这里插入图片描述

七、代码实现


for rect in car_contours:

rect = (rect[0], (rect[1][0]+20, rect[1][1]+5), rect[2])

box = cv2.boxPoints(rect)

#图像矫正 cv2.getAffineTransform(pos1,pos2),其中两个位置就是变换前后的对应位置关系。输出的就是仿射矩阵M,最后这个矩阵会被传给函数 cv2.warpAffine() 来实现仿射变换

if rect[2] > ANGLE: #正角度

new_right_point_x = vertices[0, 0]

new_right_point_y = int(vertices[1, 1] - (vertices[0, 0] - vertices[1, 0]) / (vertices[3, 0] - vertices[1, 0]) * (vertices[1, 1] - vertices[3, 1]))

new_left_point_x = vertices[1, 0]

new_left_point_y = int(vertices[0, 1] + (vertices[0, 0] - vertices[1, 0]) / (vertices[0, 0] - vertices[2, 0]) * (vertices[2, 1] - vertices[0, 1]))

point_set_1 = np.float32([[440, 0], [0, 0], [0, 140], [440, 140]])

elif rect[2] < ANGLE: #负角度

new_right_point_x = vertices[1, 0]

new_right_point_y = int(vertices[0, 1] + (vertices[1, 0] - vertices[0, 0]) / (vertices[3, 0] - vertices[0, 0]) * (vertices[3, 1] - vertices[0, 1]))

new_left_point_x = vertices[0, 0]

new_left_point_y = int(vertices[1, 1] - (vertices[1, 0] - vertices[0, 0]) / (vertices[1, 0] - vertices[2, 0]) * (vertices[1, 1] - vertices[2, 1]))

point_set_1 = np.float32([[0, 0], [0, 140], [440, 140], [440, 0]])

new_box = np.array([(vertices[0, 0], vertices[0, 1]), (new_left_point_x, new_left_point_y), (vertices[1, 0], vertices[1, 1]),(new_right_point_x, new_right_point_y)])

point_set_0 = np.float32(new_box)

mat = cv2.getPerspectiveTransform(point_set_0, point_set_1)

dst = cv2.warpPerspective(img, mat, (440, 140))

cv_show(‘dst’,dst)

#-------------------------------字符分割-------------------------------------

plate_original = dst.copy()

img_aussian = cv2.GaussianBlur(dst,(5,5),1)

cv_show(‘img_aussian’,img_aussian)

#中值滤波

dst = cv2.medianBlur(img_aussian,3)

对车牌进行精准定位

img_B = cv2.split(dst)[0]

img_G = cv2.split(dst)[1]

img_R = cv2.split(dst)[2]

for i in range(dst.shape[:2][0]):

for j in range(dst.shape[:2][1]):

if abs(img_B[i,j] - Blue) < THRESHOLD and abs(img_G[i,j] - Green) <THRESHOLD and abs(img_R[i,j] - Red) < THRESHOLD:

dst[i][j][0] = 0

dst[i][j][1] = 0

dst[i][j][2] = 0

else:

dst[i][j][0] = 255

dst[i][j][1] = 255

dst[i][j][2] = 255

cv_show(‘dst’,dst)

灰度化

gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)

cv_show(‘gray’,gray)

#-------------------------------跳变次数去掉铆钉和边框----------------------------------

times_row = [] #存储哪些行符合跳变次数的阈值

for row in range(LICENSE_HIGH): # 按行检测 白字黑底

pc = 0

for col in range(LICENSE_WIDTH):

if col != LICENSE_WIDTH-1:

if gray[row][col+1] != gray[row][col]:

pc = pc + 1

times_row.append(pc)

print(“每行的跳变次数:”,times_row)

#找车牌的下边缘-从下往上扫描

row_end = 0

row_start = 0

for row in range(LICENSE_HIGH-2):

if times_row[row] < 16:

continue

elif times_row[row+1] < 16:

continue

elif times_row[row+2] < 16:

continue

else:

row_end = row + 2

print(“row_end”,row_end)

#找车牌的上边缘-从上往下扫描

i = LICENSE_HIGH-1

row_num = [] #记录row_start可能的位置

while i > 1:

if times_row[i] < 16:

i = i - 1

continue

elif times_row[i-1] < 16:

i = i - 1

continue

elif times_row[i-2] < 16:

i = i - 1

continue

else:

row_start = i - 2

row_num.append(row_start)

i = i - 1

print(“row_num”,row_num)

#确定row_start最终位置

for i in range(len(row_num)):

if i != len(row_num)-1:

if abs(row_num[i] - row_num[i+1])>3:

row_start = row_num[i]

print(“row_start”,row_start)

times_col = [0]

for col in range(LICENSE_WIDTH):

pc = 0

for row in range(LICENSE_HIGH):

if row != LICENSE_HIGH-1:

if gray[row,col] != gray[row+1,col]:

pc = pc + 1

times_col.append(pc)

print(“每列的跳变次数”,times_col)

找车牌的左右边缘-从左到右扫描

col_start = 0

col_end = 0

for col in range(len(times_col)):

if times_col[col] > 2:

col_end = col

print(‘col_end’,col_end)

j = LICENSE_WIDTH-1

while j >= 0:

if times_col[j] > 2:

col_start = j

j = j-1

print(‘col_start’,col_start)

将车牌非字符区域变成纯黑色

for i in range(LICENSE_HIGH):

if i > row_end or i < row_start:

gray[i] = 0

for j in range(LICENSE_WIDTH):

if j < col_start or j > col_end:

gray[:,j] = 0

cv_show(“res”,gray)

plate_binary = gray.copy()

for i in range(LICENSE_WIDTH-1,LICENSE_WIDTH):

gray[:,i] = 0

字符细化操作

specify = cv2.erode(gray,kernel,iterations=2)

cv_show(“specify”,specify)

plate_specify = specify.copy()

#---------------------------垂直投影法切割字符-------------------------

lst_heise = [] #记录每一列中的白色像素点数量

for i in range(LICENSE_WIDTH):

pc = 0

for j in range(LICENSE_HIGH):

if specify[j][i] == 255:

pc = pc + 1

lst_heise.append(pc)

print(“lst_heise”,lst_heise)

a = [0 for i in range(0,LICENSE_WIDTH)]

for j in range(0, LICENSE_WIDTH): # 遍历一列

for i in range(0, LICENSE_HIGH): # 遍历一行

if specify[i, j] == 255: # 如果该点为白点

总结

无论是哪家公司,都很重视高并发高可用的技术,重视基础,重视JVM。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

面试了阿里,滴滴,网易,蚂蚁,最终有幸去了网易【面试题分享】

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

适用于所有人,相信经过一些面试,大家都会有这些感触。

最后我整理了一些面试真题资料,技术知识点剖析教程,还有和广大同仁一起交流学习共同进步,还有一些职业经验的分享。

[外链图片转存中…(img-UxYViBjB-1715675982652)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值