博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
机器学习SVM的车牌识别系统—计算机专业课程设计(毕业设计)
阅读量:4072 次
发布时间:2019-05-25

本文共 4156 字,大约阅读时间需要 13 分钟。

基于机器学习SVM的车牌识别系统

  • 下载本文机器学习SVM算法的车牌识别系统完整的代码和参考报告链接:
  • 此处是另外一个系统描述的链接:用java、JSP的学生宿舍管理系统,含参考报告,可用于毕设课设。

概要

本文基于机器学习的车牌识别系统的工作主要是运用SVM算法实现了对车牌的识别,支持上传本地图片和调用摄像头进行拍摄两种识别的途径。并用tkinter做了一个客户端界面。

该算法主要的思想是先使用图像边缘和车牌颜色定位车牌,再用SVM算法识别字符。车牌定位在predict方法中,为说明清楚,完成代码和测试后,加了很多注释,请参看源码。车牌字符识别也在predict方法中,请参看源码中的注释,需要说明的是,车牌字符识别使用的算法是opencv的SVM, opencv的SVM使用代码来自于opencv附带的sample,StatModel类和SVM类都是sample中的代码。SVM训练使用的训练样本来自于github上的EasyPR的c++版本。源码中,上传了EasyPR中的训练样本,在train\目录下,如果要重新训练请解压在当前目录下,并删除原始训练数据文件svm.dat和svmchinese.dat。
在这里插入图片描述

  • 下载源码,并安装python、numpy、opencv的python版、PIL,运行surface.py即可,包括算法和客户端界面,是其中的2个文件,surface.py是界面代码,predict.py是算法代码,界面用tkinter进行编写。

运行的一些结果

一个版本是界面用python的qt界面做的

在这里插入图片描述

在这里插入图片描述

另一个版本是界面是用tkinter做的

在这里插入图片描述

在这里插入图片描述

关键代码

#以上为车牌定位		#以下为识别车牌中的字符		predict_result = []		roi = None		card_color = None		for i, color in enumerate(colors):			if color in ("blue", "yello", "green"):				card_img = card_imgs[i]				gray_img = cv2.cvtColor(card_img, cv2.COLOR_BGR2GRAY)				#黄、绿车牌字符比背景暗、与蓝车牌刚好相反,所以黄、绿车牌需要反向				if color == "green" or color == "yello":					gray_img = cv2.bitwise_not(gray_img)				ret, gray_img = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)				#查找水平直方图波峰				x_histogram  = np.sum(gray_img, axis=1)				x_min = np.min(x_histogram)				x_average = np.sum(x_histogram)/x_histogram.shape[0]				x_threshold = (x_min + x_average)/2				wave_peaks = find_waves(x_threshold, x_histogram)				if len(wave_peaks) == 0:					print("peak less 0:")					continue				#认为水平方向,最大的波峰为车牌区域				wave = max(wave_peaks, key=lambda x:x[1]-x[0])				gray_img = gray_img[wave[0]:wave[1]]				#查找垂直直方图波峰				row_num, col_num= gray_img.shape[:2]				#去掉车牌上下边缘1个像素,避免白边影响阈值判断				gray_img = gray_img[1:row_num-1]				y_histogram = np.sum(gray_img, axis=0)				y_min = np.min(y_histogram)				y_average = np.sum(y_histogram)/y_histogram.shape[0]				y_threshold = (y_min + y_average)/5#U和0要求阈值偏小,否则U和0会被分成两半				wave_peaks = find_waves(y_threshold, y_histogram)				#for wave in wave_peaks:				#	cv2.line(card_img, pt1=(wave[0], 5), pt2=(wave[1], 5), color=(0, 0, 255), thickness=2) 				#车牌字符数应大于6				if len(wave_peaks) <= 6:					print("peak less 1:", len(wave_peaks))					continue								wave = max(wave_peaks, key=lambda x:x[1]-x[0])				max_wave_dis = wave[1] - wave[0]				#判断是否是左侧车牌边缘				if wave_peaks[0][1] - wave_peaks[0][0] < max_wave_dis/3 and wave_peaks[0][0] == 0:					wave_peaks.pop(0)								#组合分离汉字				cur_dis = 0				for i,wave in enumerate(wave_peaks):					if wave[1] - wave[0] + cur_dis > max_wave_dis * 0.6:						break					else:						cur_dis += wave[1] - wave[0]				if i > 0:					wave = (wave_peaks[0][0], wave_peaks[i][1])					wave_peaks = wave_peaks[i+1:]					wave_peaks.insert(0, wave)								#去除车牌上的分隔点				point = wave_peaks[2]				if point[1] - point[0] < max_wave_dis/3:					point_img = gray_img[:,point[0]:point[1]]					if np.mean(point_img) < 255/5:						wave_peaks.pop(2)								if len(wave_peaks) <= 6:					print("peak less 2:", len(wave_peaks))					continue				part_cards = seperate_card(gray_img, wave_peaks)				for i, part_card in enumerate(part_cards):					#可能是固定车牌的铆钉					if np.mean(part_card) < 255/5:						print("a point")						continue					part_card_old = part_card					#w = abs(part_card.shape[1] - SZ)//2					w = part_card.shape[1] // 3					part_card = cv2.copyMakeBorder(part_card, 0, 0, w, w, cv2.BORDER_CONSTANT, value = [0,0,0])					part_card = cv2.resize(part_card, (SZ, SZ), interpolation=cv2.INTER_AREA)					#cv2.imshow("part", part_card_old)					#cv2.waitKey(0)					#cv2.imwrite("u.jpg", part_card)					#part_card = deskew(part_card)					part_card = preprocess_hog([part_card])					if i == 0:						resp = self.modelchinese.predict(part_card)						charactor = provinces[int(resp[0]) - PROVINCE_START]					else:						resp = self.model.predict(part_card)						charactor = chr(resp[0])					#判断最后一个数是否是车牌边缘,假设车牌边缘被认为是1					if charactor == "1" and i == len(part_cards)-1:						if part_card_old.shape[0]/part_card_old.shape[1] >= 8:#1太细,认为是边缘							print(part_card_old.shape)							continue					predict_result.append(charactor)				roi = card_img				card_color = color				break						return predict_result, roi, card_color#识别到的字符、定位的车牌图像、车牌颜色
  • 下载本文机器学习SVM算法的车牌识别系统完整的代码和参考报告链接:

转载地址:http://ktgji.baihongyu.com/

你可能感兴趣的文章
Android 解决TextView设置文本和富文本SpannableString自动换行留空白问题
查看>>
最完整的Java IO流学习总结
查看>>
Android开发中Button按钮绑定监听器的方式完全解析
查看>>
Android自定义View实现商品评价星星评分控件
查看>>
postgresql监控工具pgstatspack的安装及使用
查看>>
postgresql查看表的和索引的情况,判断是否膨胀
查看>>
postgresql中根据oid和filenode去找表的物理文件的位置
查看>>
postgresql减少wal日志生成量的方法
查看>>
swift中单例的创建及销毁
查看>>
获取App Store中App的ipa包
查看>>
iOS 关于pods-frameworks.sh:permission denied报错的解决
查看>>
设置RGBColor
查看>>
设置tabbaritem的title的颜色及按钮图片
查看>>
动态设置label的高度
查看>>
获取 一个文件 在沙盒Library/Caches/ 目录下的路径
查看>>
图片压缩
查看>>
检测缓存文件是否超时
查看>>
十进制字符串转十六进制字符串
查看>>
属性字符串(富文本)的使用
查看>>
cell上label的背景颜色在选中状态下改变的解决办法
查看>>