关键词搜索

源码搜索 ×
×

Python文档阅读笔记-Number Plate Recognition with OpenCV and EasyOCR

发布2023-03-06浏览1534次

详情内容

此篇博文将带领大家使用OpenCV和EasyOCR包进行车牌识别。

EasyOCR是Python的一个开源包用于进行图片文字识别也就是OCR(Optical Character Recognition)。

这个包用起来非常简单,并且他支持80种语言,其中就包括中文、英文、阿拉伯语等。

安装EasyOCR

使用如下命令:

pip install easyocr

注意,在本博文写的时候(2022-02-28)OpenCV版本4.5.5.62和EasyOCR不兼容。所以需要使用OpenCV4.5.4.60。

使用下面的命令进行安装:

pip install opencv-python==4.5.4.60

 随后安装opencv-contrib-python:

pip install opencv-contrib-python==4.5.4.60

如果已经安装得有opencv-python和opencv-contrib-python可以使用如下命令进行反安装:

  1. pip uninstall opencv-python
  2. pip uninstall opencv-contrib-python

然后再重新安装:

pip install opencv-python==4.5.4.60

车牌号识别

创建一个Python文件,并添加如下代码:

  1. from easyocr import Reader
  2. import cv2
  3. # load the image and resize it
  4. image = cv2.imread('image1.jpg')
  5. image = cv2.resize(image, (800, 600))

首先需要导入依赖包,然后重新设置下图片的大小。

随后初始化图片:

  1. # convert the input image to grayscale,
  2. # blur it, and detect the edges
  3. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  4. blur = cv2.GaussianBlur(gray, (5,5), 0)
  5. edged = cv2.Canny(blur, 10, 200)
  6. cv2.imshow('Canny', edged)
  7. cv2.waitKey(0)
  8. cv2.destroyAllWindows()

下面是预处理下图片

  1. # convert the input image to grayscale,
  2. # blur it, and detect the edges
  3. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  4. blur = cv2.GaussianBlur(gray, (5,5), 0)
  5. edged = cv2.Canny(blur, 10, 200)
  6. cv2.imshow('Canny', edged)
  7. cv2.waitKey(0)
  8. cv2.destroyAllWindows()

首先将图片转换为灰度图,再通过高斯滤波删除一些干扰信息,最后进行边缘检测。

输出的图片如下:

下面,通过通过边缘检测的轮廓,获取车牌的轮廓:

  1. # find the contours, sort them, and keep only the 5 largest ones
  2. contours, _ = cv2.findContours(edged, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  3. contours = sorted(contours, key = cv2.contourArea, reverse = True)[:5]
  4. # loop over the contours
  5. for c in contours:
  6. # approximate each contour
  7. peri = cv2.arcLength(c, True)
  8. approx = cv2.approxPolyDP(c, 0.02 * peri, True)
  9. # if the contour has 4 points, we can say
  10. # that we have found our license plate
  11. if len(approx) == 4:
  12. n_plate_cnt = approx
  13. break
  14. # get the bounding box of the contour and
  15. # extract the license plate from the image
  16. (x, y, w, h) = cv2.boundingRect(n_plate_cnt)
  17. license_plate = gray[y:y + h, x:x + w]

 上面的代码目的是从边缘图片中找到轮廓,范围大小是从0到5。

如果找到有4个轮廓的,就说明发现车牌位置了。

最后就可以从车牌中提取号码了

现在所有初始化工作都做好了,下面使用EeayOCR进行文字识别。

  1. # initialize the reader object
  2. reader = Reader(['en'])
  3. # detect the text from the license plate
  4. detection = reader.readtext(license_plate)
  5. if len(detection) == 0:
  6. # if the text couldn't be read, show a custom message
  7. text = "Impossible to read the text from the license plate"
  8. cv2.putText(image, text, (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 3)
  9. cv2.imshow('Image', image)
  10. cv2.waitKey(0)
  11. else:
  12. # draw the contour and write the detected text on the image
  13. cv2.drawContours(image, [n_plate_cnt], -1, (0, 255, 0), 3)
  14. text = f"{detection[0][1]} {detection[0][2] * 100:.2f}%"
  15. cv2.putText(image, text, (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 255, 0), 2)
  16. # display the license plate and the output image
  17. cv2.imshow('license plate', license_plate)
  18. cv2.imshow('Image', image)
  19. cv2.waitKey(0)

 

首先初始化Reader对象,然后调用readtext函数,其中的参数,传找到的车牌号。

调用完后返回值包含3个元素:

元素1:要识别文字的边界框。

元素2:图片中文字被识别成什么;

元素3:识别可信度;

如果返回为0,说明什么也没找到,什么也没识别出来,这里程序会出现一个提示框。

如果识别成功,程序会将识别到的信息,也就是那3个元素,显示到车牌旁。

如下:

上面是成功的,但这个例子是失败的:

4143KZM被识别成了41L3KZM。

原因是只用图像识别来识别车牌是很有局限性的。所以,这种车牌,需要有和其他技术进行搭配。

下面也有个识别错误的例子:

原因的光线问题,在识别中,拍照也是一门技术活。不然图片初始化,获取车牌位置就不会成功。

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载