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、模板匹配识别
识别结果
识别数据输出到图?
后续更新...
更多推荐
车牌识别
发布评论