车牌识别python

直接上代码:

import os
import cv2
import numpy as np


# 显示图片
def cvShow(img):
    cv2.imshow('0', img)
    cv2.waitKey()


Img = cv2.imread("D:\python.code\carRead\car/img.png")#D:\python.code\carRead\car\img3.png
cvShow(Img)

# 高斯去燥
Img1 = cv2.GaussianBlur(Img, (3, 3), 0)
# cvShow(Img1)
# 灰度处理
grayImg = cv2.cvtColor(Img1, cv2.COLOR_BGR2GRAY)
# cvShow(grayImg)

# 边缘检测
# Soble算子边缘检测
Sobel_x = cv2.Sobel(grayImg, cv2.CV_16S, 1, 0)
sImg = cv2.convertScaleAbs(Sobel_x)
# cvShow(sImg)

# 自适应阈值处理
ret, img = cv2.threshold(sImg, 0, 255, cv2.THRESH_OTSU)
# cvShow(img)

# 闭运算
# 先膨胀在腐蚀
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (14, 3))
# print(kernelX)
image = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernelX, iterations=2)
# cvShow(image)

# 去除小白点
kernelX = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 1))
kernelY = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 19))
# 膨胀,腐蚀
image = cv2.dilate(image, kernelX)
image = cv2.erode(image, kernelX)
# 腐蚀,膨胀
image = cv2.erode(image, kernelY)
image = cv2.dilate(image, kernelY)
# cvShow(image)

# 中值滤波去除噪点
image = cv2.medianBlur(image, 15)
# cvShow(image)

# 轮廓检测
# cv2 RETR_EXTERNAL 表示只检测外轮廓
# cv2.CHAIN_APPROX_SIMPLE压水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮只需4个点来保存轮席信息
contours, hierarchy = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
Img2 = Img.copy()
cv2.drawContours(Img2, contours, -1, (0, 0, 255), 1)
# cvShow(Img2)

# 筛选车牌位置的轮廓
# 车牌长宽比在3:1到4:1之间

for item in contours:
    # cv2.boundingRect用一个最小的巨型,把形状包起来
    rect = cv2.boundingRect(item)
    x = rect[0]
    y = rect[1]
    weight = rect[2]
    height = rect[3]
    if (weight > (height * 3)) and (weight < (height * 4.5)):
        rectImg = Img[y:y + height, x:x + weight]
        cv2.imwrite('D:\python.code\carRead\license/license_plate.png', rectImg)#\是路径,/是文件名
        # cvShow(rectImg)
        # 高斯去噪
        carImg = cv2.GaussianBlur(rectImg, (3, 3), 0)
        # cvShow(carImg)
        # 灰度化
        grayCarImg = cv2.cvtColor(carImg, cv2.COLOR_BGR2GRAY)
        # cvShow(grayCarImg)
        # 自适应阈值处理
        ret, image = cv2.threshold(grayCarImg, 0, 255, cv2.THRESH_OTSU)
        # cvShow(image)
        # 膨胀
        kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2))
        img = cv2.dilate(image, kernel)
        # cvShow(img)
        # 轮廓检测
        contours1, hierarchy1 = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        img1 = rectImg.copy()
        cv2.drawContours(img1, contours1, -1, (0, 0, 255), 1)
        # cvShow(img1)
        # 筛选出各个字符的位置轮廓
        words = []
        for item in contours1:
            word = []
            rect = cv2.boundingRect(item)
            x = rect[0]
            y = rect[1]
            weight = rect[2]
            height = rect[3]
            word.append(x)
            word.append(y)
            word.append(weight)
            word.append(height)
            words.append(word)
        words = sorted(words, key=lambda s: s[0], reverse=False)
        # print(words)
        i = 0
        for word in words:
            # 根据每个字符的高度进行筛选
            # if (word[3] > (word[2] * 1.5)) and (word[3] < (word[2] * 4.0)):
            if (word[3] > 20) and (word[3] < 50) and (word[2] > 3) and (word[2] < 25):
                i = i + 1
                if i == 8:
                    break
                else:
                    image = rectImg[word[1]:word[1] + word[3], word[0]:word[0] + word[2]]
                    # cvShow(image)
                    # print(word)
                    cv2.imwrite('D:\python.code\carRead\words/' + str(i) + '.png', image)

templates = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
             'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
             'W', 'X', 'Y', 'Z',
             '藏', '川', '鄂', '甘', '赣', '贵', '桂', '黑', '沪', '吉', '冀', '津', '晋', '京', '辽', '鲁', '蒙', '闽',
             '宁', '青', '琼', '陕', '苏', '皖', '湘', '新', '渝', '豫', '粤', '云', '浙']


