《OpenCV计算机视觉》—— 身份证号码识别案例

一、案例实现的整体思路

  • 下面是一个数字0~9的模板图片
    在这里插入图片描述
  • 案例身份证如下:
    在这里插入图片描述
  • 对数字模板的处理
    • 通过对模板中的数字进行定位处理,将每个数字的轮廓和外接矩形都一一对应,并由小到大的排序
    • 再将每一个数字都对应一个模板,并设置成相同的大小,用于对身份证号码进行匹配并识别
  • 对身份证的处理
    • 确定出身份证中信息部分的轮廓,确定出每个部分的外接矩形,通过外接矩形的坐标关系确定出身份证号码区域
    • 对身份证号码区域的数字与模板数字做相同的处理
    • 最后将处理后的模板数字与处理后的身份证号码区域的数字进行模板匹配,识别出对应的号码数字

二、代码实现

1.首先定义两个函数

  • def cv_show()用于绘图展示

  • def sort_contours()用于对模板数字的排序

    """ 绘图展示函数 """
    def cv_show(name, img):
        cv2.imshow(name, img)
        cv2.waitKey(0)
    """ 用于对模板数字的排序的函数 """
    # sort_contours() 函数传入的参数:
    # cnts:包含所有数字轮廓的列表
    # method='left-to-right':排序的反向
    # cv2.boundingRect() 函数用于绘制轮廓的最小外接矩形,
    # 返回一个包含四个值的元组:(x, y, w, h),分别代表边界框左上角的x坐标、y坐标、宽度和高度
    # 通过每个数字外接接矩形框的左上角点的x和y坐标的大小,对每个模板数字进行排序
    def sort_contours(cnts, method='left-to-right'):
        reverse = False
        i = 0
    
        if method == 'right-to-left' or method == 'bottom-to-top':
            reverse = True
        if method == 'top-to-bottom' or method == 'bottom-to-top':
            i = 1
        boundingBoxes = [cv2.boundingRect(c) for c in cnts]
        (cnts, boundingBoxes) = zip(*sorted(zip(cnts, boundingBoxes),
                                            key=lambda b: b[1][i], reverse=reverse))
        # zip(*...)使用星号操作符解包排序后的元组列表,并将其重新组合成两个列表:一个包含所有轮廓,另一个包含所有边界框。
        # 返回梳理轮廓,和外接矩形
        return cnts, boundingBoxes
    

2.模板图像中数字的定位处理

  • 代码如下:
    # 读取模板图片
    img = cv2.imread('template.png')
    cv_show('img', img)
    # 转换为灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转换为灰度图
    cv_show('gray', gray)
    # 转换为二值化图
    ref = cv2.threshold(gray, 155, 255, cv2.THRESH_BINARY_INV)[1]  # 再转换为二值图像
    cv_show('ref', ref)
    
    # 计算轮廓: cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图)
    # cv2.RETR_EXTERNAL 只检测外轮廓,cv2.CHAIN_APPROX_SIMPLE 只保留终点坐标
    _, refCnts, hierarchy = cv2.findContours(ref.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cv2.drawContours(img, refCnts, -1, (0, 0, 255), 2)
    cv_show('img', img)
    
    refCnts = sort_contours(refCnts, method="left-to-right")[0]  # 排序 ,从左到右,从上到下
    digits = {
         }  # 保存模板中每个数字对应的像素值
    for (i, c) in enumerate(refCnts):  # 遍历每一个轮廓
        # 计算外接矩形并且resize成合适大小
        (x, y, w, h) = cv2.boundingRect(c)
        roi = ref[y - 2:y 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值