python基于万象优图识别图片中的中文

最近一直在研究光学字符识别,即OCR。最开始在谷爹那里了解到了开源的Tesseract,能够拿来识别简单的英文和数字。可是识别中文的准确率并不高。python

而后从Tesseract到Tesseract.js,通过屡次尝试研究,最后发现腾讯爹的万象优图识别率是最高的。趁如今是公测免费期,赶忙尝试了一把。json

下面来讲一说我是怎么用python实现中文识别的。服务器

首先百度万象优图登陆吧,腾讯的。。。大家懂得。。。。进去后,建立一个bucket,而后能够选择上传图片app

 

 

这些准备工做作好之后,就开始写代码吧dom

首先若是是识别身份证,名片,标签等图片的话,强烈建议直接使用万象优图提供python sdk,详情请见https://cloud.tencent.com/document/product/460/7991post

 

咱们这里,是作图片通用印刷体识别,因此就只有被迫用万象优图提供的API:(本来我是更喜欢用SDK的,由于简单,可是目前SDK不支持)加密

 

万象优图OCR接口采用http协议,支持指定图片URL和 上传本地图片文件两种方式。url

根据用户提供的图片,返回识别出的字段信息。spa

接口:http://recognition.image.myqcloud.com/ocr/general3d

 

这里有三点须要注意:

(1) 每一个请求的包体大小限制为6MB。

(2) 全部接口都为POST方法。

(3) 不支持 .gif这类的多帧动图。

 

而后我用能够使用requests模块来发http请求。

这里最麻烦的就是要定制请求头,否则腾讯云是解析不到的,笔者才疏学浅在这里研究了一下午才正肯定制出了请求头。。。。

先来看看请求头的规则:

参数名 描述
Host recognition.image.myqcloud.com 服务器域名
Content-Length 包体总长度 整个请求包体内容的总长度,单位:字节(Byte)
Content-Type Application/json或者Multipart/form-data 根据不一样接口选择
Authorization 鉴权签名 用于鉴权的签名,使用屡次有效签名。详情

 

这里的难点就是这个鉴权签名,直接点击表格里面的详情去看吧,我这里不作复制粘贴。

关于请求参数:

使用image则使用 multipart/form-data格式

不使用image则使用 application/json格式

参数名 是否必须 类型 参数说明
appid 必须 string 项目ID
bucket 必须 string 空间名称
image 可选 binary 图片内容
url 可选 string 图片的url,image和url只提供一个便可,若是都提供,只使用url

好了,如今开始正式开始吧

先写一下请求头涉及到的变量

而后依次把他们拼接起来

我这里采用的是单次

 

而后再根据要求进行 HMAC-SHA1加密

这里强调一下,官方的说法是

根据个人研究,转换出来的不是二进制,而后我还特地去转成了二进制。。。。。。发现其实根本不用,转出来的在pycharm里面是个乱码,能够直接用的

最后,加密的数据和以前的拼接数据再拼在一块儿作base64转码

这样签名就完成了,后面的基本不难,主要就是签名这里有坑,下面直接上代码:

 

# coding=utf-8
# /usr/bin/python
# coding=utf-8
# create by 15025463191 2017/10/11

import requests
import hmac
import hashlib
import base64
import time
import random
import re

appid = "1254602529"
bucket = "imgregnise"
secret_id = "AKIDZx72kFVBPRF4324234234o8C1auynPezyl"  #我更改了,不要复制个人
secret_key = "h9NUN1RbZIm11mJbUt2v32432Zx"  #我更改了,不要复制个人
expired = time.time() + 2592000
onceExpired = 0
current = time.time()
rdm = ''.join(random.choice("0123456789") for i in range(10))
userid = "0"
fileid = "tencentyunSignTest"

info = "a=" + appid + "&b=" + bucket + "&k=" + secret_id + "&e=" + str(expired) + "&t=" + str(current) + "&r=" + str(
    rdm) + "&u=0&f="

signindex = hmac.new(secret_key, info, hashlib.sha1).digest()  # HMAC-SHA1加密
sign = base64.b64encode(signindex + info)  # base64转码

url = "http://recognition.image.myqcloud.com/ocr/general"
headers = {'Host': 'recognition.image.myqcloud.com',
           "Content-Length": "187",
           "Content-Type": "application/json",
           "Authorization": sign
           }

payload = {
    "appid": appid,
    "bucket": bucket,
    "url": "http://imgregnise-1254602529.picsh.myqcloud.com/123456.png"
}

r = requests.post(url, json=payload, headers=headers)
responseinfo = r.content

r_index = r'itemstring":"(.*?)"'  # 作一个正则匹配
result = re.findall(r_index, responseinfo)
for i in result:
    print i

 

 

 

我这里用图片试验了一次,准备率仍是很高的,就是中间少了一个“餐。”

可是这样的识别率已是很高了

 最后预祝各类识别成功!

 

 

 

相关文章
相关标签/搜索