安全一直是人类的主要关切。今天,我们在学校,医院和每个其他公共场所都配备了视频监控摄像头,使我们感到安全。根据HIS的一项调查,估计到2014年大约安装了2.45亿个安全摄像头并开始运行,这就像地球上每30人拥有一个安全摄像头一样。随着技术的进步,尤其是图像处理和机器学习中的技术进步,可以通过培训这些相机处理视频源中的信息来使这些相机变得更智能。
这些摄像机提供的视频可用于执行人脸识别,模式分析,情感分析等,这实际上可以使它接近FF7电影中显示的“上帝之眼”之类的东西。实际上,像海康威视这样的监视公司以及许多其他公司已经开始在其产品中实现这些功能。我们以前使用MATLAB Image处理来读取车牌,今天在本文中,我们将学习如何使用Raspberry Pi和OpenCV从汽车中识别和读取车牌号。我们将使用Google提供的一些随机车辆图像,并编写一个程序来使用OpenCV轮廓检测识别车牌,然后使用Tesseract OCR从车牌上读取车牌。听起来很有趣吧!,让我们开始吧。
先决条件
如前所述,我们将使用OpenCV库检测和识别人脸。因此,在继续本教程之前,请确保在Raspberry Pi上安装OpenCV库。还可以使用2A适配器为Pi供电,并将其连接到显示监视器,以方便调试。
如果您有兴趣学习图像处理,那么本教程将不会解释OpenCV的工作原理,请查看此OpenCV基础知识和高级图像处理教程。您还可以在本图像分割教程中使用OpenCV了解轮廓,斑点检测等信息。我们将做类似的事情来从图像中检测汽车的车牌。
使用Raspberry Pi进行车牌识别的步骤
车牌识别或简称LPR,涉及三个主要步骤。步骤如下
1.车牌检测:第一步是从汽车上检测车牌。我们将在OpenCV中使用轮廓选项来检测矩形对象以找到车牌。如果我们知道车牌的确切尺寸,颜色和大致位置,则可以提高准确性。通常,将根据摄像机的位置和该特定国家/地区所使用的车牌类型来训练检测算法。如果图像甚至没有汽车,这将变得更加棘手,在这种情况下,我们将采取另一步骤检测汽车,然后检测车牌。
2.字符分割:检测到车牌后,我们必须将其裁剪并保存为新图像。同样,这可以使用OpenCV轻松完成。
3. 字符识别:现在,我们在上一步中获得的新图像肯定可以写上一些字符(数字/字母)。因此,我们可以对其执行OCR(光学字符识别)以检测数字。我们已经使用Raspberry Pi解释了光学字符识别(OCR)。
1.车牌检测
此Raspberry Pi牌照读取器的第一步是检测牌照。让我们为汽车拍摄示例图像,首先检测该汽车上的车牌。然后,我们还将使用相同的图像进行字符分割和字符识别。如果您想直接进入代码而无需解释,则可以向下滚动至此页面的底部,其中提供了完整的代码。我在本教程中使用的测试图像如下所示。
第1步: 将图像调整为所需大小,然后将其灰度。相同的代码如下
img = cv2.resize(img,(620,480)) 灰色= cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#转换为灰度
调整大小后,我们将帮助我们避免使用较大分辨率的图像出现任何问题,请确保在调整大小后,车号牌仍保留在框架中。灰度在所有图像处理步骤中都很常见。这加快了其他后续处理的速度,因为我们在处理图像时不再需要处理颜色细节。完成此步骤后,图像将像这样被转换
步骤2:每张图片都会包含有用和无用的信息,在这种情况下,对于我们来说,只有牌照是有用的信息,其余的对于我们的程序几乎是无用的。这种无用的信息称为噪声。通常,使用双边滤镜(模糊)会从图像中删除不需要的细节。相同的代码是
灰色= cv2.bilateralFilter(灰色,11,17,17)
语法为 destination_image = cv2.bilateralFilter(source_image,像素直径,sigmaColor,sigmaSpace)。 您可以将sigma颜色和sigma空间从17增加到更高的值,以模糊掉更多的背景信息,但请注意不要使有用的部分模糊。输出图像如下所示,因为您可以看到背景细节(树木和建筑物)在该图像中模糊。这样,我们可以避免程序以后将精力集中在这些区域。
步骤3:下一步是我们进行边缘检测的有趣步骤。有很多方法可以做到,最简单和流行的方法是使用OpenCV的canny edge方法。执行相同操作的行如下所示
edged = cv2.Canny(灰色,30,200)#执行边缘检测
语法为 destination_image = cv2.Canny(source_image,thresholdValue 1,thresholdValue 2)。 阈值谷1和阈值2是最小和最大阈值。仅显示强度梯度大于最小阈值且小于最大阈值的边缘。结果图像如下所示
步骤4:现在我们可以开始在图像上寻找轮廓了,我们已经在上一个教程中学习了如何使用OpenCV查找轮廓,因此我们可以像以前一样进行。
nts = cv2.findContours(edged.copy(),cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) cnts = sorted(cnts,key = cv2.contourArea,reverse = True) screenCnt = None
一旦检测到计数器,我们就将它们从大到小进行排序,并只考虑前10个结果而忽略其他结果。在我们的图像中,计数器可以是具有闭合表面的任何事物,但是在所有获得的结果中,牌照号码也将存在,因为它也是闭合表面。
为了在获得的结果中过滤车牌图像,我们将遍历所有结果,并检查其具有四个侧面和闭合图形的矩形轮廓。由于车牌肯定是矩形的四边形。
# 在cnts中 循环遍历c的轮廓 :#近似轮廓peri = cv2.arcLength(c,True) 近似= cv2.approxPolyDP(c,0.018 * peri,True) #如果我们近似的轮廓有四个点,则 #可以假设 len(approx)== 4时 我们已经找到了我们的屏幕:screenCnt =大约 中断
0.018为实验值;您可以围绕它进行检查,以找出最适合您的。或者通过使用机器学习根据汽车图像进行训练,然后在此处使用正确的值,将其提升到一个新的水平。找到正确的计数器后,我们将其保存在名为 screenCnt 的变量中,然后在其周围绘制一个矩形框,以确保我们已正确检测到车牌。
步骤5:现在我们知道车牌在哪里,剩下的信息对我们来说几乎没有用。因此,我们可以掩盖整个图片,除了车牌所在的位置。相同的代码如下所示
#遮罩车牌以外的其他部分 mask = np.zeros(gray.shape,np.uint8) new_image = cv2.drawContours(mask,, 0,255,-1,) new_image = cv2.bitwise_and(img,img,mask =面具)
被遮罩的新图像将如下所示
2.字符分割
Raspberry Pi车牌识别的下一步是通过裁剪车牌并将其保存为新图像,将车牌从图像中分割出来。然后,我们可以使用此图像来检测其中的字符。下面显示了从主图像裁剪出ROI(感兴趣区域)图像的代码
#现在裁切 (x,y)= np.where(mask == 255) (topx,topy)=(np.min(x),np.min(y)) (bottomx,bottomy)=(np.max( x),np.max(y)) 裁剪=灰色
结果图像如下所示。通常添加到裁剪图像中,如果需要,我们还可以对其进行灰色处理和边缘化。这样做是为了改善下一步的字符识别。但是我发现即使使用原始图像也可以正常工作。
3.字符识别
Raspberry Pi车牌识别的最后一步是从分割的图像中实际读取车牌信息。就像前面的教程一样,我们将使用 pytesseract 包从图像读取字符。相同的代码如下
#读取车牌 文本= pytesseract.image_to_string(Cropped,config ='-psm 11') print(“ Detected Number is:”,text)
我们已经说明了如何配置Tesseract引擎,因此在此处再次根据需要配置Tesseract OCR,以便在需要时获得更好的结果。然后将检测到的字符打印在控制台上。编译后的结果如下图所示
如您所见,原始图像上印有数字“ HR 25 BR9044”,并且我们的程序已检测到它在屏幕上打印了相同的值。
车牌识别失败案例
可以从此处下载Raspberry Pi牌照识别的完整项目文件,其中包含程序和我们用来检查程序的测试图像。不用说,要记住,此方法的结果将不准确。精度取决于图像的清晰度,方向,曝光量等。为了获得更好的结果,您可以尝试同时实现机器学习算法。
为了让您有个好主意,让我们看另一个示例,其中汽车没有直接面对相机。
如您所见,我们的程序能够正确检测车牌并进行裁剪。但是, Tesseract 库无法正确识别字符。OCR已将其识别为“ 1508 ye 3396”,而不是实际的“ TS 08 UE 3396”。通过使用更好的方向图像或配置 Tesseract 引擎,可以纠正此类问题。
另一个最坏的情况是轮廓无法正确检测车牌。下图显示了太多的背景信息和不良照明,程序甚至无法从该号码中识别出车牌。在这种情况下,我们必须再次依靠机器学习或提高图片质量。
其他成功的例子
大多数时候,图像质量和方向都是正确的,程序能够识别车牌并从中读取编号。以下快照显示了很少获得成功的结果。同样,此处提供的ZIP文件中还将提供此处使用的所有测试图像和代码。
希望您了解使用Raspberry Pi进行自动车牌识别的过程,并喜欢自己构建一些很棒的东西。您认为OpenCV和Tesseract还可以做什么?在评论部分让我知道您的想法。如果您对本文有任何疑问,请随时将其留在下面的评论部分中,或使用论坛进行其他技术查询。