OpenCV第七篇:车牌识别

目录

1.调整图片大小,并获取灰度图

 2.双边滤波去除噪音:cv2.bilateralFilter()。

3.边缘检测:cv2.Canny(image,threshold1,threshold2)

4.寻找轮廓:车牌(四边形)

​编辑 5.图像位运算进行遮罩

6.图像剪裁

7.字符识别:OCR


1.调整图片大小,并获取灰度图

import cv2

if __name__ == '__main__':
    img = cv2.imread('2.jpeg')
    # 调整图片大小
    img = cv2.resize(img, (620, 480))
    # 灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)




    # 显示效果
    cv2.imshow('original', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 2.双边滤波去除噪音:cv2.bilateralFilter()。

import cv2

if __name__ == '__main__':
    img = cv2.imread('2.jpeg')
    # 调整图片大小
    img = cv2.resize(img, (620, 480))
    # 灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 双边滤波
    gray1 = cv2.bilateralFilter(gray, 13, 15, 15)

    # 显示效果
    cv2.imshow('gray', gray)
    cv2.imshow('bilateralFilter', gray1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

3.边缘检测:cv2.Canny(image,threshold1,threshold2)

仅显示强度梯度大于最小阈值threshold1且小于最大阈值threshold2的边缘。

import cv2

if __name__ == '__main__':
    img = cv2.imread('2.jpeg')
    # 调整图片大小
    img = cv2.resize(img, (620, 480))
    # 灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 双边滤波
    gray = cv2.bilateralFilter(gray, 13, 15, 15)
    # 边缘检测
    edged = cv2.Canny(gray, 30, 200)




    # 显示效果
    cv2.imshow('gray', gray)
    cv2.imshow('edged', edged)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

4.寻找轮廓:车牌(四边形)

pip install imutils
import cv2
import imutils

if __name__ == '__main__':
    img = cv2.imread('2.jpeg')
    # 调整图片大小
    img = cv2.resize(img, (620, 480))
    # 灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 双边滤波
    gray = cv2.bilateralFilter(gray, 13, 15, 15)
    # 边缘检测
    edged = cv2.Canny(gray, 30, 200)


    # 寻找轮廓(图像矩阵,输出模式,近似方法)
    contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # 配合上面一句使用:用来兼容cv2和cv3
    contours = imutils.grab_contours(contours)
    # 根据区域大小排序取前十个
    contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
    screenCnt = None
    # 遍历轮廓,找到车牌轮廓
    for c in contours:
        # 计算轮廓周长(轮廓,是否闭合)
        peri = cv2.arcLength(c, True)
        # 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标
        approx = cv2.approxPolyDP(c, 0.018 * peri, True)
        # 获取四个顶点(即四边形)
        if len(approx) == 4:
            screenCnt = approx
            break
    # 如果找到了四边形
    if screenCnt is not None:
        # 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)
        cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)



    # 显示效果
    cv2.imshow('img', img)
    cv2.imshow('gray', gray)
    cv2.imshow('edged', edged)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

 5.图像位运算进行遮罩

import cv2
import imutils
import numpy as np

if __name__ == '__main__':
    img = cv2.imread('2.jpeg')
    # 调整图片大小
    img = cv2.resize(img, (620, 480))
    # 灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 双边滤波
    gray = cv2.bilateralFilter(gray, 13, 15, 15)
    # 边缘检测
    edged = cv2.Canny(gray, 30, 200)

    """寻找轮廓(图像矩阵,输出模式,近似方法)"""
    contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # 配合上面一句使用:用来兼容cv2和cv3
    contours = imutils.grab_contours(contours)
    # 根据区域大小排序取前十个
    contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
    screenCnt = None
    # 遍历轮廓,找到车牌轮廓
    for c in contours:
        # 计算轮廓周长(轮廓,是否闭合)
        peri = cv2.arcLength(c, True)
        # 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标
        approx = cv2.approxPolyDP(c, 0.018 * peri, True)
        # 获取四个顶点(即四边形)
        if len(approx) == 4:
            screenCnt = approx
            break
    # 如果找到了四边形
    if screenCnt is not None:
        # 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)
        cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)

    """遮罩"""
    # 创建一个灰度图一样大小的图像矩阵
    mask = np.zeros(gray.shape, np.uint8)
    # 将创建的图像矩阵的车牌区域画成白色
    cv2.drawContours(mask, [screenCnt], 0, 255, -1, )
    # 图像位运算进行遮罩
    new_image = cv2.bitwise_and(img, img, mask=mask)


    # 显示效果
    cv2.imshow('img', img)
    cv2.imshow('gray', gray)
    cv2.imshow('edged', edged)
    cv2.imshow('new_image', new_image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

6.图像剪裁

import cv2
import imutils
import numpy as np

if __name__ == '__main__':
    img = cv2.imread('2.jpeg')
    # 调整图片大小
    img = cv2.resize(img, (620, 480))
    # 灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 双边滤波
    gray = cv2.bilateralFilter(gray, 13, 15, 15)
    # 边缘检测
    edged = cv2.Canny(gray, 30, 200)

    """寻找轮廓(图像矩阵,输出模式,近似方法)"""
    contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # 配合上面一句使用:用来兼容cv2和cv3
    contours = imutils.grab_contours(contours)
    # 根据区域大小排序取前十个
    contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
    screenCnt = None
    # 遍历轮廓,找到车牌轮廓
    for c in contours:
        # 计算轮廓周长(轮廓,是否闭合)
        peri = cv2.arcLength(c, True)
        # 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标
        approx = cv2.approxPolyDP(c, 0.018 * peri, True)
        # 获取四个顶点(即四边形)
        if len(approx) == 4:
            screenCnt = approx
            break
    # 如果找到了四边形
    if screenCnt is not None:
        # 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)
        cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)

    """遮罩"""
    # 创建一个灰度图一样大小的图像矩阵
    mask = np.zeros(gray.shape, np.uint8)
    # 将创建的图像矩阵的车牌区域画成白色
    cv2.drawContours(mask, [screenCnt], 0, 255, -1, )
    # 图像位运算进行遮罩
    new_image = cv2.bitwise_and(img, img, mask=mask)

    """图像剪裁"""
    # 获取车牌区域的所有坐标点
    (x, y) = np.where(mask == 255)
    # 获取底部顶点坐标
    (topx, topy) = (np.min(x), np.min(y))
    # 获取底部坐标
    (bottomx, bottomy,) = (np.max(x), np.max(y))
    # 剪裁
    Cropped = gray[topx:bottomx, topy:bottomy]

    # 显示效果
    cv2.imshow('img', img)
    cv2.imshow('gray', gray)
    cv2.imshow('edged', edged)
    cv2.imshow('Cropped', Cropped)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

