基于opencv-python的身份证识别(KNN与OCR两种算法)

        本文是学习opencv之初的一个阶段性小任务,主要做练习使用,并没有过多的追求准确率和高可用性,比如对输入身份证照片有要求,必须是完全的身份证照片,不能有背景,如需改进,可以通过增加轮廓检测透视变换来裁剪出身份证照片;还有对身份证号区域的检测,采用的是先裁剪出一个固定大小的模板,进行模板匹配,当时学的比较浅,所以直接草率的这样做了,其实也可以通过轮廓检测排序,从而查找到身份证号区域。

        另外,利用KNN算法做识别,也是我当时刚接触KNN算法,一时兴起做的,这算是我初次做算法模型训练,然后进行检测,也是为后来学习的各种深度学习算法打基础。效果并不是很好,因为我训练用到的数据集就是最后那一张图片(trainum.png),进行了少量的数据集增强。

KNN  train训练程序(train.py):

# -*-coding:utf-8-*-
# @Author: Phantom
# @编译环境:windows 10 + python3.8
# @IDE:Pycharm2021.1.3

import cv2.cv2 as cv
import numpy as np

def KNN():
    train = cv.imread("trainum.png", 0)
    # 24*32
    trainimgs = [train]
    # 腐蚀和膨胀,增强训练集
    for i in range(1,3):
        kernel = np.ones((i, i), np.uint8)
        j = cv.erode(train, kernel)
        trainimgs.append(j)
        r = cv.dilate(train, kernel)
        trainimgs.append(r)
    # 生成knn对象
    knn = cv.ml.KNearest_create()
    #训练knn模型
    for trainimg in trainimgs:
        cells = [np.hsplit(row, 30) for row in np.vsplit(trainimg, 11)]

        x = np.array(cells)
        # print(x[1][1])
        trn = x[:, :].reshape(-1,768).astype(np.float32)
        k = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
        train_label = np.repeat(k,30)
        knn.train(trn,cv.ml.ROW_SAMPLE,train_label)


    cell = [np.hsplit(row, 30) for row in np.vsplit(train, 11)]
    x = np.array(cell)
    # print(x[1][1])
    train = x[:, :].reshape(-1, 768).astype(np.float32)
    t = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
    train_label = np.repeat(t, 30)
    return knn,train,train_label

def main():
    knn ,train,train_label= KNN()

    test = train.copy()
    test_label = train_label.copy()
    ret, result, neighbours, dist = knn.findNearest(test, 3)
    right = 0
    for i in range(330):
        if result[i] == test_label[i]:
            right+=1
    # print(f'{len(test):}个测试数据识别正确{right:}个')
    #计算正确率
    ac = right/result.size
    print(f'正确率{ac*100:.2f}%')

if __name__ == '__main__':
    main()
    cv.waitKey(0)

KNN算法主程序:

# -*-coding:utf-8-*-
# @Author: Phantom
# @编译环境:windows 10 + python3.8
# @IDE:Pycharm2021.1.3

import cv2.cv2 as cv
import numpy as np
import train

