目录
第1章 绪论 1
1.1研究背景与意义 1
1.2课题研究现状 1
1.3研究目标 1
1.4研究内容与论文组织结构 1
第2章 相关理论与关键技术 3
2.1计算机视觉概述 3
2.2 Opencv计算机视觉函数库 3
2.3车牌规律 4
2.4车牌识别技术概要 5
2.5车牌识别系统流程 5
2.5.1车牌图像采集 5
2.5.2图像预处理 5
2.5.3车牌定位 5
2.5.4字符分割 6
2.5.5字符识别 6
第3章 系统的概要设计 8
3.1概要设计 8
3.2软件总体功能设计 8
3.2.1具体功能简介 8
3.3车牌识别的工作流程 9
第4章 详细设计与实现 11
4.1图像预处理 11
4.2车牌定位 12
4.3截图识别 16
4.4摄像头实时识别 18
4.5路径批量识别 19
4.6来自车牌图片信息识别 21
第5章 测试和结果分析 23
5.1系统测试方法 23
5.2功能测试 23
第6章 总结与展望 28
6.1项目不足 28
6.2研究展望 28
6.3总结语 28
参考文献 30
致谢 31
第3章 系统的概要设计
3.1概要设计
根据目前社会需要,车牌识别系统一般需要能够实现以下功能:
1.初始界面:初始界面对于用户来说是对该系统制作的“第一印象”,初始界面需要有简单明了的按键以及分区,用户通过这个界面就可以清楚的知道某一个按键或某一个分区的具体作用是什么,这样既提高了用户的使用舒适度,也提高了系统的使用效率。
2.车牌图像的预处理:通过捕捉车牌的图像后,车牌识别系统需要基于一定的图像处理算法来对车牌图像进行简单处理。
3.车牌定位:该模块通过使用一定的算法来进一步锁定车牌所在位置,目的是为了方便对车牌上的字符进行字符分割。
4.字符分割:基于上一步的车牌定位后我们可以锁定车牌所在位置,然后将定位到的车牌图片进行进一步的处理,将处理后的字符与模板库匹配从而获得单独的字符。
5.字符识别:识别字符分割后的单独的字符,将识别到的结果输出到屏幕上,识别成功。
3.2软件总体功能设计
在本系统中,实现的功能共有五个功能分别是:截图识别、摄像头实时识别、拍照识别、路径批量识别、来自图片识别。如图3.1所示为车牌识别系统功能框架。
图3.1车牌识别系统功能框架
3.2.1具体功能简介
最终搭建起的系统界面如图3.2所示,系统功能主要分为五个操作区域。
图3.2系统界面
(1)“截图识别”功能模块用户可以将显示界面的任何车牌图片进行截图,截图完成后将会自动上传至系统,系统会对截取到的车牌图片进行识别。
(2)“摄像头实时识别”功能模块用于连接系统指定的摄像头,并且在指定摄像头所捕获的图像进行进一步分析。该模块可以捕捉动态的图像,实时分析模式仅在低视频帧率、高的PC配置时才可以使用。因此用户在使用摄像头实时识别时会感到有卡顿。
(3)“拍照识别”功能模块,同摄像头实时识别一样连接系统指定的摄像头,并且在指定摄像头所捕获的图像进行分析。但与摄像头实时识别不同的是,拍照识别不能动态的对车牌进行识别,只能通过拍摄具体照片来进行车牌识别,也就是说从拍照识别转换为了静态图片识别。
(4)”路径批量识别”功能模块用于打开用户指定的文件夹,支持识别的图像格式为jpg、jpeg、png等图片格式,通过对大量图像的顺序命名可以实现图像的连续打开。
(5)“来自图片识别”功能模块用于选择打开单幅的jpg、jpeg、png图像使得系统对打开的车牌图片进行识别。
下面是摄像头实时识别的主要代码:
def video(self):
if self.thread_run:
if self.camera.isOpened():
self.camera.release()
print("关闭摄像头")
self.camera = None
self.thread_run = False
return
if self.camera is None:
self.camera = cv2.VideoCapture(1)
if not self.camera.isOpened():
self.camera = None
print("没有外置摄像头")
self.camera = cv2.VideoCapture(0)
if not self.camera.isOpened():
print("没有内置摄像头")
tkinter.messagebox.showinfo('警告', '摄像头打开失败!')
self.camera = None
return
else:
print("打开内置摄像头")
else:
print("打开外置摄像头")
self.text.configure(text="")
self.text2.configure(text="")
self.thread = threading.Thread(target=self.video_thread)
self.thread.setDaemon(True)
self.thread.start()
self.thread_run = True
self.camera_flag = 0
def get_imgtk(self, img_bgr):
img = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
im = Image.fromarray(img)
w, h = im.size
pil_image_resized = self.resize(w, h, im)
imgtk = ImageTk.PhotoImage(image=pil_image_resized)
return imgtk
def video_thread(self):
self.thread_run = True
while self.thread_run:
_, self.img_bgr = self.camera.read()
self.imgtk = self.get_imgtk(self.img_bgr)
self.image_ctl.configure(image=self.imgtk)
print("run end")