python + Face++ —>实现检测和识别银行卡
知识储备:
描述
检测和识别银行卡,并返回银行卡卡片边框坐标及识别出的银行卡号。当前 Beta 版本一次只支持识别一张银行卡,图像内有多张卡时,返回识别结果置信度最高的银行卡。支持任意角度的识别
图片要求 :
图片格式:JPG(JPEG),PNG
图片文件大小:2 MB
卡片像素尺寸:最小 100*100 像素,最大 4096*4096 像素,短边不得低于 100 像素。
相关文档
准备工作:
a:python3.5(博主用的)
b:个人Face++账号(这里牵扯到个人的公钥和密钥所以才会有自己的Face++账号)
Face++网址
c:博主是在Pycharm运行环境下进行操作的,如果没有Pycharm用其他的多功能记事本也ok的,例如Geany这是博主前期用的一多功能记事本。
Pycharm下载安装
不废话啦进入正题
前提:一个文件夹下操作(牵扯到导入函数所以才注明会在一个文件夹下)
实现功能 :实现检测和识别银行卡
步骤:
1:文件夹id_bank下:新建:get_bank_read.py
代码:
# coding=utf-8
"""
@author: jiajiknag
程序功能:用于实现调用测试字典嵌套的函数
"""
def get_bank_value(date, keys, default=None):
#default=None,在key值不存在的情况下,返回None
keys_list = keys.split('.')
#以“.”为间隔,将字符串分裂为多个字符串,其实字符串为字典的键,保存在列表keys_list里
if isinstance(date,dict):
#如果传入的数据为字典
dictionary = dict(date)
#初始化字典
for i in keys_list:
#按照keys_list顺序循环键值
try:
if dictionary.get(i) != None:
dict_values = dictionary.get(i)
#如果键对应的值不为空,返回对应的值
elif dictionary.get(i) == None:
dict_values = dictionary.get(int(i))
#如果键对应的值为空,将字符串型的键转换为整数型,返回对应的值
except:
return default
#如果字符串型的键转换整数型错误,返回None
dictionary = dict_values
return dictionary
else:
#如果传入的数据为非字典
try:
dictionary = dict(eval(date))
#如果传入的字符串数据格式为字典格式,转字典类型,不然返回None
if isinstance(dictionary,dict):
for i in keys_list:
#按照keys_list顺序循环键值
try:
if dictionary.get(i) != None:
dict_values = dictionary.get(i)
#如果键对应的值不为空,返回对应的值
elif dictionary.get(i) == None:
dict_values = dictionary.get(int(i))
#如果键对应的值为空,将字符串型的键转换为整数型,返回对应的值
except:
return default
#如果字符串型的键转换整数型错误,返回None
dictionary = dict_values
return dictionary
except:
return default
2:文件夹id_bank下:新建:bank_Id_Card.py
代码:
# coding=utf-8
"""
@author: jiajiknag
程序功能:
"""
# 导入同一级文件夹的函数
from get_bank_read import get_bank_value
# 导包
import requests
from json import JSONDecoder
import datetime
# 协议URL/API参数--这里对应的face++的证件识别的URL:
http_url = "https://api-cn.faceplusplus.com/cardpp/beta/ocrbankcard"
# 公钥
key = "自己账号中的公钥"
# 密钥
secret = "自己账号的密钥"
# 图片地址
imagpath = "D:\ceshi_id\k.png" #本地自己图片的地址
# 默认值是0,不返回
data = {"api_key":key, "api_secret": secret}
# open()中"rb":r是只读,b是二进制,ipgpath是图片路径
files = {"image_file": open(imagpath, "rb")}
# 请求获取
response = requests.post(http_url, data=data, files=files)
# 内容编码设置是UTF-8
# 将json字符串转换成Python dict类型(字典类型)
req_con = response.content.decode('utf-8')
req_dict = JSONDecoder().decode(req_con)
#print(req_dict)
# 不加[0]的话,返回的是列表内有一个字典,形式为[{}],加入[0],则是一个字典
jjk_bank_message = req_dict["bank_cards"][0]
print("银行卡右上角的像素点X坐标:"+ str(get_bank_value(jjk_bank_message,"bound.right_top.x")))
print("银行卡右上角的像素点y坐标:"+ str(get_bank_value(jjk_bank_message,"bound.right_top.y")))
print("银行卡左上角的像素点X坐标:"+ str(get_bank_value(jjk_bank_message,"bound.left_top.x")))
print("银行卡左上角的像素点Y坐标:"+ str(get_bank_value(jjk_bank_message,"bound.left_top.y")))
print("银行卡右下角的像素点X坐标:"+ str(get_bank_value(jjk_bank_message,"bound.right_bottom.x")))
print("银行卡右下角的像素点Y坐标:"+ str(get_bank_value(jjk_bank_message,"bound.right_bottom.y")))
print("银行卡左下角的像素点X坐标:"+ str(get_bank_value(jjk_bank_message,"bound.left_bottom.x")))
print("银行卡左下角的像素点Y坐标:"+ str(get_bank_value(jjk_bank_message,"bound.left_bottom.y")))
print("银行卡号:"+ str(get_bank_value(jjk_bank_message,"number")))
说明::在Pycharm中导入函数时显示是错误的如下图:
But:你不用管不影响运行结果,可能是Pycharm的bug鬼知道那,不影响我们调用函数运行结果我就没管!!!
3:结果
备注:
图片大家就自己用自己的银行卡拍奥。
博主是新手,要有不对的地方或者任何建议和意见以及批评等还望指出!!!