7.字符识别:OCR

import cv2
import imutils
import numpy as np

if __name__ == '__main__':
    img = cv2.imread('2.jpeg')
    # 调整图片大小
    img = cv2.resize(img, (620, 480))
    # 灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 双边滤波
    gray = cv2.bilateralFilter(gray, 13, 15, 15)
    # 边缘检测
    edged = cv2.Canny(gray, 30, 200)

    """寻找轮廓(图像矩阵,输出模式,近似方法)"""
    contours = cv2.findContours(edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    # 配合上面一句使用:用来兼容cv2和cv3
    contours = imutils.grab_contours(contours)
    # 根据区域大小排序取前十个
    contours = sorted(contours, key=cv2.contourArea, reverse=True)[:10]
    screenCnt = None
    # 遍历轮廓,找到车牌轮廓
    for c in contours:
        # 计算轮廓周长(轮廓,是否闭合)
        peri = cv2.arcLength(c, True)
        # 折线化(轮廓,阈值(越小越接近曲线),是否闭合)返回折线顶点坐标
        approx = cv2.approxPolyDP(c, 0.018 * peri, True)
        # 获取四个顶点(即四边形)
        if len(approx) == 4:
            screenCnt = approx
            break
    # 如果找到了四边形
    if screenCnt is not None:
        # 根据四个顶点坐标对img画线(图像矩阵,轮廓坐标集,轮廓索引,颜色,线条粗细)
        cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3)

    """遮罩"""
    # 创建一个灰度图一样大小的图像矩阵
    mask = np.zeros(gray.shape, np.uint8)
    # 将创建的图像矩阵的车牌区域画成白色
    cv2.drawContours(mask, [screenCnt], 0, 255, -1, )
    # 图像位运算进行遮罩
    new_image = cv2.bitwise_and(img, img, mask=mask)

    """图像剪裁"""
    # 获取车牌区域的所有坐标点
    (x, y) = np.where(mask == 255)
    # 获取底部顶点坐标
    (topx, topy) = (np.min(x), np.min(y))
    # 获取底部坐标
    (bottomx, bottomy,) = (np.max(x), np.max(y))
    # 剪裁
    Cropped = gray[topx:bottomx, topy:bottomy]

    """OCR识别"""
    text = pytesseract.image_to_string(Cropped, config='--psm 11')
    print("车牌结果:", text)

    # 显示效果
    cv2.imshow('img', img)
    cv2.imshow('gray', gray)
    cv2.imshow('edged', edged)
    cv2.imshow('new_image', Cropped)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

  

  • 18
    点赞
  • 256
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
OpenCV 车牌识别代码分为四个主要步骤: 1. 提取车牌位置:这一步是将车牌从整张图片中分割出来。可以使用图像处理的方法,比如形态学操作、边缘检测等操作来提取车牌的位置。 2. 车牌字符的分割:在这一步中,将车牌中的字符进行分割。可以使用图像处理的方法,比如阈值分割、轮廓检测等操作来实现字符的分割。 3. 通过模板匹配识别字符:通过匹配字符的模板来识别字符。可以建立一个字符模板库,然后使用模板匹配的方法来与待识别的字符进行比对,以实现字符的识别。 4. 将结果绘制在图片上显示出来:最后一步是将识别结果绘制在原始图片上进行展示。可以使用图像处理的方法在车牌位置上绘制识别结果。 这些步骤的具体代码可以在上述引用\[1\]和引用\[2\]提供的资源中找到。在实际代码实现时,可以根据不同的图像特点进行参数调整和操作顺序的更改,以达到最佳的识别效果。 #### 引用[.reference_title] - *1* [【OpenCV实战】简洁易懂的车牌号识别Python+OpenCV实现“超详解”(含代码)](https://blog.csdn.net/qq_40784418/article/details/105586644?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168933208916800226538534%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168933208916800226538534&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-105586644-null-null.article_score_rank&utm_term=opencv%E8%BD%A6%E7%89%8C%E8%AF%86%E5%88%AB%E4%BB%A3%E7%A0%81)[target="_blank"] [.reference_item] - *2* [【OpenCV实战】简洁易懂的车牌号识别Python+OpenCV实现“超详解”(含代码)](https://blog.csdn.net/qq_40784418/article/details/105586644?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168933208916800226538534%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168933208916800226538534&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-105586644-null-null.article_score_rank&utm_term=opencv%E8%BD%A6%E7%89%8C%E8%AF%86%E5%88%AB%E4%BB%A3%E7%A0%81)[target="_blank"] [.reference_item] - *3* [【OpenCV实战】简洁易懂的车牌号识别Python+OpenCV实现“超详解”(含代码)](https://blog.csdn.net/qq_40784418/article/details/105586644?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168933208916800226538534%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168933208916800226538534&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-2-105586644-null-null.article_score_rank&utm_term=opencv%E8%BD%A6%E7%89%8C%E8%AF%86%E5%88%AB%E4%BB%A3%E7%A0%81)[target="_blank"] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文子阳

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值