首先利用级联分类器把车牌位置找到取出来,然后用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. 2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色, 它们被排成一行,位置0~n-1上。一开始所有的棋子都是黑色向上, 一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻

    2022-12-28:有n个黑白棋子,它们的一面是黑色,一面是白色, 它们被排成一行,位置0~n-1上.一开始所有的棋子都是黑色向上, 一共有q次操作,每次操作将位置标号在区间[L,R]内的所有棋子翻 ...

  2. vue全家桶进阶之路9:常用指令

    以下是一些常见的指令: v-bind - 用于绑定一个或多个属性到组件或 HTML 元素上. v-model - 用于双向绑定一个表单元素或组件的值到数据模型上. v-for - 用于循环遍历一个数组 ...

  3. Spring源码:Bean生命周期(终章)

    前言 本系列前面讲解了Spring的bean定义.bean实例化.bean初始化等生命周期.这些步骤使我们能够了解bean从创建到准备好使用所经历的过程.但是,除了这些步骤,bean的销毁也是非常重要 ...

  4. weex 中出现 loading无法关闭

    如题使用weex 搞个app 一安装就有一个bug 一直这里转!!! 找了半天原来是自己没按规定来,在index.vue中直接使用了rower <template> <router- ...

  5. Kubernetes 证书详解

    K8S 证书介绍 在 Kube-apiserver 中提供了很多认证方式,其中最常用的就是 TLS 认证,当然也有 BootstrapToken,BasicAuth 认证等,只要有一个认证通过,那么 ...

  6. 【python基础】编写/运行hello world项目

    1.编写hello world项目 编程界每种语言的第一个程序往往都是输出hello world.因此我们来看看,如何用Python输出hello world. 1.如果你是初学者,main.py中的 ...

  7. mysql 有关账号登录和重新设置密码操作

    #进入mysql客户端$mysqlmysql> select user(); #查看当前用户mysql> exit # 也可以用\q quit退出 # 默认用户登陆之后并没有实际操作的权限 ...

  8. Dapr在Java中的实践 之 状态管理

    状态管理 状态管理(State Management)使用键值对作为存储机制,可以轻松的使长时运行.高可用的有状态服务和无状态服务共同运行在我们的服务中. 我们的服务可以利用Dapr的状态管理API在 ...

  9. gateway异常:DefaultDataBuffer cannot be cast to org.springframework.core.io.buffer.NettyDataBuffer

    启动gateway后 出现java.lang.ClassCastException: org.springframework.core.io.buffer.DefaultDataBufferFacto ...

  10. js如何操作video标签

    一.简介 在做web ui自动化时,遇到操作视频的时候有时比较让人头疼,定位时会发现只有一个<video>标签,用selenium来实现的话比较麻烦,使用js后我们只需定位到video标签 ...