# -*- coding:utf-8 -*-
import cv2
import numpy as np
"""
源自:https://github.com/duanshengliu/End-to-end-for-chinese-plate-recognition
"""
def locate_and_correct(img_src, img_mask):
"""
该函数通过cv2对img_mask进行边缘检测,获取车牌区域的边缘坐标(存储在contours中)和最小外接矩形4个端点坐标,
再从车牌的边缘坐标中计算出和最小外接矩形4个端点最近的点即为平行四边形车牌的四个端点,从而实现车牌的定位和矫正
:param img_src: 原始图片
:param img_mask: 通过u_net进行图像分隔得到的二值化图片,车牌区域呈现白色,背景区域为黑色
:return: 定位且矫正后的车牌
"""
# cv2.imshow('img_mask',img_mask)
# cv2.waitKey(0)
# ret,thresh = cv2.threshold(img_mask[:,:,0],0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) #二值化
# cv2.imshow('thresh',thresh)
# cv2.waitKey(0)
try:
contours, hierarchy = cv2.findContours(img_mask[:, :, 0], cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
except: # 防止opencv版本不一致报错
ret, contours, hierarchy = cv2.findContours(img_mask[:, :, 0], cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
if not len(contours): # contours1长度为0说明未检测到车牌
# print("未检测到车牌")
return [], []
else:
Lic_img = []
img_src_copy = img_src.copy() # img_src_copy用于绘制出定位的车牌轮廓
for ii, cont in enumerate(contours):
x, y, w, h = cv2.boundingRect(cont) # 获取最小外接矩形
img_cut_mask = img_mask[y:y + h, x:x + w] # 将标签车牌区域截取出来
# cv2.imshow('img_cut_mask',img_cut_mask)
# cv2.waitKey(0)
# print('w,h,均值,宽高比',w,h,np.mean(img_cut_mask),w/h)
# contours中除了车牌区域可能会有宽或高都是1或者2这样的小噪点,
# 而待选车牌区域的均值应较高,且宽和高不会非常小,因此通过以下条件进行筛选
if np.mean(img_cut_mask) >= 75 and w > 15 and h > 15:
rect = cv2.minAreaRect(cont) # 针对坐标点获取带方向角的最小外接矩形,中心点坐标,宽高,旋转角度
box = cv2.boxPoints(rect).astype(np.int32) # 获取最小外接矩形四个顶点坐标
# cv2.drawContours(img_mask, contours, -1, (0, 0, 255), 2)
# cv2.drawContours(img_mask, [box], 0, (0, 255, 0), 2)
# cv2.imshow('img_mask',img_mask)
# cv2.waitKey(0)
cont = cont.reshape(-1, 2).tolist()
# 由于转换矩阵的两组坐标位置需要一一对应,因此需要将最小外接矩形的坐标进行排序,最终排序为[左上,左下,右上,右下]
box = sorted(box, key=lambda xy: xy[0]) # 先按照左右进行排序,分为左侧的坐标和右侧的坐标
box_left, box_right = box[:2], box[2:] # 此时box的前2个是左侧的坐标,后2个是右侧的坐标
box_left = sorted(box_left, key=lambda x: x[1]) # 再按照上下即y进行排序,此时box_left中为左上和左下两个端点坐标
box_right = sorted(box_right, key=lambda x: x[1]) # 此时box_right中为右上和右下两个端点坐标
box = np.array(box_left + box_right) # [左上,左下,右上,右下]
# print(box)
x0, y0 = box[0][0], box[0][1] # 这里的4个坐标即为最小外接矩形的四个坐标,接下来需获取平行(或不规则)四边形的坐标
x1, y1 = box[1][0], box[1][1]
x2, y2 = box[2][0], box[2][1]
x3, y3 = box[3][0], box[3][1]
def point_to_line_distance(X, Y):
if x2 - x0:
k_up = (y2 - y0) / (x2 - x0) # 斜率不为无穷大
d_up = abs(k_up * X - Y + y2 - k_up * x2) / (k_up ** 2 + 1) ** 0.5
else: # 斜率无穷大
d_up = abs(X - x2)
if x1 - x3:
k_down = (y1 - y3) / (x1 - x3) # 斜率不为无穷大
d_down = abs(k_down * X - Y + y1 - k_down * x1) / (k_down ** 2 + 1) ** 0.5
else: # 斜率无穷大
d_down = abs(X - x1)
return d_up, d_down
d0, d1, d2, d3 = np.inf, np.inf, np.inf, np.inf
l0, l1, l2, l3 = (x0, y0), (x1, y1), (x2, y2), (x3, y3)
for each in cont: # 计算cont中的坐标与矩形四个坐标的距离以及到上下两条直线的距离,对距离和进行权重的添加,成功计算选出四边形的4个顶点坐标
x, y = each[0], each[1]
dis0 = (x - x0) ** 2 + (y - y0) ** 2
dis1 = (x - x1) ** 2 + (y - y1) ** 2
dis2 = (x - x2) ** 2 + (y - y2) ** 2
dis3 = (x - x3) ** 2 + (y - y3) ** 2
d_up, d_down = point_to_line_distance(x, y)
weight = 0.975
if weight * d_up + (1 - weight) * dis0 < d0: # 小于则更新
d0 = weight * d_up + (1 - weight) * dis0
l0 = (x, y)
if weight * d_down + (1 - weight) * dis1 < d1:
d1 = weight * d_down + (1 - weight) * dis1
l1 = (x, y)
if weight * d_up + (1 - weight) * dis2 < d2:
d2 = weight * d_up + (1 - weight) * dis2
l2 = (x, y)
if weight * d_down + (1 - weight) * dis3 < d3:
d3 = weight * d_down + (1 - weight) * dis3
l3 = (x, y)
# print([l0,l1,l2,l3])
# for l in [l0, l1, l2, l3]:
# cv2.circle(img=img_mask, color=(0, 255, 255), center=tuple(l), thickness=2, radius=2)
# cv2.imshow('img_mask',img_mask)
# cv2.waitKey(0)
p0 = np.float32([l0, l1, l2, l3]) # 左上角,左下角,右上角,右下角,p0和p1中的坐标顺序对应,以进行转换矩阵的形成
p1 = np.float32([(0, 0), (0, 80), (240, 0), (240, 80)]) # 我们所需的长方形
transform_mat = cv2.getPerspectiveTransform(p0, p1) # 构成转换矩阵
lic = cv2.warpPerspective(img_src, transform_mat, (240, 80)) # 进行车牌矫正
# cv2.imshow('lic',lic)
# cv2.waitKey(0)
Lic_img.append(lic)
cv2.drawContours(img_src_copy, [np.array([l0, l1, l3, l2])], -1, (0, 255, 0), 2) # 在img_src_copy上绘制出定位的车牌轮廓,(0, 255, 0)表示绘制线条为绿色
return img_src_copy, Lic_img
没有合适的资源?快使用搜索试试~ 我知道了~
Tensorflow人工智能车牌识别系统源代码
共11个文件
py:10个
html:1个
需积分: 1 1 下载量 110 浏览量
2024-02-24
15:31:43
上传
评论 2
收藏 14KB ZIP 举报
温馨提示
TensorFlow是一个由Google开发的开源人工智能框架,被广泛应用于机器学习和深度学习领域。在人工智能车牌识别系统中,TensorFlow框架发挥着关键作用,帮助实现车牌号码的自动识别。这个系统通常经历多个关键步骤,包括图像采集、预处理、车牌定位、字符分割和字符识别等。首先,系统通过摄像头采集车辆图像,并对其进行预处理,包括去噪、灰度化和边缘检测等操作,以提高车牌区域的识别准确性。随后,系统利用深度学习模型定位车牌区域,常采用卷积神经网络(CNN)等技术实现这一步骤。一旦成功定位车牌区域,系统会进行字符分割,将每个字符分离出来,为后续的识别工作做准备。这一步需要考虑字符间的间距、倾斜度等因素,以确保准确的分割。最终,系统利用经过训练的深度学习模型对每个字符进行识别,将它们转换为文本信息,完成整个车牌号码的识别过程。人工智能车牌识别系统在交通管理、停车场管理、安防监控等领域有着广泛的应用前景。通过结合强大的TensorFlow框架,系统可以提高识别准确率和效率,实现对车牌号码的快速自动识别,为交通管理领域的智能化发展提供有力支持。在车牌识别领域为实现智能化交通管理做出了重要贡献。
资源推荐
资源详情
资源评论
收起资源包目录
Tensorflow人工智能车牌识别系统源代码.zip (11个子文件)
Tensorflow人工智能车牌识别系统源代码
car
web
index.py 4KB
templates
index.html 3KB
manage.py 659B
car
__init__.py 0B
wsgi.py 383B
urls.py 903B
settings.py 3KB
asgi.py 383B
util
CNN.py 4KB
core.py 7KB
Unet.py 5KB
共 11 条
- 1
资源评论
传奇开心果编程
- 粉丝: 8098
- 资源: 335
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功