# 识别
import time
import cv2
import numpy as np
import SVM_Train
import os
from SVM_Train import SVM
from args import args
class PlateRecognition():
def __init__(self):
self.SZ = args.Size # 训练图片长宽
self.MAX_WIDTH = args.MAX_WIDTH # 原始图片最大宽度
self.Min_Area = args.Min_Area # 车牌区域允许最大面积
self.PROVINCE_START = args.PROVINCE_START
self.provinces = args.provinces
self.cardtype = args.cardtype
self.Prefecture = args.Prefecture
self.cfg = args.Pic_size
# 读取图片文件
def __imreadex(self, filename):
return cv2.imdecode(np.fromfile(filename, dtype=np.uint8), cv2.IMREAD_COLOR)
def __point_limit(self, point):
if point[0] < 0:
point[0] = 0
if point[1] < 0:
point[1] = 0
# 利用投影法,根据设定的阈值和图片直方图,找出波峰,用于分隔字符
def __find_waves(self, threshold, histogram):
up_point = -1 # 上升点
is_peak = False
if histogram[0] > threshold:
up_point = 0
is_peak = True
wave_peaks = []
for i, x in enumerate(histogram):
if is_peak and x < threshold:
if i - up_point > 2:
is_peak = False
wave_peaks.append((up_point, i))
elif not is_peak and x >= threshold:
is_peak = True
up_point = i
if is_peak and up_point != -1 and i - up_point > 4:
wave_peaks.append((up_point, i))
return wave_peaks
# 根据找出的波峰,分隔图片,从而得到逐个字符图片
def __seperate_card(self, img, waves):
part_cards = []
for wave in waves:
part_cards.append(img[:, wave[0]:wave[1]])
return part_cards
# 缩小车牌边界
def __accurate_place(self, card_img_hsv, limit1, limit2, color):
row_num, col_num = card_img_hsv.shape[:2]
xl = col_num
xr = 0
yh = 0
yl = row_num
# col_num_limit = self.cfg["col_num_limit"]
row_num_limit = self.cfg["row_num_limit"]
col_num_limit = col_num * 0.8 if color != "green" else col_num * 0.5 # 绿色有渐变
for i in range(row_num):
count = 0
for j in range(col_num):
H = card_img_hsv.item(i, j, 0)
S = card_img_hsv.item(i, j, 1)
V = card_img_hsv.item(i, j, 2)
if limit1 < H <= limit2 and 34 < S and 46 < V:
count += 1
if count > col_num_limit:
if yl > i:
yl = i
if yh < i:
yh = i
for j in range(col_num):
count = 0
for i in range(row_num):
H = card_img_hsv.item(i, j, 0)
S = card_img_hsv.item(i, j, 1)
V = card_img_hsv.item(i, j, 2)
if limit1 < H <= limit2 and 34 < S and 46 < V:
count += 1
if count > row_num - row_num_limit:
if xl > j:
xl = j
if xr < j:
xr = j
return xl, xr, yh, yl
# 预处理
def __preTreatment(self, car_pic):
if type(car_pic) == type(""):
img = self.__imreadex(car_pic)
else:
img = car_pic
pic_hight, pic_width = img.shape[:2]
if pic_width > self.MAX_WIDTH:
resize_rate = self.MAX_WIDTH / pic_width
img = cv2.resize(img, (self.MAX_WIDTH, int(pic_hight * resize_rate)),
interpolation=cv2.INTER_AREA) # 图片分辨率调整
# cv2.imshow('Image', img)
'''
# 代码后期添加
# 用于处理不同亮度时色调整
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dark_point = (gray<40)
target_array = gray[dark_point]
datk_size = int(target_array.size / gray.size * 100)
# datk_size为暗色占比
# img = cv2.addWeighted(img, 1, img, 2, 40) # 调整亮度
# img = cv2.addWeighted(img, 1.5, img, 0.5, 1) # 调整对比度
'''
kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]], np.float32) # 定义一个核
img = cv2.filter2D(img, -1, kernel=kernel) # 锐化
blur = self.cfg["blur"]
# 高斯去噪
if blur > 0:
img = cv2.GaussianBlur(img, (blur, blur), 0)
oldimg = img
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# cv2.imshow('GaussianBlur', img)
kernel = np.ones((20, 20), np.uint8)
img_opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 开运算
img_opening = cv2.addWeighted(img, 1, img_opening, -1, 0); # 与上一次开运算结果融合
# cv2.imshow('img_opening', img_opening)
# 找到图像边缘
ret, img_thresh = cv2.threshold(img_opening, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 二值化
img_edge = cv2.Canny(img_thresh, 100, 200)
# cv2.imshow('img_edge', img_edge)
# 使用开运算和闭运算让图像边缘成为一个整体
kernel = np.ones((self.cfg["morphologyr"], self.cfg["morphologyc"]), np.uint8)
img_edge1 = cv2.morphologyEx(img_edge, cv2.MORPH_CLOSE, kernel) # 闭运算
img_edge2 = cv2.morphologyEx(img_edge1, cv2.MORPH_OPEN, kernel) # 开运算
# cv2.imshow('img_edge2', img_edge2)
# 查找图像边缘整体形成的矩形区域,可能有很多,车牌就在其中一个矩形区域中
try:
image, contours, hierarchy = cv2.findContours(img_edge2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
except ValueError:
# ValueError: not enough values to unpack (expected 3, got 2)
# cv2.findContours方法在高版本OpenCV中只返回两个参数
contours, hierarchy = cv2.findContours(img_edge2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = [cnt for cnt in contours if cv2.contourArea(cnt) > self.Min_Area]
# 逐个排除不是车牌的矩形区域
car_contours = []
for cnt in contours:
# 框选 生成最小外接矩形 返回值(中心(x,y), (宽,高), 旋转角度)
rect = cv2.minAreaRect(cnt)
# print('宽高:',rect[1])
area_width, area_height = rect[1]
# 选择宽大于高的区域
if area_width < area_height:
area_width, area_height = area_height, area_width
wh_ratio = area_width / area_height
# print('宽高比:',wh_ratio)
# 要求矩形区域长宽比在2到5.5之间,2到5.5是车牌的长宽比,其余的矩形排除
if wh_ratio > 2 and wh_ratio < 5.5:
car_contours.append(rect)
# box = cv2.boxPoints(rect)
# box = np.int0(box)
# 框出所有可能的矩形
# oldimg = cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
# cv2.imshow("Test",oldimg )
# 矩形区域可能是倾斜的矩形,需要矫正,以便使用颜色定位
card_imgs = []
for rect in car_contours:
if rect[2] > -1 and rect[2] < 1: # 创造角度,使得左、高、右、低拿到正确的值
angle = 1
else:
angle = rect[2]
rect = (rect[0], (rect[1][0] + 5, rect[1][1] + 5), angle) # 扩大范围,避免车牌边缘被排除
box = cv2.boxPoints(rect)
heigth_point = right_point = [0, 0]
left_point = low_point = [pic_width, pic_hight]
for point in box:
if left_point[0] > point[0]:
left_point = point
if low_point[1] > point[1]:
low_point = point
if heigth_point[1] < poi
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
大作业基于pyqt5+svm实现车牌识别源码+模型+数据集(高质量项目),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。 大作业基于pyqt5+svm实现车牌识别源码+模型+数据集(高质量项目),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。 大作业基于pyqt5+svm实现车牌识别源码+模型+数据集(高质量项目),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。 大作业基于pyqt5+svm实现车牌识别源码+模型+数据集(高质量项目),含有代码注释,新手也可看懂,个人手打98分项目,导师非常认可的高分项目,毕业设计、期末大作业和课程设计高分必看,下载下来,简单部署,就可以使用。大作业基于pyqt5+svm实现车牌识别源码+模型+数据集(高质量项目),含有代码注释,新手也可看懂,个人手打98分
资源推荐
资源详情
资源评论
收起资源包目录
大作业基于pyqt5+svm实现车牌识别源码+模型+数据集(高质量项目) (2000个子文件)
debug_char_auxRoi_427.jpg 927B
319_sun_0_15.jpg 889B
debug_char_auxRoi_873.jpg 877B
gt_15_6.jpg 873B
debug_char_auxRoi_871.jpg 872B
debug_char_auxRoi_2148.jpg 871B
gt_242_5.jpg 870B
gt_242_4.jpg 869B
gt_436_4.jpg 869B
319_sun_0_6.jpg 866B
319_sun_0_4.jpg 866B
debug_char_auxRoi_2396.jpg 850B
debug_char_auxRoi_1454.jpg 838B
debug_char_auxRoi_1203.jpg 835B
debug_char_auxRoi_1624.jpg 833B
debug_char_auxRoi_1618.jpg 831B
debug_char_auxRoi_2409.jpg 830B
debug_char_auxRoi_1450.jpg 830B
debug_char_auxRoi_998.jpg 828B
gt_451_5.jpg 826B
debug_char_auxRoi_786.jpg 817B
gt_534_5.jpg 816B
debug_char_auxRoi_787.jpg 813B
debug_char_auxRoi_6547.jpg 813B
gt_1567_4.jpg 813B
debug_char_auxRoi_1702.jpg 812B
debug_char_auxRoi_769.jpg 812B
debug_char_auxRoi_1193.jpg 811B
debug_char_auxRoi_1686.jpg 808B
319_sun_0_5.jpg 806B
gt_1036_4.jpg 803B
gt_664_6.jpg 802B
gt_1037_2.jpg 798B
debug_char_auxRoi_863.jpg 798B
debug_char_auxRoi_1627.jpg 798B
gt_54_5.jpg 797B
debug_char_auxRoi_950.jpg 796B
debug_char_auxRoi_2528.jpg 794B
319_sun_0_1.jpg 794B
debug_char_auxRoi_2424.jpg 793B
160-7.jpg 791B
gt_288_1.jpg 791B
gt_503_1.jpg 791B
gt_146_1.jpg 791B
debug_char_auxRoi_865.jpg 791B
debug_char_auxRoi_348.jpg 790B
gt_64_4.jpg 790B
94-2.jpg 789B
gt_781_4.jpg 789B
debug_char_auxRoi_2717.jpg 788B
debug_char_auxRoi_2278.jpg 788B
debug_char_auxRoi_702.jpg 786B
debug_char_auxRoi_725.jpg 786B
gt_668_4.jpg 785B
319_sun_0_2.jpg 785B
319_sun_0_3.jpg 785B
debug_char_auxRoi_2530.jpg 785B
gt_345_3.jpg 784B
debug_char_auxRoi_997.jpg 784B
gt_93_3.jpg 784B
gt_184_3.jpg 784B
debug_char_auxRoi_2523.jpg 783B
gt_1749_6.jpg 783B
debug_char_auxRoi_996.jpg 782B
debug_char_auxRoi_900.jpg 781B
325_sun_0_3.jpg 781B
319_sun_0_11.jpg 780B
debug_char_auxRoi_1722.jpg 780B
debug_char_auxRoi_1274.jpg 780B
debug_char_auxRoi_864.jpg 779B
gt_702_3.jpg 778B
gt_348_3.jpg 778B
gt_187_3.jpg 778B
debug_char_auxRoi_1394.jpg 778B
debug_char_auxRoi_1679.jpg 777B
debug_char_auxRoi_1725.jpg 776B
debug_char_auxRoi_907.jpg 775B
debug_char_auxRoi_444.jpg 775B
gt_218_3.jpg 773B
gt_398_3.jpg 773B
245-4.jpg 773B
319_sun_0_16.jpg 773B
debug_char_auxRoi_2526.jpg 773B
debug_char_auxRoi_1440.jpg 773B
debug_char_auxRoi_2535.jpg 772B
debug_char_auxRoi_2516.jpg 772B
gt_664_4.jpg 771B
319_sun_0_21.jpg 771B
debug_char_auxRoi_1186.jpg 771B
gt_375_4.jpg 770B
228-2.jpg 770B
gt_204_4.jpg 770B
gt_240_6.jpg 770B
gt_431_6.jpg 770B
gt_124_6.jpg 770B
debug_char_auxRoi_1464.jpg 770B
debug_char_auxRoi_1646.jpg 769B
debug_char_auxRoi_2750.jpg 769B
160-4.jpg 769B
debug_char_auxRoi_2394.jpg 768B
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
王二空间
- 粉丝: 6310
- 资源: 1648
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功