使用 OpenCV、Imultis 和 EasyOCR 进行自动车牌检测
在过去的几篇文章中,我们已经介绍了一些基本的图像处理概念和OpenCV库。让我们利用这些知识来解决一些现实生活中的问题。今天,我们将制作一个计算机视觉项目,允许汽车根据车牌号进入特定的物体或车库。此外,我们将向您展示如何使用两个在本项目中派上用场的附加库。
在本文中,我们将介绍:
要求和安装概述解释代码最终结果1. 要求如果您想关注我们,请确保您已安装 python3.6 或更高版本。您还需要安装:OpenCV(用于图像处理),Easyocr(用于从图像读取)和Imutils(用于轮廓操作)。执行此操作的最佳方法是在命令行中运行以下代码。
pip install easyocrpip install imutilspip install opencv-python2. 概述
目标是定义允许进入的汽车车牌号列表,并根据我们提供给算法的汽车图片,它将告诉我们是否授予了该汽车的访问权限。现在让我们解释一下我们计划如何做到这一点。这个想法是找到图像的轮廓,然后根据统计几率,车牌将是唯一一个在图像中用 4 个点定义的多边形状轮廓。
这因图片而异,但明智的假设是在现实生活中解决这个问题时,所有照片都将从相同的角度拍摄。检测到车牌后,我们将使用 EasyOCR 从图片中读取字母和数字,并将它们存储为字符串。之后我们要做的就是检查车牌号是否与现有车牌号匹配。现在让我们开始编码。
3. 代码解释让我们首先加载一个图像并查看其车牌。
import numpy as npimport cv2 import easyocrimport imutilsfrom googlelab.patches import cv2_imshow#Loading the pictureimg = cv2.imread('car1.png')cv2_imshow(img)
正如我们所看到的,该板是“PL8REC”。现在我们将定义一个包含此车牌号和两个附加随机数的列表。在我们完成算法后,这辆车应该被授予访问权限。稍后我们将从列表中删除这辆车,看看会发生什么。
valid_licence_plates = ['PL8RSC', 'SP34AS', 'TEA34S']
正如我们已经说过的,这个想法是找到此图像上的所有轮廓,然后找到定义看起来像多边形并在空间中定义 4 个点的轮廓。在此之前,我们将对图像应用高斯模糊。
原因是我们可以通过模糊图像来减少找到的总边缘的数量,同时仍然保留图像的重要部分,即汽车。让我们看看执行Canny边缘检测时正常图像和模糊图像之间的区别。
#Converting the image to gray-scaleimage_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#Blurring the image with a 11x11 maskblured_image = cv2.GaussianBlur(image_gray,(11,11),0)#Finding the edges of the non blurred imageedge_image_blur = cv2.Canny(blured_image,30,100)#Finding the edges of blurred imageedge_image_normal = cv2.Canny(image_gray,30,100)cv2_imshow(edge_image_normal)cv2_imshow(edge_image_blur)
正如我们所看到的,找到的边缘总数之间的差异非常大。我们应该注意,在选择高斯模糊的参数时必须小心,因为选择太大的蒙版会导致您丢失重要信息。现在让我们找到基于此图像的所有轮廓。
#Finding points of contourskey_points=cv2.findContours(edge_image_blur,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)#defining contours from keypointscontours = imutils.grab_contours(key_points)#drawing contourscv2.drawContours(img, contours, -1, (0,255,0), 3)cv2_imshow(img)
参数 cv2。RETR_LIST指定我们想要所有的轮廓,没有任何特定的层次结构和 cv2。CHAIN_APPROX_SIMPLE返回构造等值线所需的最小点数。使用 Imutils,我们将基于这些点组装轮廓,最后使用 cv2.drawContours,我们将在原始图像上绘制轮廓。
好的,现在我们有了图像的轮廓,我们应该尝试找到代表我们车牌的小矩形。正如我们之前提到的,我们将假设我们的图像在按面积排列的前二十个轮廓中只有一个矩形形状,从大到小。因此,让我们按此顺序对它们进行排序。
之后,我们将需要 cv2roxPolyDP 函数来使用 n 顶点多引线近似每个轮廓。当然,当我们得到一个矩形近似值时,我们发现的顶点数将是四个。空间中的这四个点将代表我们板块的位置。
contours = sorted(contours, key=cv2ntourArea, reverse=True)[:20]plate_location = Nonefor cnt in contours: sqaure_approx = cv2roxPolyDP(cnt, 10, True) if len(sqaure_approx) == 4: plate_location = sqaure_approxprint(plate_location)#Output:#[[[299 281]]#[[445 278]]#[[449 305]]#[[303 311]]]
伟大!我们找到了我们的车牌。现在我们需要做的就是在这些位置裁剪图像以提取车牌。我们将找到 x 轴和 y 轴的最大值和最小位置,这些值将代表我们的边界。
x1, x2 = min(plate_location[:,0][:,1]), max(plate_location[:,0][:,1])y1, y2 = min(plate_location[:,0][:,0]), max(plate_location[:,0][:,0])cropped_image = image[x1:x2, y1:y2]cv2_imshow(cropped_image)
之后,让我们定义一些我们将要称为读者的东西。读者将是类 Reader 的对象,它只接受一个参数 [“en”],它告诉读者我们在图像中使用什么语言。读取器是来自名为 EasyOCR 的第三方库中的类,其中 OCR 代表光学字符识别。它使用起来非常简单,我们建议您进一步阅读。
我们告诉读者使用方法read_text从上图阅读。Read_text输出返回一个非常不寻常的元组列表,其中包含文本位置、读取的文本、是否有效读取的确定性等。我们感兴趣的是放置在列表每个元组中倒数第二位的文本。为了提取和连接我们读取的所有字符串,我们将使用 map 函数。
x1, x2 = min(plate_location[:,0][:,1]), max(plate_location[:,0][:,1])y1, y2 = min(plate_location[:,0][:,0]), max(plate_location[:,0][:,0])cropped_image = image[x1:x2, y1:y2]cv2_imshow(cropped_image)reader = easyocr.Reader(['en'])all_reads = reader.readtext(cropped_image)license_plate = "".join(map(lambda read: read[-2], all_reads))print(license_plate)#Output#PL8REC
现在我们有了车牌号,我们可以根据该号码是否在我们的列表中在屏幕上显示我们的答案。我们将在车牌周围画一个矩形,并告诉司机是否允许他进入。如果他在列表中,消息将显示为绿色,而在相反的情况下,将显示红色。正如我们所知,我们将他列入名单,我们期待一个绿色信息。
if license_plate in valid_licence_plates: cv2.rectangle(image, pt1=(y1, x1), pt2=(y2, x2), color=(0, 255, 0), thickness = 5) cv2.putText(image, 'Access Allowed', (y1 - 30,x2 + 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2, cv2.LINE_AA)else: cv2.rectangle(image, pt1=(y1, x1), pt2=(y2, x2), color=(0, 0, 255), thickness = 5) cv2.putText(image, 'Access Denied', (y1 - 30,x2 + 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2, cv2.LINE_AA)
如果由于某种原因我们将这辆车从列表中删除。我们将显示类似这样的内容。
valid_licence_plates.remove("PL8REC")
3. 结论正如我们所看到的,我们已经设法非常简单地构建了这个小而有用的应用程序。OpenCV在现实生活中的项目非常棒。它在安全,体育,工业,娱乐等方面有很多应用。当您需要操纵某些电气设备(如坡道或门)时,可以在此类项目中使用微控制器实现。可能性是无穷无尽的。在接下来的几篇文章中,我们将探索一些更伟大的事情,包括为我们的计算机视觉项目导入实时视频片段。敬请期待。
原文标题:Automatic License Plate Detection with OpenCV, Imultis and EasyOCR
原文链接:https://rubikscode/2022/06/27/automatic-license-plate-detection-with-opencv-imultis-and-easyocr/
作者:Stefan Nidzovic/Milos Marinkovic
编译:LCR
给电动车上个“牌”,就算“上牌”了?快查查您的看是不是套牌
大河报·大河客户端记者 李帅
4月8日,大河报AⅠ·07版以《给电动车上个“牌”,就算“上牌”了?》为题,报道了郑州市民李先生购买电动车上牌时,商家仅仅只给他上个牌,没有上传信息,也没有安装防盗定位器.....其间,还有业内人士透露,一些不良商家使用套牌、假牌蒙骗消费者。该报道刊发后,引起了很多市民关注,有不少市民纷纷表示他们也遭遇过此类情况。还有市民通过查询,已证实自己的电动车牌照为套牌。
(图片说明:小雨新电动车上的牌照,已查询核实为套牌)
反映:看完报道查询后,她发现自己电动车牌照是套牌
据反映市民小雨(化名)说,3月18日,她与妹妹一同在郑州市航海路上的一家电动车销售门店内,各自买了一辆新电动车。当时,卖电动车的工作人员给她们上车牌时,也是没有安装防盗定位器,没有使用防盗螺丝。至于是否上传信息,她也不清楚,工作人员只让她填写了一张表格,之后她就没有过多在意!直到4月15日上午,她无意中看到了大河报的报道,通过一番查询后,她才发现自己的电动车牌照是套牌。
“我打电话咨询上牌客服,对方查询后,说我的车牌登记信息和我的电动车品牌、颜色,以及我个人的车主信息完全不同,我的车牌就是个套牌!”小雨说,她看完报道后,先是通过微信与卖电动车工作人员联系,询问对方是否将她的购车上牌信息上传,对方工作人员回复说已将信息上传。可仍不放心的她,又通过大河报报道中提到的智慧家园e客服咨询,结果查询到牌照登记信息与她的电动车信息完全不一致,客服人员说她的电动车牌照是套牌,还让她赶快找商家更换正规牌照。
小雨说,得知自己电动车牌照是套牌后,她就立即打电话与卖电动车的工作人员联系,将查询到的套牌情况告诉对方,并要求更换正规牌照。卖电动车的工作人员没有任何解释,只说了一句‘你来吧’。为此,她已和妹妹联系,计划下班后就去更换正规牌照。“要不是看到大河报的报道,我还不知道自己的电动车牌照是套牌!”
(图片说明:记者体验查询,发现自己所骑电动车牌照也是套牌)
体验:记者查询所骑家人电动车牌,结果牌照也是套牌
采访中,像小丽所遭遇的情况并非偶然,此前还有不少市民也曾向记者反映,称他们在购买电动车上牌时,也是被商家上个牌,没有安装防盗定位器,没有使用防盗螺丝,也不知道信息是否上传。由于他们过于忙碌,或不知道如何查询电动车牌照等原因,一直不了了之。
为还原查询过程,让更多市民了解如何查询电动车牌照,记者便将采访时所骑的家人电动车牌照进行了现场查询,可查询结果也是套牌。
4月15日上午10时许,记者在现场采访中,拨打了微信公众号关注的智慧家园e——电车服务——服务热线4001109922。当电话接通后,记者向客服人员表示想查询一下自己的电动车牌照,并报上了车牌号。随后,客服人员询问了电动车品牌、购车地址、以及颜色、车主名称后,表示记者的电动车与车牌登记的电动车信息不一致,车主名字也不是同一人,车牌是套牌,记者当时也蒙了。
此外,还有市民反映,他们还发现了一种奇怪的电动车牌照,牌照号上所标注的文字不是普通牌照上的‘郑州、防盗备案号’字样,而是某电动车品牌名称,如下图中:雅迪、人车全保 丢车包赔。对此,反映市民非常疑惑,这样的电动车牌照是否正规?
对此,采访中,据智慧家园e客服人员表示,印有商家名称的电动车牌照,都是商家自己做的假牌照,不是正规牌照。
(图片说明:与普通电动车牌照信息不一样的商家牌照)
进展:郑州非机动车管理办法已开始征集,登记办法将由交通管理部门制定
在此前的报道中,据常年销售电动车的业内人士刘女士说,电动车上牌安装都是商家自己负责,没有监管,这就导致很多牌照已失去防盗功能。另外,遇到此类情况,购车市民只能找商家要求更换正规牌照。那么,如今一个星期过去了,电动车上牌安装监管是否有新的变化?
为此,记者通过网络查询发现,在4月14日,郑州市司法局公告了《郑州市非机动车管理办法(征求意见稿)》(以下:《办法(征求意见稿)》),向社会公开征求意见。其中,在该《办法(征求意见稿)》第四条、第十三条中,明确提出由公安机关交通管理部门负责非机动车的登记、上牌和通行管理;电动自行车具体登记办法由市公安机关交通管理部门制定。
4月15日下午,记者致电郑州市公安局交警支队,并将采访中发现的问题反馈给该支队相关工作人员。据该支队相关工作人员表示,目前,《办法(征求意见稿)》还在向社会公开征求意见。在该《办法(意见征求稿)》开始实施,至非机动车登记、上牌移交给他们管理之前,他们将会在此空当期间,及时对非机动车登记、上牌出现的各种问题进行研究。
下一步,等《办法(征求意见稿)》开始实施后,他们将会对非机动车假牌、套牌等违法违规情况进行严格管理,同时追究相关人员的法律责任。
来源:大河客户端 编辑:侯昺昊