首先利用级联分类器把车牌位置找到取出来,然后用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进行识别就行了。

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

识别结果如下:

  

 

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

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

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

 

 

 

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

opencv-python 车牌检测和识别的更多相关文章

  1. 基于OpenCv的人脸检测、识别系统学习制作笔记之三

    1.在windows下编写人脸检测.识别系统.目前已完成:可利用摄像头提取图像,并将人脸检测出来,未进行识别. 2.在linux下进行编译在windows环境下已经能运行的代码. 为此进行了linux ...

  2. 基于Opencv的人脸检测及识别

    一.实验目的:我这里完成的是,将8张人脸图片(4组,每组两张)存入库中,选取1张图片,程序识别出与其匹配的另一张. 这里介绍分三个步骤完成该工作,①程序读取摄像头.拍照 ②程序从电脑文档中读取图片   ...

  3. OpenCV—Python 轮廓检测 绘出矩形框(findContours\ boundingRect\rectangle

    千万注意opencv的轮廓检测和边缘检测是两码事 本文链接:https://blog.csdn.net/wsp_1138886114/article/details/82945328 1 获取轮廓 O ...

  4. OpenCV + Python 人脸检测

    必备知识 Haar-like opencv api 读取图片 灰度转换 画图 显示图像 获取人脸识别训练数据 探测人脸 处理人脸探测的结果 实例 图片素材 人脸检测代码 人脸检测结果 总结 下午的时候 ...

  5. OpenCV学习 物体检测 人脸识别 填充颜色

    介绍 OpenCV是开源计算机视觉和机器学习库.包含成千上万优化过的算法.项目地址:http://opencv.org/about.html.官方文档:http://docs.opencv.org/m ...

  6. 基于OpenCv的人脸检测、识别系统学习制作笔记之一

    基于OpenCv从视频文件到摄像头的人脸检测 在OpenCv中读取视频文件和读取摄像头的的视频流然后在放在一个窗口中显示结果其实是类似的一个实现过程. 先创建一个指向CvCapture结构的指针 Cv ...

  7. 基于OpenCv的人脸检测、识别系统学习制作笔记之二

    在网上找到了一个博客,里面有大量内容适合初学者接触和了解人脸检测的博文,正好符合我目前的学习方面,故将链接放上来,后续将分类原博客的博文并加上学习笔记. 传送门: http://blog.sina.c ...

  8. 14、OpenCV Python 直线检测

    __author__ = "WSX" import cv2 as cv import numpy as np #-----------------霍夫变换------------- ...

  9. OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现

    # OpenCV学习系列(一) Mac下OpenCV + xcode人脸检测实现 [-= 博客目录 =-] 1-学习目标 1.1-本章介绍 1.2-实践内容 1.3-相关说明 2-学习过程 2.1-环 ...

  10. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

随机推荐

  1. 2021-08-08:自由之路。电子游戏“辐射4”中,任务“通向自由”要求玩家到达名为“Freedom Trail Ring”的金属表盘,并使用表盘拼写特定关键词才能开门。给定一个字符串 ring,表

    2021-08-08:自由之路.电子游戏"辐射4"中,任务"通向自由"要求玩家到达名为"Freedom Trail Ring"的金属表盘,并 ...

  2. extra别名,即给列取别名

    extra别名,即给列取别名 Student.objects.all().extra(select={"name":"nickname"}) nickname为 ...

  3. FreeSWITCH添加自定义endpoint

    操作系统 :CentOS 7.6_x64      FreeSWITCH版本 :1.10.9   日常开发过程中会遇到需要扩展FreeSWITCH对接其它系统的情况,这里记录下编写FreeSWITCH ...

  4. QQ 邮箱设置自定义域名邮箱

    编者有话说 这篇文章来源于2019年12月左右,我在配置 Galaxy 生信分析平台的邮件服务过程中的一个尝试,我最早把它记录在了语雀上面,但由于某些原因一直迟迟没有更新到生信科技爱好者的公众号.直至 ...

  5. Galaxy 生信平台(三):xlsx 上传与识别

    我在<Firefox Quantum 向左,Google Chrome 向右>中,曾经吐槽过在 Firefox 中使用 Galaxy 上传本地的 Excel 文件时,会出现 xlsx 无法 ...

  6. Python之Excel表格数据处理

    正式开讲之前,我们需要先了解几个基本的知识点:1.Python字典(Dictionary) 的setdefault()方法描述:如果键不存在于字典中,将会添加键并将值设为默认值.语法:dict.set ...

  7. [AGC055A] ABC Identity 题解

    [AGC055A] ABC Identity 题解 题目描述 给定长度为 \(3n (1 \le n \le 2e5)\) 的序列,其中字母 A,B,C 各有 \(n\) 个. 一个合法序列 \(T\ ...

  8. spring连接数据库mysql报错 state 08S01 com.mysql.jdbc.exceptions.jdbc4.CommunicationsException

    spring连接数据库mysql报错errorCode0,state08S01com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Comm ...

  9. MVCC并发版本控制之重点ReadView

    MVCC并发版本控制 本文大部分来自<MySQL是怎样运行的>,这里只是简单总结,用于各位回忆和复习. 版本链 对于使用 InnoDB 存储引擎的表来说,它的聚簇索引记录中都包含两个必要的 ...

  10. [ARM 汇编]高级部分—性能优化与调试—3.4.3 使用模拟器进行调试与测试

    在ARM汇编程序开发过程中,使用模拟器(emulator)进行调试和测试是一种非常有效的方法.模拟器可以在不同的处理器上测试代码,帮助我们发现潜在的问题,并提供丰富的调试功能.本节将介绍如何使用QEM ...