OpenCV-Python身份证信息识别

OpenCV-Python身份证信息识别本篇文章使用OpenCV-Python和CnOcr来实现身份证信息识别的案例 。想要识别身份证中的文本信息 , 总共分为三大步骤:一、通过预处理身份证区域检测查找;二、身份证文本信息提取;三、身份证文本信息识别 。下面来看一下识别的具体过程;CnOcr官网 。识别过程视频
前置环境这里的环境需要安装OpenCV-Python , Numpy和CnOcr 。本篇文章使用的Python版本为3.6 , OpenCV-Python版本为3.4.1.15 , 如果是4.x版本的同学 , 可能会有一些Api操作不同 。这些依赖的安装和介绍 , 我就不在这里赘述了 , 均是使用Pip进行安装 。
识别过程首先 , 导入所需要的依赖cv2 , numpy , cnocr并创建一个show图像的函数 , 方便后面使用:
import cv2import numpy as npfrom cnocr import CnOcrdef show(image, window_name):cv2.namedWindow(window_name, 0)cv2.imshow(window_name, image)cv2.waitKey(0)cv2.destroyAllwindows()# 加载CnOcr的模型ocr = CnOcr(model_name='densenet_lite_136-gru')身份证区域查找通过对加载图像的灰度处理–>滤波处理–>二值处理–>边缘检测–>膨胀处理–>轮廓查找–>透视变换(校正)–>图像旋转–>固定图像大小一系列处理之后 , 我们便可以清晰的裁剪出身份证的具体区域 。
原始图像使用OpenCV的imread方法读取本地图片 。
image = cv2.imread('card.png')show(image, "image")

OpenCV-Python身份证信息识别

文章插图
 
灰度处理将三通道BGR图像转化为灰度图像 , 因为一下OpenCV操作都是需要基于灰度图像进行的 。
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)show(gray, "gray")
OpenCV-Python身份证信息识别

文章插图
 
中值滤波使用滤波处理 , 也就是模糊处理 , 这样可以减少一些不需要的噪点 。
blur = cv2.medianBlur(gray, 7)show(blur, "blur")
OpenCV-Python身份证信息识别

文章插图
 
二值处理二值处理 , 非黑即白 。这里通过cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU , 使用OpenCV的大津法二值化 , 对图像进行处理 , 经过处理后的图像 , 更加清晰的分辨出了背景和身份证的区域 。
threshold = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV +cv2.THRESH_OTSU)[1]show(threshold, "threshold")
OpenCV-Python身份证信息识别

文章插图
 
边缘检测使用OpenCV中最常用的边缘检测方法 , Canny , 检测出图像中的边缘 。
canny = cv2.Canny(threshold, 100, 150)show(canny, "canny")
OpenCV-Python身份证信息识别

文章插图
 
边缘膨胀为了使上一步边缘检测的边缘更加连贯 , 使用膨胀处理 , 对白色的边缘膨胀 , 即边缘线条变得更加粗一些 。
kernel = np.ones((3, 3), np.uint8)dilate = cv2.dilate(canny, kernel, iterations=5)show(dilate, "dilate")
OpenCV-Python身份证信息识别

文章插图
 
轮廓检测使用findContours对边缘膨胀过的图片进行轮廓检测 , 可以清晰的看到背景部分还是有很多噪点的 , 所需要识别的身份证部分也被轮廓圈了起来 。
binary, contours, hierarchy = cv2.findContours(dilate, cv2.RETR_EXTERNAL,cv2.CHAIN_AppROX_SIMPLE)image_copy = image.copy()res = cv2.drawContours(image_copy, contours, -1, (255, 0, 0), 20)show(res, "res")
OpenCV-Python身份证信息识别

文章插图
 
轮廓排序经过对轮廓的排序 , 我们可以准确地提取出身份证的轮廓 。
contours = sorted(contours, key=cv2.contourArea, reverse=True)[0]image_copy = image.copy()res = cv2.drawContours(image_copy, contours, -1, (255, 0, 0), 20)show(res, "contours")
OpenCV-Python身份证信息识别

文章插图
 
透视变换通过对轮廓近似提取出轮廓的四个顶点 , 并按顺序进行排序 , 之后通过warpPerspective对所选图像区域进行透视变换 , 也就是对所选的图像进行校正处理 。


推荐阅读