目前做的只是蓝色车牌,有一定的识别能力,但有些图片识别效果不太好。先记录一下,后面可能会用到。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/5/24 19:23
# @Author : 若谷
# @File : license_number_location.py
# @Software: PyCharm
import cv2 as cv
import numpy as np
import imutils
# 导入图片
img = cv.imread('./images/car1.jpg',1)
# cv.imshow('origin[0]',img)
# 缩小尺寸
resize = cv.resize(img,None,fx=0.5,fy=0.5)
cv.imshow('resize[1]',resize)
# 滤波去噪
denoised = cv.bilateralFilter(resize, 13, 15, 15)
cv.imshow('denoised[3]',denoised)
# 转换为HSV空间
hsv = cv.cvtColor(denoised, cv.COLOR_BGR2HSV)
# 设定阈值,阈值为自己确定
low = np.array([108, 94, 50])
high = np.array([131, 220, 207])
# 根据阈值构建掩膜
mask = cv.inRange(hsv, low, high)
# 对原图像和掩膜进行位运算
res = cv.bitwise_and(resize, resize, mask=mask)
# 显示结果
cv.imshow('res',res)
cv.imshow('mask',mask)
# 进行腐蚀和膨胀,先设置核大小
kernel = cv.getStructuringElement(shape=cv.MORPH_RECT,ksize=(3,3))
dilate = cv.dilate(mask,kernel,iterations=3)
cv.imshow('dilate',dilate)
erode = cv.erode(dilate,kernel,iterations=3)
cv.imshow('erode',erode)
# Canny边缘检测
edged = cv.Canny(image=erode, threshold1=30, threshold2=200)
cv.imshow('edged',edged)
contours,hierarchy = cv.findContours(image=edged.copy(), mode=cv.RETR_TREE, method=cv.CHAIN_APPROX_SIMPLE)
print('type(contours)=',type(contours)) # 'list'
cnt=contours[0]
# 这里,以最小面积绘制边界矩形,因此也考虑旋转。使用的功能是cv2.minAreaRect()。它返回一个Box2D结构,其中包含以下条件
#(中心(x,y),(宽度,高度),旋转角度)。
rect = cv.minAreaRect(cnt)
box = cv.boxPoints(rect)
box = np.int0(box)
resize=cv.drawContours(resize,[box],0,(0,0,255),2)
# x,y,w,h = cv.boundingRect(contours[0])
# print('x= ',x)
# print('y= ',y)
# print('w= ',w)
# print('h= ',h)
# cv.rectangle(resize,(x,y),(w,h),color=(0,0,255),thickness=2)
cv.imshow('final',resize)
if cv.waitKey(0)&0xFF==27:
cv.destroyAllWindows()
图片来自百度图片,马赛克是我自己打的。第三张没识别好。