wordpress 更改数据库密码错误,网站文章在哪发布做seo,wordpress 黑体,玩具 网站模板基于SVM的车牌识别系统#xff08;Python代码实现#xff09;
车牌识别系统是智能交通系统的重要组成部分#xff0c;有着广泛的应用。车牌识别系统主要有车牌定位、字符分割和字符识别三部分组成#xff0c;本文的研究重点是车牌字符识别这部分#xff0c;本文提出了一种…基于SVM的车牌识别系统Python代码实现
车牌识别系统是智能交通系统的重要组成部分有着广泛的应用。车牌识别系统主要有车牌定位、字符分割和字符识别三部分组成本文的研究重点是车牌字符识别这部分本文提出了一种基于OpenCV和SVM的车牌识别方法。首先通过Soble边缘检测算法与形态学算法相结合来确定大致的车牌轮廓,结合车牌的外接矩形的面积与长宽比来筛选出符合车牌特征的候选区域,然后使用投影法将车牌中的字符分割出来最后使用SVM分类器来对分割出的字符进行识别输出识别结果。经过验证该车牌识别系统能够适用于比较复杂的环境识别准确率相对较高。为了提升该系统的可操作性本文使用PyQt5设计了GUI界面提升了系统的可操作性同时使界面更加美观。
一、算法流程
一个完整的车牌号识别系统要完成从图像采集到字符识别输出过程相当复杂基本可以分成硬件部分跟软件部分硬件部分包括系统触发、图像采集软件部分包括图像预处理、车牌定位、字符分割、字符识别四大部分一个车牌识别系统的基本结构如图 二、图像预处理
获取蓝色和绿色通道 hsv cv2.cvtColor(src, cv2.COLOR_BGR2HSV) # 将RGB图像转换为HSV图像h, s, v cv2.split(hsv) # 分离H,S,Vlower np.array([100, 90, 40])upper np.array([124, 255, 255]) # 设置阈值mask cv2.inRange(hsv, lower, upper) # 获取图像蒙版img cv2.bitwise_and(s, s, maskmask) # 在图像蒙版上使用“按位与”运算符吗分离绿色和蓝色通道
处理结果
直方图均衡化 img cv2.equalizeHist(img) # 直方图均衡化增强对比度将已知灰度概率密度分布的图像经过变换使其称为一个均匀灰度概率密度分布的新图像img cv2.GaussianBlur(img, (3, 3), 0, 0, cv2.BORDER_DEFAULT) # 高斯滤波处理结果 检测图像中的纹理 flipped cv2.flip(img, 1) # 图像翻转1水平翻转sobel1 cv2.Sobel(img, cv2.CV_8U, 1, 0, ksize3) # 图像边缘检测Sobel算子对x轴方向求导sobel2 cv2.flip(cv2.Sobel(flipped, cv2.CV_8U, 1, 0, ksize3), 1) # 先平滑图像边缘再翻转img sobel1 / 2 sobel2 / 2img img.astype(uint8) # 强制类型转换处理结果 灰度图转为二进制图像 th (np.mean(img) (np.max(img) - np.mean(img)) * 0.6)ret, img cv2.threshold(img, th, 255, cv2.THRESH_BINARY) # 简单阈值函数从灰度图像中获取二进制图像处理结果 形态学闭合操作
img close_op(img, 36)处理结果
三、车牌定位 for contour in contours:area cv2.contourArea(contour) # 计算图像轮廓面积if area 200 or area 50000: # 判断车牌轮廓区域continuerect cv2.minAreaRect(contour) # 求出点集contour的最小矩形面积返回值rec[0]为矩形的中心点rec[1]为矩形的长和宽rec[2]矩形的旋转角度if rect[1][0] * rect[1][1] 666 or area rect[1][0] * rect[1][1] * 0.6:continuedy, dx contour.flatten().reshape(contour.shape[0], -1).T.ptp(1)cwb rect[1][1] / rect[1][0] if rect[1][1] rect[1][0] else rect[1][0] / rect[1][1]if dy dx or cwb 2.5 or cwb 6:continueif not check_plate(src, rect):continueplate extract_plate(src, rect) # src为原始图像rect为车牌区域坐标处理结果
四、车牌字符分割
def plate_cut_text(img):车牌字符分割将分割好的车牌区域进行字符分割sum np.sum(img, 1)limit np.mean(sum) * 0.2bound []start 0for i in range(len(sum) - 1):if sum[i] limit and sum[i 1] limit:start ielif sum[i] limit and sum[i 1] limit:bound.append([start, i])start 0if start ! 0:bound.append([start, len(sum - 1)])up, down 0, 0for b in bound:if b[1] - b[0] down - up:up b[0]down b[1]return img[up: down 1, :]五、基于SVM的车牌字符识别
reader SVM_ocr.Reader()
def plate_recognition(plate): #字符识别代码车牌识别核心代码使用SVM对分割的车牌字符进行识别并将识别结果返回img cv2.cvtColor(plate, cv2.COLOR_BGR2GRAY)th (np.mean(img) (np.max(img) - np.mean(img)) * 0.2)_, img cv2.threshold(img, th, 255, cv2.THRESH_BINARY) #阈值函数img plate_cut_text(img)display(plate th, img, 360)bound plate_split(img) #调用plate_split函数对车牌字符进行拆分返回一个列表列表每个值记录车牌每个字符起始位置print(拆分出来的各个字符起始位置,bound)plate_res []for i, b in enumerate(bound):display(character_str(i), img[:,b[0]:b[1]], 50)if b[1] - b[0] 5 and b[1] - b[0] 28: #判断每个分割出来的字符宽度是否正常if len(plate_res) 0:ch reader.recognize_chinese(adjust_vision(img[:, b[0]:b[1]1]))[0] #识别车牌汉字else:ch reader.recognize_alnum(adjust_vision(img[:, b[0]:b[1]1]))[0] #识别车牌字符plate_res.append(ch) #将识别结果添加到变量ch中return plate_res #返回车牌识别结果
六、使用Qtdesigner进行UI界面设计