经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
opencv-python 车牌检测和识别
来源:cnblogs  作者:寒水浮云  时间:2023/8/11 8:35:40  对本文有异议

首先利用级联分类器把车牌位置找到取出来,然后用ocr进行车牌识别。

1 OCR之Tesseract安装

Tesseract安装可以参考这个链接: https://blog.csdn.net/m0_53192838/article/details/127432761 

写的比较详细,我在使用的时候有一个报错有点意思,记录一下:

 Tesseract ocr识别报错:tesseract is not installed or it‘s not in your PATH

已经安装好tesseract,python中的pytesseract也装好了,但是代码里面用pytesseract的时候报错了,看起来是路径有问题,但是环境变量是已经配置好了的。

网上分析是pytesseract.py文件里的路径有问题。

把文件中的路径 tesseract_cmd = ‘tesseract’ 改为本地的绝对路径就行

tesseract_cmd = r ’D\Tesseract_ocr\tesseract.exe’ 

 

2 车牌检测和识别

网上找了三幅带有车牌的图片,肉眼看起来都比较清晰,作为此次车牌识别的原图。

 

首先用opencv的级联分类器把车牌提取出来,然后可以进行适当的形态学操作方便ocr更好的识别,然后直接用pytesseract进行识别就行了。

  1. import cv2
  2. import numpy as np
  3. import pytesseract
  4.  
  5. #创建级联分类器
  6. car = cv2.CascadeClassifier('./haarcascade_russian_plate_number.xml')
  7.  
  8. img = cv2.imread('./car1.jpg')
  9. gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  10.  
  11. kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)) #形态学结构元
  12.  
  13. car_nums = car.detectMultiScale(gray) #车牌检测(检测出来的框偏大)
  14.  
  15. for car_num in car_nums:
  16. (x,y,w,h) = car_num
  17. cv2.rectangle(img,(x,y),(x+w,y+h),[0,0,255],2) #用矩形把车牌框起来
  18. roi = gray[y:y+h,x:x+w] #把车牌图片提取出来
  19. _,roi_thresh = cv2.threshold(roi,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU) #对提取的车牌二值化
  20. open_img = cv2.morphologyEx(roi_thresh,cv2.MORPH_OPEN,kernel) #形态学开操作(二值化后效果还是差点)
  21. cv2.imshow('open_img',open_img)
  22. print(pytesseract.image_to_string(open_img,lang='chi_sim+eng',config='--psm 7 --oem 3')) # 进行ocr识别
  23. cv2.imshow('car',img)
  24.  
  25. cv2.waitKey(0)
  26. cv2.destroyAllWindows() 

 识别结果如下:

  

 

 

 

 总体来说,效果都不是很好(第三个车牌识别失败),还可以进行其他形态学操作尝试,还有部分原因是车牌框太大了,干扰比较多。

通过观察,车牌的颜色都比较固定,且和车身差距比较大,可以用之前的颜色mask方法来提取车牌(形态学操作--小狗提取优化),然后进行适当形态学操作,再进行轮廓和轮廓外接矩形的计算,然后再提取车牌,这样提取的车牌框应该会更准确一些。

  1. import cv2
  2. import numpy as np
  3. import pytesseract
  4. img = cv2.imread('./car2.jpg')
  5. gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
  6. # print(img.shape)
  7. HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) #转换到hsv空间
  8.  
  9. kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)) #形态学结构元
  10.  
  11. LowerBlue = np.array([90, 190, 100]) #检测hsv的上下限(蓝色车牌)
  12. UpperBlue = np.array([130, 230, 200])
  13. #inRange 函数将颜色的值设置为 1,如果颜色存在于给定的颜色范围内,则设置为白色,如果颜色不存在于指定的颜色范围内,则设置为 0
  14. mask = cv2.inRange(HSV,LowerBlue,UpperBlue) #车牌mask
  15. cv2.imshow('mask',mask)
  16.  
  17. dilate = cv2.morphologyEx(mask,cv2.MORPH_DILATE,kernel,iterations=4) #形态学膨胀和开操作把提取的蓝色点连接起来
  18. morph = cv2.morphologyEx(dilate,cv2.MORPH_CLOSE,kernel,iterations=6)
  19. cv2.imshow('morph',morph)
  20.  
  21. _,contours,_ = cv2.findContours(morph,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) #找车牌的轮廓,只找外轮廓就行
  22.  
  23. # print(len(contours))
  24. img_copy = img.copy()
  25. cv2.drawContours(img_copy,contours,-1,[0,0,255],2) #把轮廓画出来
  26. cv2.imshow('img_copy',img_copy)
  27.  
  28. rect = cv2.boundingRect(contours[0]) #用矩形把轮廓框出来(轮廓外接矩形)
  29. (x,y,w,h) = rect
  30. cv2.rectangle(img,(x,y),(x+w,y+h),[0,0,255],2)
  31. cv2.imshow('car',img)
  32.  
  33. roi_img = gray[y:y+h,x:x+w] #提取车牌区域进行ocr识别
  34.  
  35. # _,roi_thresh = cv2.threshold(roi_img,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
  36. # open_img = cv2.morphologyEx(roi_thresh,cv2.MORPH_OPEN,kernel) #适当的形态学操作提高识别率
  37. # cv2.imshow('open_img',open_img)
  38.  
  39. print(pytesseract.image_to_string(roi_img,lang='chi_sim+eng',config='--psm 8 --oem 3')) #ocr识别
  40.  
  41. cv2.waitKey(0)
  42. cv2.destroyAllWindows()

 

 

 

 

 

 车牌框比较准确,识别效果相对好了不少,针对具体问题还可以继续微调形态学和 inRange 的范围参数,提高识别率。

 

原文链接:https://www.cnblogs.com/libai123456/p/17618663.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号