身份证信息识别 基于tesseract4.0 + opencv + Python
2023-12-28 13:03:15发布 浏览516次 信息编号:90414
友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。
身份证信息识别 基于tesseract4.0 + opencv + Python
身份证信息识别基于.0++
最近开始做一个OCR相关的项目,具体是身份证信息的识别,所以决定使用++来实现这个工作。
.0介绍与安装
它是一款由 HP 开发、现由 HP 维护的开源 OCR 软件。 我曾经想深入了解它的原理和架构,但是整个系统太大了。 很难理解它的原理,也很难自己修改,所以我选择在这里安装可执行程序。 ,配合调用可执行程序直接识别。 安装包的下载地址可以直接在wiki上找到。 csdn上也有很多安装包可供选择。 这里推荐的最新版本的安装包,识别率相对较高,显示方式也比较合理。 。
地址
安装过程我就不详细说了。 很多其他博客已经写得很详细了。 只需注意几个要点即可。 首先,安装时注意选择下载中文语言包,如(简体中文、繁体中文)。 二、注意安装完成后环境变量的配置,尤其是配置,配置完成后
必须重启电脑!!! 必须重启电脑!!! 必须重启电脑!!!
这一点非常重要,否则程序肯定会报错。 这困扰了我将近两个小时,因为它没有重新启动。
您也可以选择通过源码编译的方式安装。 这种方法比较复杂。 可能需要另一篇博客来解释它,因为有太多陷阱。
安装
安装相对容易。 直接用pip安装即可,但是需要注意这一点。 最新版本有版权问题。 虽然有很多函数存在,但是都会报错,会出现如下错误:
cv2.error: OpenCV(3.4.3) C:\projects\opencv
python\opencv_contrib\modules\xfeatures2d\src\sift.cpp:1207: error: (-213:The
function/feature is not implemented) This algorithm is patented and is excluded in this
configuration; Set OPENCV_ENABLE_NONFREE CMake option and rebuild the
library in function ‘cv::xfeatures2d::SIFT::create’
这里出错的原因是这个算法是有专利的,所以不能在这里使用。 解决办法就是安装较低版本(这逼我不能用最新版本,也逼死我了,因为3.7还不能用,喜欢用最新版本的人)
命令如下:
pip install opencv-python==3.4.2.16
pip install opencv-contrib-python==3.4.2.16
身份证信息识别的实现
整个实现过程是:
1.批量读取身份证图片
2、利用SIFT算法匹配特征点,找到身份证的位置,利用映射变换将身份证转换到合适的位置。
3、利用模板匹配算法确定姓名、性别、民族、地址、身份证号码的位置。
4.对图像进行二值化、降噪等操作
5. 使用文本信息识别姓名、性别、种族、地址、身份证号。
批量读取身份证图片
这里需要用到的库,实现代码如下
str1='这里是你图片所在的文件夹'
coll = io.ImageCollection(str1)
此时,所有的图片都已经存入coll中了。
coll[0] 是第一张图片
特征点匹配的SIFT算法
SIFT特征点检测算法是一种检测局部特征的算法。 它通过寻找图像中的特征点及其相关的尺度和描述符来获取特征,并匹配图像特征点。具体原理可以参考这篇博客
实现代码如下:
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1,None) #找到模板图像的特征点
kp2, des2 = sift.detectAndCompute(img2,None) #找到识别的特征点
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm = FLANN_INDEX_KDTREE, trees = 5)
search_params = dict(checks = 10)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1,des2,k=2)
# store all the good matches as per Lowe's ratio test.
#两个最佳匹配之间距离需要大于ratio 0.7,距离过于相似可能是噪声点
good = []
for m,n in matches:
if m.distance < 0.8*n.distance:
good.append(m)
#reshape为(x,y)数组
if len(good)>MIN_MATCH_COUNT:
src_pts = np.float32([ kp1[m.queryIdx].pt for m in good]).reshape(-1,1,2)
dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good]).reshape(-1,1,2)
#用HomoGraphy计算图像与图像之间映射关系, M为转换矩阵
M, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0)
matchesMask = mask.ravel().tolist()
#使用转换矩阵M计算出img1在img2的对应形状
h,w = cv2.UMat.get(img1).shape
M_r=np.linalg.inv(M)
im_r = cv2.warpPerspective(img_org, M_r, (w,h))
取得成果
模板匹配算法
即利用函数进行模板匹配,找到姓名、性别等文字的位置后,由于身份证是刚体,上面文字的位置是固定的,所以根据位置信息找到需要识别的文字,并截取出来
二值化、降噪
利用自适应二值化,然后通过腐蚀、膨胀等形态学操作对图像进行处理,以达到降低图像噪声的目的。
文字识别
使用中的功能
pytesseract.image_to_string(gray, config = "-l chi_sim --oem 1 --psm 7"))
第一个参数是要识别的图像。 第二个参数中,-l后面是语言库选择--oem。 后面的参数1代表使用lstm引擎进行识别,0代表使用传统引擎进行识别,--psm代表识别方式7。表示将图片识别为一行字符
通过这些操作,识别准确率可以得到很大的提高,但是由于识别引擎本身的限制,对中文识别不太友好,识别率还是达不到我需要的那么高。
接下来做什么:
1.通过现有图片进行训练,但官方的LSTM模式训练操作尚未深入理解,传统训练并不能显着提高识别率。
2. 尝试了解它的内部原理,并尝试添加自己的理解(好像不太可能,毕竟别人花了10年时间写的。)问题是资料不多,只有源码,没有评论很多,估计会花很多时间
提醒:请联系我时一定说明是从星空网上看到的!