本文适合于所有层次的Python学习者,包括AI爱好者和技术爱好者来学习。诚然,人工智能是个有着深刻数学逻辑的知识体系,包括机器学习,搜索问题,知识表示等等等等的理论。本文,严禁的说,我们只是简单调用了百度AI的成果,jacky通过本文希望给大家一个启发吧,毕竟理论是理论,实际是实际,赚钱是赚钱,就这样。
本文视频演示如下(由于环境因素的限制,这段演示视频是无声的,后期jacky 在Gitchat ,阿里云以及抖音都会有直播的分享,请大家关注): 视频演示链接
(一)先看看系统的效果
(二)系统实现的大致思路
本文的视频演示如下:
系统开发环境要求: 1.开发工具:Pycharm 、PyQt5 2.开发模块: urllib、urllib.request、Base64、json、PyQt5 3.API 接口:百度API
2.1 图片识别工具界面
PyQt5 桌面 GUI 开发
这部分,是 jacky 上次主要的分享内容,不是很熟悉的朋友可以参见《Python 智能银行卡识别系统的实现 (1)— PyQt5 实现登陆功能》,也可以配合本次视频前面的操作演示来看。
2.2 选择识别类型
我们要设定识别的银行卡,信用卡还是身份证等等
2.3 选择要识别的图片
这里的主要难点就是要搞懂这句代码:self.label_3.setPixmap(scarePixmap),具体的代码注解可以参见第三部分的完整代码,其他的技巧点都是Qt 里东西,关于QPixmap的用法等等,因为不是逻辑性的东西,大家可以自行百度。
2.4 识别结果
这里用到的就是百度的AI 接口,
2.5 复制到粘贴板
这是PyQt5 的一些小功能,我们自行百度即可。
(三)完整代码
from PyQt5
import QtCore
, QtGui
, QtWidgets
from PyQt5
.QtWidgets
import *
from PyQt5
.QtGui
import *
from PyQt5
.QtCore
import *
import json
import urllib
, urllib
.request
, sys
import ssl
import base64
API_KEY
= "jacky提醒你,这里要输入你自己申请的AK,不要忘记"
SECRET_KEY
= "jacky提醒你,这里要输入你自己申请的AK,不要忘记"
class Ui_Form(object):
def setupUi(self
, Form
):
Form
.setObjectName
("Form")
Form
.resize
(793, 452)
self
.widget
= QtWidgets
.QWidget
(Form
)
self
.widget
.setGeometry
(QtCore
.QRect
(80, 41, 631, 371))
self
.widget
.setObjectName
("widget")
self
.gridLayout
= QtWidgets
.QGridLayout
(self
.widget
)
self
.gridLayout
.setContentsMargins
(0, 0, 0, 0)
self
.gridLayout
.setObjectName
("gridLayout")
self
.pushButton
= QtWidgets
.QPushButton
(self
.widget
)
self
.pushButton
.setObjectName
("pushButton")
self
.gridLayout
.addWidget
(self
.pushButton
, 2, 2, 1, 1)
self
.lineEdit
= QtWidgets
.QLineEdit
(self
.widget
)
self
.lineEdit
.setObjectName
("lineEdit")
self
.gridLayout
.addWidget
(self
.lineEdit
, 2, 1, 1, 1)
self
.label_2
= QtWidgets
.QLabel
(self
.widget
)
self
.label_2
.setObjectName
("label_2")
self
.gridLayout
.addWidget
(self
.label_2
, 2, 0, 1, 1)
self
.label_3
= QtWidgets
.QLabel
(self
.widget
)
self
.label_3
.setObjectName
("label_3")
self
.label_3
.setStyleSheet
("background-color:gray")
self
.gridLayout
.setObjectName
("label_3")
self
.gridLayout
.addWidget
(self
.label_3
, 3, 0, 1, 3)
self
.lineEdit_2
= QtWidgets
.QLineEdit
(self
.widget
)
self
.lineEdit_2
.setObjectName
("lineEdit_2")
self
.gridLayout
.addWidget
(self
.lineEdit_2
, 7, 0, 1, 2)
self
.pushButton_2
= QtWidgets
.QPushButton
(self
.widget
)
self
.pushButton_2
.setObjectName
("pushButton_2")
self
.gridLayout
.addWidget
(self
.pushButton_2
, 7, 2, 1, 1)
self
.label
= QtWidgets
.QLabel
(self
.widget
)
self
.label
.setObjectName
("label")
self
.gridLayout
.addWidget
(self
.label
, 0, 0, 1, 1)
self
.comboBox
= QtWidgets
.QComboBox
(self
.widget
)
self
.comboBox
.setObjectName
("comboBox")
self
.comboBox
.addItem
("")
self
.gridLayout
.addWidget
(self
.comboBox
, 0, 1, 1, 1)
self
.retranslateUi
(Form
)
QtCore
.QMetaObject
.connectSlotsByName
(Form
)
def retranslateUi(self
, Form
):
_translate
= QtCore
.QCoreApplication
.translate
Form
.setWindowTitle
(_translate
("Form", "智能银行卡识别系统_v1.0"))
self
.pushButton
.setText
(_translate
("Form", "选择"))
self
.label_2
.setText
(_translate
("Form", "选择要识别的图片"))
self
.label_3
.setText
(_translate
("Form", ""))
self
.lineEdit_2
.setText
(_translate
("Form", "显示识别结果"))
self
.pushButton_2
.setText
(_translate
("Form", "复制"))
self
.label
.setText
(_translate
("Form", "需要识别的类型:"))
self
.comboBox
.setItemText
(0, _translate
("Form", "银行卡"))
self
.comboBox
.setItemText
(1, _translate
("Form", "身份证"))
self
.comboBox
.setItemText
(2, _translate
("Form", "车牌号"))
self
.pushButton
.clicked
.connect
(self
.openfile
)
def openfile(self
):
self
.download_path
= QFileDialog
.getOpenFileName
(self
.widget
,"请选择需要识别的图片","/","Image File(*.jpg *.png)")
if not self
.download_path
[0].strip
():
pass
else:
self
.lineEdit
.setText
(self
.download_path
[0])
pixmap
= QPixmap
(self
.download_path
[0])
scarePixmap
= pixmap
.scaled
(QSize
(629,271),aspectRatioMode
=Qt
.KeepAspectRatio
)
self
.label_3
.setPixmap
(scarePixmap
)
self
.typeTp
()
def typeTp(self
):
if self
.comboBox
.currentIndex
()==0:
self
.get_token
()
self
.get_bankcard
(self
.get_token
())
def get_token(self
):
host
= 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id='+API_KEY
+'&client_secret='+SECRET_KEY
request
= urllib
.request
.Request
(host
)
request
.add_header
('Content-Type', 'application/json; charset=UTF-8')
response
= urllib
.request
.urlopen
(request
)
content
= response
.read
()
if (content
):
print(content
)
self
.access_token
= json
.loads
(content
)['access_token']
return self
.access_token
def get_bankcard(self
,access_token
):
url
= 'https://aip.baidubce.com/rest/2.0/ocr/v1/bankcard?access_token=' + access_token
f
= open(self
.download_path
[0], 'rb')
img
= base64
.b64encode
(f
.read
())
params
= {"image": img
}
params
= urllib
.parse
.urlencode
(params
).encode
('utf-8')
request
= urllib
.request
.Request
(url
, params
)
request
.add_header
('Content-Type', 'application/x-www-form-urlencoded')
response
= urllib
.request
.urlopen
(request
)
content
= response
.read
()
if (content
):
print(content
)
bankcards
= json
.loads
(content
)
stover
= '识别结果:\n'
try:
if bankcards
['result']['bank_card_type'] == 0:
bank_card_type
= "不能识别"
elif bankcards
['result']['bank_card_type'] == 1:
bank_card_type
= "借记卡"
elif bankcards
['result']['bank_card_type'] == 2:
bank_card_type
= "信用卡"
stover
+= '卡号: {}\n 银行:{}\n 类型:{}'.format(bankcards
['result']['bank_card_number'],bankcards
['result']['bank_name'],bank_card_type
)
except BaseException
:
stover
+= '解析错误'
self
.lineEdit_2
.setText
(stover
)
if __name__
== "__main__":
import sys
from PyQt5
.QtGui
import QIcon
app
= QtWidgets
.QApplication
(sys
.argv
)
MainWindow
= QtWidgets
.QMainWindow
widget
= QtWidgets
.QWidget
()
ui
= Ui_Form
()
ui
.setupUi
(widget
)
widget
.show
()
sys
.exit
(app
.exec_
())