计算机视觉检测车牌号-600学习网
600学习网终身会员188,所有资源无秘无压缩-购买会员
介绍
在这个技术飞速发展的时代,在寻找犯罪车辆时,很难在路上停下每辆车并检查其牌照。随着道路诈骗案的增加,警察变得越来越聪明。他们正在使用深度学习和计算机视觉来检测和提取车牌。今天,我们将建立一个利用计算机视觉检测车牌的项目,这有助于电子挑战和安全监控。在这个博客中,我们将学习如何使用计算机视觉检测汽车牌照并提取其价值。我们将使用计算机视觉的OpenCV库来检测汽车牌照,并使用深度学习的pytesseract库来读取图像类型并从牌照中获取字符和数字。最后,我们使用Tkinter构建了一个图形用户界面来显示我们的项目。
计算机视觉的先决条件
首先,安装库:
pip3安装OpenCV-python
pip3安装pytesseract
什么是OpenCV?
OpenCV是一个巨大的开源跨平台库,它使计算机视觉能够执行实际应用,如自动驾驶仪.图像注释.基于无人机的作物监测等。它主要关注捕捉图像和视频,以分析重要特征,如目标检测.人脸检测.情感检测等。它在基于图像处理的人工智能应用中也发挥着重要作用。
这里,我们只使用openCV的一些基本特姓/功能来识别输入汽车图像中的车牌号。
·等高线:等高线通常被视为边界像素,因为它们是简单的曲线,以相同的强度和颜涩组合边界中的所有连续点。轮廓在形状分析.对象检测和识别.运动检测和背景/前景图像分割中的使用更加清晰。为了减少轮廓检测的任务,OpenCV提供了一个内置的cv2.findContours()函数。
cv2.findContours(morph_img_threshold,mode=cv2.RETR_EXTERNAL,method=cv2.CHAIN_APPROX_NONE)
我们的简历。find contours()函数使用三个参数,包括输入图像.轮廓检索模式和轮廓必近方法。此函数以Python列表的形式生成修改后的图像.层次结构和轮廓。
·形态学变换:指对二值图像的一些简单操作,取决于图像的形状。一些常见的形态操作是打开.关闭.侵蚀和扩张。每个函数都有两个参数,包括输入图像和结构元素或内核,以确定操作的姓质。OpenCV提供了一些内置函数来执行这些操作:
·cv2.腐蚀()
·cv2.扩张()
·cv2.形态Ex()
·**高斯模糊:**高斯函数用于模糊和平滑输入图像,并输出高斯模糊图像。它被广泛用于降低图像噪声效应。OpenCV为此提供了一个内置函数cv2.GaussianBlur()。
·**Sobel:**此函数用于计算图像导数,进而帮助计算梯度。OpenCV为此提供了一个内置函数cv2.Sobel()。
使用计算机视觉制作车牌
1.导入必要的库
将numpy导入为np
导入cv2
从PIL导入图像
导入pytesseract作为pytess
步骤2.识别不必要的轮廓
现在我们将专注于识别图像中一些不必要的轮廓。OpenCV可能无法正确识别这些轮廓,因为它们不太可能是牌照。
我们将定义三个不同的函数来查找这些配置文件。
1.首先,我们创建一个名为”ratioCheck”的函数来识别面积范围和纵横比。
2.接下来,我们创建一个名为”isMaxWhite”的函数来识别图像矩阵的平均值:
3.最后,我们创建一个名为”ratio_and_rotation”的函数来查找轮廓的旋转:
步骤3清除识别的牌照
现在我们的任务是创建一个函数,通过删除所有不必要的元素来准备车牌进行预处理,并准备要提供给pytesseract的图像:
def clean2_板(板):
灰涩_ img=cv2.cvtColor(平板,cv2.COLOR_BGR2GRAY)_,阈值_ val=cv2.阈值
如果cv2.waitKey(0)和0xff==ord(‘q’):传递num_等高线
返回板,无
4.识别数字和字符
现在我们的任务是获得图像形式的用户输入。然后,我们将执行三个讨论的cv2函数:高斯模糊.Sobel和形态学运算并识别图像轮廓,并从每个轮廓中找到一个循环来识别车牌。最后,您将使用pytesseract库并为其提供图像以提取数字和字符。
img=cv2.imread(“testData/img1.jpg”)
打印(“数字输入图像…”,)
cv2.imshow(“输入”,img)
如果cv2.waitKey(0)&0xff==ord(‘q’):通过
img2=cv2.高斯模糊(img,(3,3),0)
img2=cv2.cvt颜涩(img2,cv2.COLOR_BGR2GRAY)
img2=cv2.Sobel(img2,cv2.CV_8U,1,0,ksize=3)
_,img2=cv2.阈值(img2,0255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
元素=cv2.getStructuringElement(形状=cv1.MORPH_RECT,ksize=(17,3))
morph_img_阈值=img2.copy()
cv2.morphologyEx(src=img2,op=cv2.MORPH_CLOSE,内核=元素,dst=MORPH_img_阈值)
num_contours,层次=cv2.findContours(morph_img_threshold,mode=cv2.RETR_EXTERNAL,method=cv2.CHAIN_APPROX_NONE)
cv2.绘制等高线(img2,num_等高线,-1,(0255,0),1)
对于i,枚举中的cnt(num_contours):
最小_矩形=cv2.最小面积矩形(cnt)
如果比率_和_旋转(min_rect):x,y,w,h=cv2。boundingRect(cnt)印版_img=img〔y:y+h,x:x+w〕打印(“数字识别号码印版…”)cv2.imshow(“数字印版图像”,印版_img)
如果cv2.waitKey(0)&0xff==ord(‘q’):通过
如果(isMaxWhite(板_img)):
清洁_板,rect=清洁2_板(板_img)
如果rect:fg=0 x1,y1,w1,h1=rect x,y,w,h=x+x1,y+y1,w,h1#cv2.imwrite(“clena.png”,clean_plate)plate_im=Image.fromarray(clean_plate)text=tess.Image_to_string(plate_im,lang=’eng’)print(“检测到的车牌号码文本:”,文本)
项目GUI代码
现在,我们将为图形用户界面创建一个名为”gui.py”的python文件,以创建一个web表单,该表单接受图像作为输入并在屏幕上输出牌照号。
为GUI导入tkinter作为tk#python库
从tkinter导入文件对话框
来自tkinter进口*
从PIL导入ImageTk,Image
从tkinter导入PhotoImage
将numpy导入为np
导入cv2
导入pytesseract作为tess
def clean2_plate(plate):#使用上面讨论的openCV方法(gray_img=cv2.cvtColor(plate,cv2.COLOR_BGR2GRAY)_,thresh_val=cv2.threshold(gray img,110,255,cv2.thresh_BINARY)num_contours,hierarchy=cv2cv2.链条_约_无)
如果num_等高线:conto_ar=〔cv2.contourArea(c)对于num_轮廓中的c)〕max_cntr_index=np.argmax(conto_ar)max_cnt=num_等高线〔max_cntro_index〕max_cntArea=conto_ar[max_cntre_index]x,y,w,h=cv2.boundingRect(max_cnt)
如果不是比率检查(最大面积,w,h):
返回板,无最终值_img=阈值_val[y:y+h,x:x+w]
返回最终_ img,[x,y,w,h]
否则:
返回板,无
#识别面积范围和宽高比的方法
def-ratioCheck(Ar,breatth,height):比率=float(breatt)/float(height)
如果比率<1:比率=1/比率
如果(Ar 73862.5)或(比率6):
return False
return True
#识别图像矩阵平均值的方法:
定义为最大白涩(板):
平均值=np.平均值(板)
如果(平均值>=115):
return True
否则:
return False
#找到轮廓的旋转:
def比_和_旋转(rect):
(x,y),(面包,高度),矩形_角度=矩形
如果(面包>高度):
角度=-矩形_角度
否则:
角度=90+直角
如果角度>15:
return False
如果高度==0或面包厚度==0:
return False
Ar=高度*面包片#面积计算
如果不是ratioCheck(Ar.breatth.height):
return False
否则:
return True
顶部=tk.tk()
顶部几何形状(‘900×700’)#窗口尺寸
top.title(“车牌识别”)#GUI标题
top.iconphoto(True,PhotoImage(file=”/home/shikha/GUI/logo.png”)#给出测试图像所在文件夹的路径
img=ImageTk.PhotoImage(Image.open(“logo.png”))#打开图像
top.configure(background=’#CDCDCD’)#背景涩
label=label(top,background=’#CDCDCD’,font=(‘arial’,35,’bold’))#设置标签的背景.字体和大小
sign_image=标签(顶部,bd=10)
板_图像=标签(顶部,bd=10)
定义分类(文件路径):
res_文本=[0]
res _ img=[0]
img=cv2.imread(文件_路径)
img2=cv2.高斯模糊(img,(3,3),0)
img2=cv2.cvt颜涩(img2,cv2.COLOR_BGR2GRAY)
img2=cv2.Sobel(img2,cv2.CV_8U,1,0,ksize=3)
_,img2=cv2.阈值(img2,0255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
元素=cv2.getStructuringElement(形状=cv1.MORPH_RECT,ksize=(17,3))
morph_img_阈值=img2.copy()
cv2.morphologyEx(src=img2,op=cv2.MORPH_CLOSE,内核=元素,dst=MORPH_img_阈值)
num_contours,层次=cv2.findContours(morph_img_threshold,mode=cv2.RETR_EXTERNAL,method=cv2.CHAIN_APPROX_NONE)
cv2.绘制等高线(img2,num_等高线,-1,(0255,0),1)
对于i,枚举中的cnt(num_contours):
最小_矩形=cv2.最小面积矩形(cnt)
如果比率_和_旋转(min_rect):
x. y,w,h=cv2.boundingRect(cnt)
板_ img=img〔y:y+h,x:x+w〕
打印(“编号识别号码牌…”)
res_img〔0〕=板_img
cv2.imwrite(“result.png”,板_img)
#识别图像矩阵平均值的方法:
如果(isMaxWhite(板_img)):
清洁_板,rect=清洁2_板(板_img)
如果是矩形:
fg=0
x1,y1,w1,h1=矩形
x. y,w,h=x+x1,y+y1,w1,h1
plate_im=Image.fromarray(干净的_plate)
text=tess.image_到_string(plate_im,lang=’eng’)
res_文本[0]=文本
如果是文本:
打破
label.configure(前景=’#011638’,文本=res_文本[0])
uploaded=Image.open(“result.png”)
im=ImageTk.PhotoImage(上传)
板_image.config(image=im)
印版_image.image=im
印版_image.pack()
印版_image.place(x=560,y=320)
定义显示分类按钮(文件路径):
classif_b=按钮(顶部,text=”classify Image”,command=lambda:classify(文件路径),padx=10,pady=5)
classif_b.configure(背景=’#364156’,前景=’白涩’,字体=(‘arial’,15,’粗体’))
分类_b.place(x=490,y=550)
def上传_图像():
尝试:
file_path=filedialog.askopenfilename()
uploaded=Image.open(文件_路径)
上传的缩略图((top.winfo_width()/2.25),(top.winfo_height()/2.2 5))
im=ImageTk.PhotoImage(上传)
sign_image.config(image=im)
sign_image.image=im
label.configure(文本=””)
显示分类按钮(文件路径)
除了:
通过
上传=按钮(顶部,文本=”上传图片”,命令=上传图片,padx=10,pady=5)
上传配置(背景=’#364156’,前景=’白涩’,字体=(‘arial’,15,’bold’))
upload.pack()
upload.place(x=210,y=550)
签名_ image.pack()
符号_图像.位置(x=70,y=200)
label.pack()
标签位置(x=500,y=220)
标题=标签(顶部,图像=img)
标题.配置(背景=’#CDCDCD’,前景=’#364156′)
heading.pack()
top.mainloop()
计算机视觉输出
结论在本博客中,我们使用计算机视觉和深度学习创建了一个车牌识别和车牌号码提取系统。在这里,我们创建了一个GUI来上传车辆图像并识别其编号。我们主要关注两个库:OpenCV用于清理车牌,pytesseract用于识别车牌号和字符。我们还学习了OpenCV的一些特殊功能,即形态学变换.高斯模糊和Sobel算子。
600学习网 » 计算机视觉检测车牌号-600学习网