首页 > 编程语言 >opencv-python 车牌检测和识别

opencv-python 车牌检测和识别

时间:2023-08-10 23:24:41浏览次数:46  
标签:roi img python cv2 形态学 opencv 识别 车牌

首先利用级联分类器把车牌位置找到取出来,然后用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 的范围参数,提高识别率。

 

标签:roi,img,python,cv2,形态学,opencv,识别,车牌
From: https://www.cnblogs.com/libai123456/p/17618663.html

相关文章

  • 终于搞懂了python2和python3的encode(编码)与decode(解码)
    终于搞懂了python2的编码在python2下碰到非常多次的中文乱码,这次来梳理一下编码问题。在python2中默认编码是ASCII,而在python3中默认编码是unicode。unicode是中间编码,任何字符编码之前的转换都必须解码成unicode,再编码成目标字符编码在python2读取文件时,如果文件编码......
  • Couldn't launch Python exit code 9009
    Couldn'tlaunchPythonexitcode9009startstable-diffusion-webui,发现,python环境没有,我本地其实是已经安装完毕的,后来发现是因为windows的应用商店的快捷键,当你CMD命令行输入python的时候,会自动跳转到应用商店,然后你就会发现,你的python环境没有了,所以,需要将应用商店......
  • opencv-python 人脸人眼检测
    人脸检测:在一张图像中判断是否存在人脸并找出人脸所在的位置。人脸识别:在人脸检测的基础上收集人脸数据集合进行处理保存信息,将输入人脸与保存的信息进行比对校验,得到是否为其中某个人脸。特征值:以某种特定规则对输入源进行处理得到具有唯一性质量化的值,在人脸识别中特征值的提......
  • opencv-python 视频前后景分离
    背景分离(BS)是一种通过使用静态相机来生成前景掩码(即包含属于场景中的移动对象像素的二进制图像)的常用技术。BS计算前景掩码,在当前帧与背景模型之间执行减法运算,其中包含场景的静态部分,或者更一般而言,考虑到所观察场景的特征,可以将其视为背景的所有内容。前后景分离分为两步:第一步......
  • opencv-python 视频处理
    视频是由图片组成的,视频的每一帧就是一幅图片,一般是30帧,表示一秒钟显示30张图片。opencv中可以用 VideoCapture来捕获摄像头,用数字表示不同的设备,比如0,1。如果是视频文件,直接指定路径即可。VideoCapture类提供了初始化,打开视频文件或设备,视频帧捕获,视频文件或设备关闭,属性设......
  • python猜数字小游戏
    importrandomdefguess_number():  target_number=random.randint(1,100)  attempts=0  whileTrue:    guess=int(input("请输入一个1到100之间的整数:"))    attempts+=1    ifguess<target_number:      print("猜......
  • [oeasy]python0083_[趣味拓展]字体样式_正常_加亮_变暗_控制序列
    字体样式回忆上次内容上次了解了一个新的转义模式\033逃逸控制字符escesc退出标准输出流进行控制信息的设置可以清屏也可以设置光标输出的位置还能做什么呢?可以设置字符的颜色吗???......
  • [oeasy]python0083_[趣味拓展]字体样式_正常_加亮_变暗_控制序列
    字体样式回忆上次内容上次了解了一个新的转义模式\033逃逸控制字符esc esc让输出退出标准输出流进行控制信息的设置可以清屏也可以设置光标输出的位置  还能做什么呢?可以设置字符的颜色吗???......
  • Python基础day63Django操作session和中间件使用
    Django操作cookie#设置cookie#获取cookieset_cookie('key','value',max_age=5,expires=5)参数:●key,键●value=’’,值●max_age=None,超时时间cookie需要延续的时间(以秒为单位)如果参数是\None``,这个cookie会延续到浏览器关闭为止expires=None,超时时间(......
  • Python模块之paramiko的基本使用
    简介paramiko是一个基于SSHv2协议的纯Python(2.7,3.4+)库;提供了客户端和服务器的功能;可以实现SSH2远程安全连接,支持认证和密钥方式;一般用于执行远程命令、传输文件、中间SSH代理等。paramiko可以在Python代码中直接使用SSH协议对远程服务器进行操作,而不是调用ssh命令对远程服......