# 读取图片和身份证号位置模板
idimg = cv.imread("033.jpg")
idimg = cv.resize(idimg, (509, 321), interpolation=cv.INTER_CUBIC)
template = cv.imread("position1.jpg", 1)
cv.imshow("idimg", idimg)
# 转灰度图
gray = cv.cvtColor(idimg, cv.COLOR_BGR2GRAY)
cv.imshow("gray", gray)
# 黑帽运算闭运算的卷积核
kernel1 = np.ones((15, 15), np.uint8)
# kernel2 = np.ones((1,1),np.uint8)
# 黑帽运算
cvblackhat = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel1)
cv.imshow("black", cvblackhat)
# 闭运算
cvclose1 = cv.morphologyEx(cvblackhat, cv.MORPH_CLOSE, kernel1)
cv.imshow("cvclose", cvclose1)
# 原图像二值化
ref = cv.threshold(cvclose1, 0, 255, cv.THRESH_OTSU)[1]
# 身份证号码区域二值化
twoimg = cv.threshold(cvblackhat, 0, 255, cv.THRESH_OTSU)[1]
cv.imshow("ref", ref)
# 为了模板匹配
cv.imwrite("ref.jpg", ref)
ref = cv.imread("ref.jpg", 1)
# 获取模板高和宽
h, w = template.shape[:2]
# 模板匹配(相关匹配)找身份证号码位置
res = cv.matchTemplate(ref, template, cv.TM_CCORR)
# 获得最匹配地方的左上角坐标
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
top_left = max_loc
# 计算最匹配地方的右下角坐标
bottom_right = (top_left[0] + w, top_left[1] + h)
# 框出身份证号区域并展示
cv.rectangle(idimg, top_left, bottom_right, (0, 255, 0), 2)
cv.imshow("idimgOK", idimg)
# 展示身份证号码的二值图像
rectangleid = cv.resize(twoimg[top_left[1]:bottom_right[1], top_left[0]:bottom_right[0]], (432, 32),
                        interpolation=cv.INTER_CUBIC)
# rectangleid = cv.erode(rectangleid,kernel2)
cv.imshow("rectangleid", rectangleid)

# 划分获得每一个数字的图像
cells = [np.hsplit(row, 18) for row in np.vsplit(rectangleid, 1)]

# 转换成np.array类型
x = np.array(cells)
cv.imshow("cell9", x[0][9])
cv.imshow("cell10", x[0][10])
# 图像数据转换为特征矩阵
test = x[:, :].reshape(-1, 768).astype(np.float32)
# 获得训练好的knn模型
knn = train.KNN()
# 测试
ret, result, neighbours, dist = knn.findNearest(test, 2)
# 输出预测结果
result = np.uint8(result).reshape(-1, 18)[0]
id = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "X"]
idstr = ""
for i in result:
    idstr += id[i]
print(idstr)

cv.waitKey(0)

 OCR算法主程序 (这里改进为百度的paddleOCR识别率会更高)

# -*-coding:utf-8-*-
# @Author: Phantom
# @编译环境:windows 10 + python3.8
# @IDE:Pycharm2021.1.3

import cv2.cv2 as cv
import numpy as np
import pytesseract

# 读取图片和身份证号位置模板
idimg = cv.imread("0033.jpg")
idimg = cv.resize(idimg, (509, 321), interpolation=cv.INTER_CUBIC)
idimgok = idimg.copy()
template = cv.imread("position1.jpg", 1)
cv.imshow("idimg", idimg)
# 转灰度图
gray = cv.cvtColor(idimg, cv.COLOR_BGR2GRAY)
cv.imshow("gray", gray)
# 黑帽运算闭运算的卷积核
kernel1 = np.ones((15, 15), np.uint8)
# kernel2 = np.ones((1,1),np.uint8)
# 黑帽运算
cvblackhat = cv.morphologyEx(gray, cv.MORPH_BLACKHAT, kernel1)
cv.imshow("black", cvblackhat)
# 闭运算
cvclose1 = cv.morphologyEx(cvblackhat, cv.MORPH_CLOSE, kernel1)
cv.imshow("cvclose", cvclose1)
# 原图像二值化
ref = cv.threshold(cvclose1, 0, 255, cv.THRESH_OTSU)[1]
# 身份证号码区域二值化
twoimg = cv.threshold(cvblackhat, 0, 255, cv.THRESH_OTSU)[1]
cv.imshow("ref", ref)
# 为了模板匹配
cv.imwrite("ref.jpg", ref)
ref = cv.imread("ref.jpg", 1)
# 获取模板高和宽
h, w = template.shape[:2]
# 模板匹配(相关匹配)找身份证号码位置
res = cv.matchTemplate(ref, template, cv.TM_CCORR)
# 获得最匹配地方的左上角坐标
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
top_left = max_loc
# 计算最匹配地方的右下角坐标
bottom_right = (top_left[0] + w, top_left[1] + h)
# 框出身份证号区域并展示
cv.rectangle(idimg, top_left, bottom_right, (0, 255, 0), 2)
cv.imshow("idimgOK", idimg)
# 展示身份证号码的二值图像
rectangleid = cv.resize(idimgok[top_left[1] - 2:bottom_right[1] + 2, top_left[0] - 2:bottom_right[0] + 2], (436, 36),
                        interpolation=cv.INTER_CUBIC)
