目录
1.作者介绍
薛凯,男,西安工程大学电子信息学院,2021级研究生
研究方向:机器视觉与人工智能
电子邮件:1142268929@qq.com
刘帅波,男,西安工程大学电子信息学院,2021级研究生,张宏伟人工智能课题组
研究方向:机器视觉与人工智能
电子邮件:1461004501@qq.com
2.基于百度API的身份证识别
2.1 百度ORC接口简介
光学识别符Optical Character Recognition(ORC),其目标是对图像中的字符进行分析识别,将其转换为文本格式的字符序列。利用模式识别和数字图像处理技术解决文字输入问题。主要应用领域:牌照,票据,文稿,名片,身份证,驾驶执照,汽车制造业。
2.2 算法介绍
一个典型的身份证识别算法流程图如下:
2.2.1图像预处理
身份证图像的预处理是指对采集到的身份证图像进行灰度化和去噪处理,以使身份证图像图像的质量得到改善,同时保留和增强身份证中纹理和颜色的信息,去除可能影响身份证区域纹理和颜色信息的噪点,为身份证图像定位提供方便。主要方法:图像灰度化;图像灰度拉伸;空域滤波之中值滤波。
2.2.2身份证图像粗定位
使原始图像经过各种算法的处理后能够清楚地显示出身份证图像区域,同时使图像中的非身份证区域减弱,从而能准确有效地定位出身份证在图像中的位置。算法主要有:边缘检测法、数学形态学法、基于纹理分析的定位方法、行检测和边缘统计法、遗传算法,Hough变化和轮廓线法、基于小波变换的方法、神经网络法等。
2.2.3细定位各种信息和分割
由于身份证的信息位置固定,可直接指定ROI区域的子图像;或采用垂直投影和水平投影定位。
2.2.4识别信息
识别信息是计算量比较大的一部分。方法有模板匹配字符识别算法;统计特征匹配法(13线法);神经网络字符识别算法;SVM+特征提取;以及最近比较火的深度学习之CNN。测试时模板匹配识别率较低,利用SVM+特征提取识别较好。
3.实验
3.1实验准备
本次实验我们采用的是百度API进行识别,故需要安装baidu-aip模块
首先打开命令行,在里面输入pip install baidu-aip。
如上图,即是安装成功。
因为本项目采用pyqt5进行了界面编写,故还需要安装pyqt5模块。
打开命令行,在里面输入pip install pyqt5即可安装。
接下来需要去百度AI的官网去创建应用,获取AppID,APIKey,Secret Key。
3.2实验过程
本次实验采用的是网上搜集来的虚假身份证图片进行识别。首先打开图片,界面中会显示打开的身份证图片,点击开始识别,等待几秒,信息会出现在下方的文本框中。
如上图所示,成功识别到姓名、民族、住址、出生、性别等信息。
4. 完整代码
import sys
from PyQt5 import QtWidgets, QtCore, QtGui
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from aip import AipOcr
#注意;开代理,无法连接至百度服务器,程序会崩溃。
APP_ID = '*******' # 填自己的APP_ID
API_KEY = '********' # 填自己的API_KEY
SECRET_KEY = '********' # 填自己的SECRET_KEY
class picture(QWidget):
def __init__(self):
super(picture, self).__init__()
self.resize(1200, 800)
self.setWindowTitle("身份证识别")
self.setWindowIcon(QIcon('1.png'))
self.setWindowFlags(Qt.FramelessWindowHint) # 去边框
#self.setAttribute(Qt.WA_TranslucentBackground) # 设置窗口背景透明
window_pale = QtGui.QPalette()
window_pale.setBrush(self.backgroundRole(), QtGui.QBrush(QtGui.QPixmap("E:/IDcard/png/2333.png")))
self.setPalette(window_pale)
button_red = QPushButton(self)
button_red.move(20, 20)
button_red.setFixedSize(20, 20)
button_red.setStyleSheet("QPushButton{\n"
" background:#CE0000;\n"
" color:white;\n"
" box-shadow: 1px 1px 3px;border-radius: 10px;\n"
"}\n"
"QPushButton:hover{ \n"
" background:red;\n"
"}\n"
"QPushButton:pressed{\n"
" border: 1px solid #3C3C3C!important;\n"
" background:black;\n"
"}")
button_red.clicked.connect(self.quit_button)
button_orange = QPushButton(self)
button_orange.move(50, 20)
button_orange.setFixedSize(20, 20)
button_orange.setStyleSheet("QPushButton{\n"
" background:orange;\n"
" color:white;\n"
" box-shadow: 1px 1px 3px;border-radius: 10px;\n"
"}\n"
"QPushButton:hover{ \n"
" background:yellow;\n"
"}\n"
"QPushButton:pressed{\n"
" border: 1px solid #3C3C3C!important;\n"
" background:black;\n"
"}")
button_green = QPushButton(self)
button_green.move(80, 20)
button_green.setFixedSize(20, 20)
button_green.setStyleSheet("QPushButton{\n"
" background:green;\n"
" color:white;\n"
" box-shadow: 1px 1px 3px;border-radius: 10px;\n"
"}\n"
"QPushButton:hover{ \n"
" background:#08BF14;\n"
"}\n"
"QPushButton:pressed{\n"
" border: 1px solid #3C3C3C!important;\n"
" background:black;\n"
"}")
button_green.clicked.connect(self.min_button)
self.label1 = QLabel(self)
self.label1.setText(" 图片显示区")
self.label1.setFixedSize(500, 400)
self.label1.move(350, 75)
# self.label1.setStyleSheet("QLabel{background:white;}"
# "QLabel{color:rgb(300,300,300,120);font-size:48px;font-weight:bold;font-family:微软雅黑;}"
# )
self.label1.setStyleSheet("QLabel{\n"
" background:white;\n"
" font-family:微软雅黑;\n"
" color:black;\n"
"font-size:48px;\n"
" box-shadow: 1px 1px 3px;border-radius: 10px;\n"
"}\n"
"}")
self.text1 = QLineEdit(self)
self.text1.setText("身份证信息")
self.text1.setFixedSize(1140, 50)
self.text1.move(30, 550)
#self.text1.setFixedWidth(800);
self.text1.setStyleSheet("QLineEdit{\n"
" background:white;\n"
" font-family:微软雅黑;\n"
" color:black;\n"
" box-shadow: 1px 1px 3px;border-radius: 10px;\n"
"}\n"
"QPushButton:hover{ \n"
" background:#00BFFF;\n"
"}\n"
"QPushButton:pressed{\n"
" border: 1px solid #3C3C3C!important;\n"
" background:black;\n"
"}")
btn1 = QPushButton(self)
btn1.setText("打开图片")
btn1.resize(200, 100)
btn1.move(150, 650)
btn1.setStyleSheet("QPushButton{\n"
" background:#6495ED;\n"
" font-family:微软雅黑;\n"
" color:white;\n"
" box-shadow: 1px 1px 3px;border-radius: 10px;\n"
"}\n"
"QPushButton:hover{ \n"
" background:#00BFFF;\n"
"}\n"
"QPushButton:pressed{\n"
" border: 1px solid #3C3C3C!important;\n"
" background:black;\n"
"}")
btn1.clicked.connect(self.openimage)
btn2 = QPushButton(self)
btn2.setText("开始识别")
btn2.resize(200, 100)
btn2.move(750, 650)
btn2.setStyleSheet("QPushButton{\n"
" background:#6495ED;\n"
" font-family:微软雅黑;\n"
" color:white;\n"
" box-shadow: 1px 1px 3px;border-radius: 10px;\n"
"}\n"
"QPushButton:hover{ \n"
" background:#00BFFF;\n"
"}\n"
"QPushButton:pressed{\n"
" border: 1px solid #3C3C3C!important;\n"
" background:black;\n"
"}")
btn2.clicked.connect(self.checkimage)
def quit_button(self,event):
reply = QtWidgets.QMessageBox.question(self,
'身份证识别',
"是否要退出程序?",
QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No,
QtWidgets.QMessageBox.No)
if reply == QtWidgets.QMessageBox.Yes:
event.accept()
else:
event.ignore()
#quit()
def full_button(self):
self.showMaximized()
def mid_button(self):
self.showNormal()
def min_button(self):
self.showMinimized( )
def openimage(self):
global imgName
imgName, imgType = QFileDialog.getOpenFileName(self, "打开图片", "", "*.jpg;;*.png;;All Files(*)")
jpg = QtGui.QPixmap(imgName).scaled(self.label1.width(), self.label1.height())
self.label1.setPixmap(jpg)
def checkimage(self):
#os.chdir(r'E:\IDcard')
#print(imgName)
picture = open(imgName, mode='rb')
img = picture.read()
# 读取图片
idCardSide = 'front' # 身份证正面
#idCardSide = 'back' #身份证反面
options = {}
options['detect_direction'] = 'true' # 是否检测图像朝向,默认不检测
options['detect_risk'] = 'false' # 是否开启身份证风险类型
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
text = client.idcard(img, idCardSide, options)
print(text)
# 识别图片中的信息
concat_text = []
if isinstance(text, dict):
words = text['words_result']
for k, v in words.items():
# print(u'{k}:{v}'.format(k=k, v=v['words']))
tt = u'{k}:{v}'.format(k=k, v=v['words'])
concat_text.append(tt)
len1 = len(concat_text)
if len1 >= 5:
print(concat_text)
self.text1.setText(concat_text[0]+"\n"+concat_text[1]+"\n"
+concat_text[2]+"\n"+concat_text[3]+"\n"
+concat_text[4]+"\n"+concat_text[5])
if len1 <= 3:
print(concat_text)
self.text1.setText(
concat_text[0] + "\n" + concat_text[1] + "\n" + concat_text[2])
# 把字典解析成我们熟悉的形式
def mousePressEvent(self, e):
if e.button() == Qt.LeftButton:
self.m_drag = True
self.m_DragPosition = e.globalPos() - self.pos()
e.accept()
def mouseReleaseEvent(self, e):
if e.button() == Qt.LeftButton:
self.m_drag = False
def mouseMoveEvent(self, e):
try:
if Qt.LeftButton and self.m_drag:
self.move(e.globalPos() - self.m_DragPosition)
e.accept()
except:
print("错误代码:000x0")
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
my = picture()
my.show()
sys.exit(app.exec_())