企业网站优化咨询,房地产网站开发毕业设计,中国知名设计网站,wordpress全站启用ssl张戈文章目录 0 简介1 课题介绍1.1 系统简介1.2 系统要求1.3 系统架构 2 实现方式2.1 车牌检测技术2.2 车牌识别技术2.3 SVM识别字符2.4 最终效果 3 系统使用说明实验环境输入输出系统结果演示 4 对应论文5 最后 0 简介
今天学长向大家分享一个毕业设计项目
毕业设计 基于机器视觉…文章目录0 简介1 课题介绍1.1 系统简介1.2 系统要求1.3 系统架构2 实现方式2.1 车牌检测技术2.2 车牌识别技术2.3 SVM识别字符2.4 最终效果3 系统使用说明实验环境输入输出系统结果演示4 对应论文5 最后0 简介今天学长向大家分享一个毕业设计项目毕业设计 基于机器视觉的车牌识别系统项目运行效果毕业设计 基于机器视觉的车牌识别系统 项目分享:见文末!1 课题介绍1.1 系统简介车牌识别这个系统虽然传统古老却是包含了所有这四个特侦的一个大数据技术的缩影.在车牌识别中你需要处理的数据是图像中海量的像素单元你处理的数据不再是传统的结构化数据而是图像这种复杂的数据如果不能在很短的时间内识别出车牌那么系统就缺少意义虽然一副图像中有很多的信息但可能仅仅只有那一小块的信息车牌以及车身的颜色是你关心而且这些信息都蕴含着巨大的价值。也就是说车牌识别系统事实上就是现在火热的大数据技术在某个领域的一个聚焦通过了解车牌识别系统可以很好的帮助你理解大数据技术的内涵也能清楚的认识到大数据的价值。1.2 系统要求它基于openCV这个开源库这意味着所有它的代码都可以轻易的获取。它能够识别中文例如车牌为苏EUK722的图片它可以准确地输出std:string类型的苏EUK722的结果。它的识别率较高。目前情况下字符识别已经可以达到90%以上的精度。1.3 系统架构整体包含两个系统:车牌检测车牌字体识别(中文 数字 英文)整体架构如下:2 实现方式2.1 车牌检测技术车牌检测Plate Detection对一个包含车牌的图像进行分析最终截取出只包含车牌的一个图块。这个步骤的主要目的是降低了在车牌识别过程中的计算量。如果直接对原始的图像进行车牌识别会非常的慢因此需要检测的过程。在本系统中我们使用SVM支持向量机这个机器学习算法去判别截取的图块是否是真的“车牌”。车牌检测这里不详细说明, 只贴出opencv图像处理流程, 需要代码的可以留下邮箱使用到的图像处理算法高斯模糊灰度化处理Sobel算子(边缘检测)开操作闭操作仿射变换霍姆线性检测角度矫正2.2 车牌识别技术字符识别Chars Recognition有的书上也叫Plate Recognition我为了与整个系统的名称做区分所以改为此名字。这个步骤的主要目的就是从上一个车牌检测步骤中获取到的车牌图像进行光学字符识别OCR这个过程。其中用到的机器学习算法是著名的人工神经网络ANN中的多层感知机MLP模型。最近一段时间非常火的“深度学习”其实就是多隐层的人工神经网络与其有非常紧密的联系。通过了解光学字符识别OCR这个过程也可以知晓深度学习所基于的人工神经网路技术的一些内容。我们这里使用深度学习的方式来对车牌字符进行识别, 为什么不用传统的机器学习进行识别呢, 看图就知道了:图2 深度学习右与PCA技术左的对比可以看出深度学习对于数据的分类能力的优势。这里博主使用生成对抗网络进行字符识别训练, 效果相当不错, 识别精度达到了98%2.3 SVM识别字符定义classSVM(StatModel):def__init__(self,C1,gamma0.5):self.modelcv2.ml.SVM_create()self.model.setGamma(gamma)self.model.setC(C)self.model.setKernel(cv2.ml.SVM_RBF)self.model.setType(cv2.ml.SVM_C_SVC)#训练svmdeftrain(self,samples,responses):self.model.train(samples,cv2.ml.ROW_SAMPLE,responses)调用方法喂数据deftrain_svm(self):#识别英文字母和数字self.modelSVM(C1,gamma0.5)#识别中文self.modelchineseSVM(C1,gamma0.5)ifos.path.exists(svm.dat):self.model.load(svm.dat)训练保存模型else:chars_train[]chars_label[]forroot,dirs,filesinos.walk(train\\chars2):iflen(os.path.basename(root))1:continueroot_intord(os.path.basename(root))forfilenameinfiles:filepathos.path.join(root,filename)digit_imgcv2.imread(filepath)digit_imgcv2.cvtColor(digit_img,cv2.COLOR_BGR2GRAY)chars_train.append(digit_img)#chars_label.append(1)chars_label.append(root_int)chars_trainlist(map(deskew,chars_train))chars_trainpreprocess_hog(chars_train)#chars_train chars_train.reshape(-1, 20, 20).astype(np.float32)chars_labelnp.array(chars_label)print(chars_train.shape)self.model.train(chars_train,chars_label)车牌字符数据集如下这些是字母的训练数据同样的还有我们车牌的省份简写:核心代码predict_result[]roiNonecard_colorNonefori,colorinenumerate(colors):ifcolorin(blue,yello,green):card_imgcard_imgs[i]gray_imgcv2.cvtColor(card_img,cv2.COLOR_BGR2GRAY)#黄、绿车牌字符比背景暗、与蓝车牌刚好相反所以黄、绿车牌需要反向ifcolorgreenorcoloryello:gray_imgcv2.bitwise_not(gray_img)ret,gray_imgcv2.threshold(gray_img,0,255,cv2.THRESH_BINARYcv2.THRESH_OTSU)#查找水平直方图波峰x_histogramnp.sum(gray_img,axis1)x_minnp.min(x_histogram)x_averagenp.sum(x_histogram)/x_histogram.shape[0]x_threshold(x_minx_average)/2wave_peaksfind_waves(x_threshold,x_histogram)iflen(wave_peaks)0:print(peak less 0:)continue#认为水平方向最大的波峰为车牌区域wavemax(wave_peaks,keylambdax:x[1]-x[0])gray_imggray_img[wave[0]:wave[1]]#查找垂直直方图波峰row_num,col_numgray_img.shape[:2]#去掉车牌上下边缘1个像素避免白边影响阈值判断gray_imggray_img[1:row_num-1]y_histogramnp.sum(gray_img,axis0)y_minnp.min(y_histogram)y_averagenp.sum(y_histogram)/y_histogram.shape[0]y_threshold(y_miny_average)/5#U和0要求阈值偏小否则U和0会被分成两半wave_peaksfind_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), thickness2)#车牌字符数应大于6iflen(wave_peaks)6:print(peak less 1:,len(wave_peaks))continuewavemax(wave_peaks,keylambdax:x[1]-x[0])max_wave_diswave[1]-wave[0]#判断是否是左侧车牌边缘ifwave_peaks[0][1]-wave_peaks[0][0]max_wave_dis/3andwave_peaks[0][0]0:wave_peaks.pop(0)#组合分离汉字cur_dis0fori,waveinenumerate(wave_peaks):ifwave[1]-wave[0]cur_dismax_wave_dis*0.6:breakelse:cur_diswave[1]-wave[0]ifi0:wave(wave_peaks[0][0],wave_peaks[i][1])wave_peakswave_peaks[i1:]wave_peaks.insert(0,wave)#去除车牌上的分隔点pointwave_peaks[2]ifpoint[1]-point[0]max_wave_dis/3:point_imggray_img[:,point[0]:point[1]]ifnp.mean(point_img)255/5:wave_peaks.pop(2)iflen(wave_peaks)6:print(peak less 2:,len(wave_peaks))continuepart_cardsseperate_card(gray_img,wave_peaks)fori,part_cardinenumerate(part_cards):#可能是固定车牌的铆钉ifnp.mean(part_card)255/5:print(a point)continuepart_card_oldpart_card wabs(part_card.shape[1]-SZ)//2part_cardcv2.copyMakeBorder(part_card,0,0,w,w,cv2.BORDER_CONSTANT,value[0,0,0])part_cardcv2.resize(part_card,(SZ,SZ),interpolationcv2.INTER_AREA)#part_card deskew(part_card)part_cardpreprocess_hog([part_card])ifi0:respself.modelchinese.predict(part_card)charactorprovinces[int(resp[0])-PROVINCE_START]else:respself.model.predict(part_card)charactorchr(resp[0])#判断最后一个数是否是车牌边缘假设车牌边缘被认为是1ifcharactor1andilen(part_cards)-1:ifpart_card_old.shape[0]/part_card_old.shape[1]7:#1太细认为是边缘continuepredict_result.append(charactor)roicard_img card_colorcolorbreakreturnpredict_result,roi,card_color#识别到的字符、定位的车牌图像、车牌颜色2.4 最终效果3 系统使用说明实验环境实验环境为Python3.6并安装了numpy、OpenCV、Pyqt5的包CoreTM i5-5200UCPU 2.20 GH4 GB RAM操作系统为Windows 10编程使用的工具是Pycharm和IDLE编程语言为Python。输入读入车牌图像。输出输出车牌图像的名称录入时间车牌号码车牌颜色类型以及识别耗时和车牌归属地。系统结果演示本系统的功能按钮包括“导入文件”、“显示分割结果”和“导出数据”。其中“导入文件”是指从文件夹中选取需要识别的车牌图像导入系统进行识别“显示分割结果”的功能是将选中的图像的车牌区域分割为单个的字符图像而“导出数据”是指将识别结果的列表以excel文件形式导出。系统界面如图所示。如图点击“打开文件”然后从测试集中选中一张图片点击“打开”。系统以列表的形式展示了该车牌图像的识别结果如图所示。其中系统界面的左下角为图片的车牌区域定位结果界面右侧的列表显示了识别的结果列表中的属性包括图片名称、录入图片的具体时间、识别该图片花的时间、车牌号码、车牌颜色类型以及车牌信息。识别结果的车牌号码为“京A·D77972”归属地为北京。识别结果与图中的牌照号码一致。点击“显示分割结果”从测试集中导入图片得到的分割结果如图所示。点击“导出文件”给即将导出的excel文档命名保存系统提示“数据已保存”如图所示。打开保存好的excel文件可以看到刚刚的识别结果以excel文档的形式储存完成如图所示。4 对应论文5 最后项目运行效果毕业设计 基于机器视觉的车牌识别系统 项目分享:见文末!