2023年11月28日发(作者:2023款科鲁泽新款图片)

车牌识别(基于模板匹配算法)

vehicle_license_plate_recognition

车牌识别(基于模板匹配)

?、车牌识别的步骤

?般车牌识别分为4步:

图像获取车牌定位车牌字符分割车牌字符识别

边缘检测

Canny的步骤如下:

1.对输?图像进??斯平滑,降低错误率。

2.计算梯度幅度和?向来估计每?点处的边缘强度与?向。

3.根据梯度?向,对梯度幅值进??极?值抑制。本质上是对Sobel、Prewitt等算?结果的进?步细化。

4.?双阈值处理和连接边缘。

实例如下

import cv2

img = cv2.imread(\'\', flags=cv2.IMREAD_GRAYSCALE)

GBlur = cv2.GaussianBlur(img, (3, 3), 0)

canny = cv2.Canny(GBlur, 50, 150)

cv2.imshow(\'canny\', canny)

cv2.waitKey(0)

cv2.destroyAllWindows()

2.膨胀腐蚀处理

#encoding:utf-8

import cv2

#

将图?转为灰度图像

img = cv2.imread(\'\', cv2.COLOR_RGB2GRAY)

#

将原图做个备份

sourceImage = img.copy()

#

?斯模糊滤波器对图像进?模糊处理

img = cv2.GaussianBlur(img, (3, 3), 0)

#canny

边缘检测

img = cv2.Canny(img, 500, 200, 3)

cv2.imshow(\'Canny\', img)

#

指定核??,如果效果不佳,可以试着将核调?

kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (29, 1))

kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 19))

#

对图像进?膨胀腐蚀处理

img = cv2.dilate(img, kernelX, anchor=(-1, -1), iterations=2)

img = cv2.erode(img, kernelX, anchor=(-1, -1), iterations=4)

img = cv2.dilate(img, kernelX, anchor=(-1, -1), iterations=2)

img = cv2.erode(img, kernelY, anchor=(-1, -1), iterations=1)

img = cv2.dilate(img, kernelY, anchor=(-1, -1), iterations=2)

#

再对图像进?模糊处理

img = cv2.medianBlur(img, 15)

img = cv2.medianBlur(img, 15)

cv2.imshow(\'dilate&erode\', img)

cv2.waitKey(0)

cv2.destroyAllWindows()

3.按特定形状特征排除?扰

#encoding:utf-8

import cv2

#

将图?转为灰度图像

img = cv2.imread(\'\', cv2.COLOR_RGB2GRAY)

#

将原图做个备份

sourceImage = img.copy()

#

?斯模糊滤波器对图像进?模糊处理

img = cv2.GaussianBlur(img, (3, 3), 0)

#canny

边缘检测

img = cv2.Canny(img, 500, 200, 3)

cv2.imshow(\'Canny\', img)

#

指定核??,如果效果不佳,可以试着将核调?

kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (29, 1))

kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 19))

#

对图像进?膨胀腐蚀处理

img = cv2.dilate(img, kernelX, anchor=(-1, -1), iterations=2)

img = cv2.erode(img, kernelX, anchor=(-1, -1), iterations=4)

img = cv2.dilate(img, kernelX, anchor=(-1, -1), iterations=2)

img = cv2.erode(img, kernelY, anchor=(-1, -1), iterations=1)

img = cv2.dilate(img, kernelY, anchor=(-1, -1), iterations=2)

#

再对图像进?模糊处理

img = cv2.medianBlur(img, 15)

img = cv2.medianBlur(img, 15)

cv2.imshow(\'dilate&erode\', img)

#

检测轮廓,

#

输?的三个参数分别为:输?图像、层次类型、轮廓逼近?法

#copy

因为这个函数会修改输?图像,所以上?的步骤使?函数将原图像做?份拷贝,再处理

#

返回的三个返回值分别为:修改后的图像、图轮廓、层次

image, contours, hier = cv2.findContours(img.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for c in contours:

#

边界框

x, y, w, h = cv2.boundingRect(c)

cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)

print(\'w\' + str(w))

print(\'h\' + str(h))

print(float(w)/h)

print(\'------\')

#3.142.24

由于国内普通?车车牌的宽??为,所以,近似的认为,只要宽???于且?于的则认为是车牌

if float(w)/h >= 2.2 and float(w)/h <= 4.0:

#

将车牌从原图中切割出来

lpImage = sourceImage

if \'lpImage\' not in dir():

print(\'未检测到车牌!\')

cv2.waitKey(0)

cv2.destroyAllWindows()

exit()

cv2.imshow(\'img\', lpImage)

cv2.waitKey(0)

cv2.destroyAllWindows()

4、字符分割

字符分割?法很多,其中之?是:如下:

轮廓检测分割

#

边缘检测

lpImage = cv2.Canny(lpImage, 500, 200, 3)

#

对图像进??值化操作

ret, thresh = cv2.threshold(lpImage.copy(), 127, 255, cv2.THRESH_BINARY)

cv2.imshow(\'img\', thresh)

cv2.waitKey(0)

cv2.destroyAllWindows()

4、模板匹配识别

识别结果

识别数据输出到图?

后续更新...


更多推荐

车牌识别