# rectangleid = cv.erode(rectangleid,kernel2)
cv.imshow("rectangleid", rectangleid)
text = pytesseract.image_to_string(rectangleid)
print(text)

cv.waitKey(0)

 程序中所用到的图片         

0033.jpg为标准身份证照片

                                                                     position1.jpg

                                                                 trainum.png

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: 基于opencv-python的车牌识别是一种利用计算机视觉技术实现的车牌自动识别系统,通过将车牌图像输入到系统中,利用opencv-python库中的图像处理算法和人工智能算法进行处理,最终得到车牌号码。 云盘下载是指将该系统提供的代码和相关文件上传到云盘,方便用户下载和使用。由于该系统所需的文件较大,因此使用云盘下载可以更加方便和快捷。 基于opencv-python的车牌识别的优点是准确度高,识别速度快,且能够适应不同光照和角度的情况,因此具有广泛的应用价值。例如,在道路交通安全管理中,可以利用该系统自动识别车牌号码,提高交通事故的处理效率;在车辆卡口管理中,可以利用该系统对过往车辆进行车牌识别,实现自动化的流量统计和监管。 总之,基于opencv-python的车牌识别是一种实用的计算机视觉技术,通过云盘下载可以更加方便快捷地实现应用。 ### 回答2: 基于opencv-python的车牌识别是一种使用Python编程语言OpenCV计算机视觉库进行车牌识别的技术。这种技术可以通过静态图像或视频流识别车牌,以实现智能交通、车辆管理等目的。这种技术在实际应用中可以提高车辆追踪的效率,减少违章交通行为和交通事故的发生。 在进行车牌识别时,需要通过使用Python编程语言OpenCV图像处理工具对图片进行处理,从而检测出车牌的位置和角度。接下来,需要使用深度学习算法对检测到的车牌信息进行识别,并将车牌中的字符进行提取和解析。 为方便下载和使用,可以将车牌识别的代码和所需的依赖文件打包成一个ZIP或RAR文件,并上传到云盘中。这样,用户可以通过下载并解压缩文件来快速使用车牌识别技术,同时可以在实际应用中根据需要进行二次开发和优化。近年来,车牌识别技术在智能交通和社会管理领域得到广泛应用,帮助提高城市管理和公共安全管理水平。 ### 回答3: 基于opencv-python的车牌识别是一种将图像处理技术应用于车牌识别的方法,利用opencv-python这一开源计算机视觉库,结合现代物联网技术,可实现快速、精准、高效的车牌识别。 在使用基于opencv-python的车牌识别前,我们需要在云盘上下载相关程序,安装好opencv-python和其他相关依赖库。在准备工作完成后,我们可以将待识别的车牌图像导入到识别系统中。车牌图像可以是通过摄像头获取的实时图像,也可以是已保存在本地的图片。 基于opencv-python的车牌识别系统会自动对车牌图像进行预处理,包括二值化、去噪、定位等步骤。在车牌图像预处理完成后,系统会提取车牌上的字符信息,并基于机器学习算法对字符进行识别。最终,系统将结果输出到显示屏上,同时也可以保存到计算机本地或者上传到云端进行存储。 基于opencv-python的车牌识别技术已经日益成熟,应用也越来越广泛。在交通管理、车辆识别、停车管理等领域都可以发挥重要作用。与传统的车牌识别技术相比,基于opencv-python的车牌识别技术更加精准、高效、便捷。随着互联网技术的不断发展和普及,相信这一技术的应用前景将会更加广阔。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值