# 读取图片 输入参数是目录名
def read_img(road):
    referImg_list = []
    for filename in os.listdir(road):
        #print(filename)
        referImg_list.append(road + '/' + filename)
    # print(referImg_list)
    return referImg_list


#read_img('D:\python.code\carRead\model')

# 匹配中文
c_words = []
for i in range(34, 65):
    c_word = read_img('D:/python.code/carRead/model/' + templates[i])
    c_words.append(c_word)
    #print(c_words)

# 读取车牌字符
img = cv2.imread('D:\python.code\carRead\words/1.png')
#cvShow(img)
# 高斯去噪
image = cv2.GaussianBlur(img, (3, 3), 0)
# 灰度处理
grayimg = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# cvShow(grayimg)
# 自适应阈值处理
ret, image1 = cv2.threshold(grayimg, 0, 255, cv2.THRESH_OTSU)
# cvShow(image)


best_score = []  # 存取每个省市最高的得分
for c_word in c_words:
    score = []  # 存取的时每个省市的得分
    for word in c_word:
        # 读取模板中的照片
        # formfile()函数读回数据时需要用户指定元素类型,并对数组形状进行适当的修改
        template_img = cv2.imdecode(np.fromfile(word, dtype=np.uint8), 1)
        # 灰度处理
        template_img = cv2.cvtColor(template_img, cv2.COLOR_RGB2GRAY)
        # 自适应阈值处理
        ret, template_img = cv2.threshold(template_img, 0, 255, cv2.THRESH_OTSU)
        # 获取模板的长宽
        height, width = template_img.shape
        # 复制车牌字符图片
        image = image1.copy()
        # 让两者具有相同的长宽
        image = cv2.resize(image, (width, height))
        # 两者进行匹配 TM_CCOEFFF 匹配程度越高,计算出来的值越大
        result = cv2.matchTemplate(image, template_img, cv2.TM_CCOEFF)
        score.append(result[0][0])
    best_score.append(max(score))
# 获取最高得分元素的下标
num = best_score.index(max(best_score))
print(templates[num + 34],end='')

# 识别车牌第二个字母
# 读取图片
img = cv2.imread('D:\python.code\carRead\words/2.png')
# cvShow(img01)
# 高斯去噪
img = cv2.GaussianBlur(img, (3, 3), 0)
# 灰度处理
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# cvShow(img)
# 自适应阈值处理
ret, image2 = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)
# cvShow(image2)
# 字母模板匹配
c_words = []
for i in range(10, 34):
    # print(templates[i])
    c_word = read_img('D:/python.code/carRead/model/' + templates[i])
    c_words.append(c_word)
# print(c_words)
best_score = []  # 存取每个省市最高的得分
for c_word in c_words:
    score = []  # 存取的时每个省市的得分
    for word in c_word:
        # 读取模板中的照片
        # formfile()函数读回数据时需要用户指定元素类型,并对数组形状进行适当的修改
        template_img = cv2.imdecode(np.fromfile(word, dtype=np.uint8), 1)
        # 灰度处理
        template_img = cv2.cvtColor(template_img, cv2.COLOR_RGB2GRAY)
        # 自适应阈值处理
        ret, template_img = cv2.threshold(template_img, 0, 255, cv2.THRESH_OTSU)
        # 获取模板的长宽
        height, width = template_img.shape
        # 复制车牌字符图片
        image = image2.copy()
        # 让两者具有相同的长宽
        image = cv2.resize(image, (width, height))
        # 两者进行匹配 TM_CCOEFFF 匹配程度越高,计算出来的值越大
        result = cv2.matchTemplate(image, template_img, cv2.TM_CCOEFF)
        score.append(result[0][0])
        # print(word)
    # print(score)
    best_score.append(max(score))
# print(best_score)
# 获取最高得分元素的下标
num = best_score.index(max(best_score))
print(templates[10 + num],end='')


def strOrnum(path):
    # 读取图片
    img = cv2.imread(path)
    # cvShow(img01)
    # 高斯去噪
    img = cv2.GaussianBlur(img, (3, 3), 0)
    # 灰度处理
    img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
    # cvShow(img)
    # 自适应阈值处理
    ret, image2 = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)
    # cvShow(image2)
    # 字母模板匹配
    c_words = []
    for i in range(0, 34):
        # print(templates[i])
        c_word = read_img('D:/python.code/carRead/model/' + templates[i])
        c_words.append(c_word)
    # print(c_words)
    best_score = []  # 存取每个省市最高的得分
    for c_word in c_words:
        score = []  # 存取的时每个省市的得分
        for word in c_word:
            # 读取模板中的照片
            # formfile()函数读回数据时需要用户指定元素类型,并对数组形状进行适当的修改
            template_img = cv2.imdecode(np.fromfile(word, dtype=np.uint8), 1)
            # 灰度处理
            template_img = cv2.cvtColor(template_img, cv2.COLOR_RGB2GRAY)
            # 自适应阈值处理
            ret, template_img = cv2.threshold(template_img, 0, 255, cv2.THRESH_OTSU)
            # 获取模板的长宽
            height, width = template_img.shape
            # 复制车牌字符图片
            image = image2.copy()
            # 让两者具有相同的长宽
            image = cv2.resize(image, (width, height))
            # 两者进行匹配 TM_CCOEFFF 匹配程度越高,计算出来的值越大
            result = cv2.matchTemplate(image, template_img, cv2.TM_CCOEFF)
            score.append(result[0][0])
        best_score.append(max(score))
    # 获取最高得分元素的下标
    num = best_score.index(max(best_score))
    print(templates[num],end='')


strOrnum('D:\python.code\carRead\words/3.png')
strOrnum('D:\python.code\carRead\words/4.png')
strOrnum('D:\python.code\carRead\words/5.png')
strOrnum('D:\python.code\carRead\words/6.png')
strOrnum('D:\python.code\carRead\words/7.png')

在这里插入图片描述
可以用作学习参考

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 车牌识别 车牌识别是一项通过自动化技术实现对车辆车牌信息的识别和采集的技术。随着对车牌识别技术的研究和应用的不断深入,车牌识别在各个领域得到了广泛的应用,如安防领域、智能交通等。而Python作为一种流行的编程语言,实际上也是用于车牌识别的一种工具。 Python车牌识别应用方面的优势在于,它具有丰富的图像处理库和深度学习库,如OpenCV和TensorFlow。这些库能够协助实现对车牌图像的定位、分割和字符识别。同时,Python还具有易于学习和使用的特点,能够快速高效地编写车牌识别程序。 车牌识别技术也存在一些挑战,如不同地区的车牌格式不同、车牌在不同条件下(如光照、天气、车速等)会发生变化等。但通过持续的研究和开发Python车牌识别技术也正不断地发展与提升,为交通领域的自动化和智能化建设提供了有力的支持。 ### 回答2: 车牌识别 Python 是一种基于图像处理和机器学习算法实现的技术,能够自动识别车辆的车牌号码。Python 作为一种高效的编程语言,具有强大的图像处理和机器学习库,因此非常适合用于车牌识别应用的开发。 实现车牌识别需要先进行图像采集和处理,主要包括图像分割、特征提取、目标检测等步骤。同时,需要构建车牌号码的分类器,通过机器学习算法来训练模型,实现对不同类型车牌的识别。 Python 中常用的图像处理库包括 OpenCV、PIL 等,能够实现图像的读取、预处理、分割等操作。此外,基于 Python 的机器学习库如 scikit-learn、TensorFlow、Keras 等,能够实现各种分类算法的训练和模型的优化,为车牌号码的自动识别提供基础支持。 总的来说,车牌识别 Python 技术是一种快速高效的车牌自动识别方案,具有较高的识别准确率和稳定性,因此在智能交通、安防监控等领域得到了广泛应用。 ### 回答3: 车牌识别是一种计算机视觉技术,利用数字图像处理和模式识别等技术,通过图像识别和分析算法,对车辆的车牌进行自动识别和加以分析。车牌识别已经成为了交通监控、停车场管理、公园管理以及安防等领域非常重要的应用之一。 在车牌识别中,Python可以作为一个非常强大的编程语言来使用。Python是一种简单易用的编程语言,它具有强大的图像处理能力和大量的开源Python库,例如OpenCV、TensorFlow等等。这些库可以便捷地实现车牌识别中的关键技术,例如车牌的定位和切割、字符识别等等。 车牌识别的流程大致为图像获取、车牌定位、字符分割、字符识别、结果输出等几个步骤。在这个过程中,Python通过利用相关库来处理图像,使用基于机器学习、神经网络等方法来训练模型,在实现车牌识别这个过程中达到了很好的效果,应用非常广泛。 总之,Python车牌识别领域已经披荆斩棘了很久,随着技术的进步,它在今后的实际生产中依然会发挥重要的作用。相信随着技术的不断提高,车牌识别在安防、交通管理等领域的应用将会越来越广泛,这也需要各个领域专业人才的不懈努力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值