之前文章中讲过百度云识别图片文字内容,后来有群友问我怎么获取图片上文字的位置,对于这个问题我又看了一下百度云识别的api接口文档,看到它是有能够识别位置的接口,所以这个问题是可以解决的。
接下来详细的和大家说说这个问题啊,本期文章我们主要讲解稍微复杂的api接口该怎么对接。(文章最低下有源码,建议最后查看)
如果你想学会post对接api,请认真看这篇文章,保证你能学会!
主要知识点有以下几个:
一、post方式提交数据的方法
二、怎么查看api帮助文档,包括参数、返回值等等
下面我们正式这期文章教程的讲解,先来看看准备工作,首先你要有一个百度账号,这是最起码的要求,然后登陆百度云识别平台:
http://ai.baidu.com/tech/ocr
新建一个应用,获取到API Key和Secret Key,这两个就是开启api使用大门的钥匙。
之前那期文章我给大家的源码然后直接使用,并没有说源码怎么来的。那么这期就给大家说说具体的获取步骤:先来获取帮助文档,打开连接http://ai.baidu.com/docs#/OCR-API/top
在右侧有菜单选项,点击上图通用文字识别(含位置信息。。),说实话右侧的菜单看起来有些不习惯。之后在中间位置就可以看到本期的重点——帮助文档。
很多人初次接触这些api帮助文档的时候,是不愿意仔细看下去的,觉得很枯燥无聊,这没办法,必须要强迫自己认真看,既然是帮助文档其实就是说明书,只有看明白了说明书才知道怎么使用。
下面我带着大家看说明书,首先看到HTTP方式是post方式,对于post方式至少需要两个有效的数据——post地址,post内容。接下来我们就在说明书里面找这两个数据。
一、post地址:
请求URL:https://aip.baidubce.com/rest/2.0/ocr/v1/general
二、post内容:
帮助文档中的全部URL参数。
对于参数来说,有些是直接填写,有些是需要通过代码获取的,有些参数是可填可不填的。
我们按照帮助文档的顺序逐一整理出来。
关于参数分两部分组成:参数名和参数值,以上图为例,
参数名:access_token
参数值:通过API Key和Secret Key获取的access_token,参考“Access Token获取”
关于参数值这部分,它是需要通过代码获取的,所以要分析它是怎么得到的,点击“Access Token获取”的链接。
通过截图内容可以看出要想获取access_token的值,还是需要post方式提交,那么老套路,分析post地址和post内容。
post地址:
https://aip.baidubce.com/oauth/2.0/token
post内容:如下图3个参数
依然按照参数名=参数值的形式写一下。
grant_type=client_credentials
client_id=你自己的api key
client_secret=你自己的secret key
为了保护账号隐私,我自己key隐藏掉,你可以根据文章开头说的,自己查看自己账号的key值。post内容是将所有参数用&连接起来。
post内容=grant_type=client_credentials&client_id=你自己的api key&client_secret=你自己的secret key
post地址和post内容都准备好了以后,就可以操作了,使用的命令是url.post,当然山海插件也有post相关的命令。
具体形式如下:
dim 返回值=url.post(post地址,post内容)
看一下在安卓按键中的实际代码:
得到的返回值:
一大段英文字母放到这里,看起来很费劲,通过形式我们可以判断出是json数据,之前有好几篇文章都讲到json的提取,稍后我会在文章底部推荐文章中放上教程链接。
我们先把json格式化一下,用在线的工具http://www.bejson.com/
格式化以后,按照“ 键名:键值”这个格式换行了,看起来很清晰。
我们需要返回值中键名叫access_token的键值。
代码:
dim token=Encode.JsonToTable(返回值)
TracePrint token["access_token"]
这部分关于access_token这个参数就结束了。
接下来返回百度云识别参数的帮助文档看下一个参数。
参数是Content-Type=application/x-www-form-urlencoded是直接用的参数。
下面是“请求参数”,这部分重要,划重点了,所有post对接的参数,必不可少的就是这部分参数了。
参数一大段,先看第二列,是否必须,提示false的都是可以不填的,对于初学者,能省略不填的都先不填,那么就剩下两个参数了。
然后又发现,这两个参数还是二选一,也就说只要一个就行,我们选择image这个参数,因为平时识别的图片都是本地的居多。来看看它的说明介绍。
图片要求是base64编码,再转url编码。关于两个编码我们不需要掌握它的原理,只需要使用对应的命令即可。
base64编码:ShanHai.ReadFileBase(路径)
url编码:shanhai.CharToUrl(base64)
要识别的图片:
转码后的返回值:
对于这个返回值,虽然复杂但是不需要任何提取处理,所以不用管它,稍后直接用就行。
现在百度云识别需要的所有参数都搞定了,开始动手识别了。
下图回顾一下这个几个参数。
post内容="access_token="&token["access_token"]&"&Content-Type=application/x-www-form-urlencoded&image="&图片
将上面所有内容合并在一起,
运行代码的返回值依然是json,格式化以后如下图
稍微分析一下:
"words_result_num": 4, 意思是有4组文字(4行文字)
"words": "63+332+24等于多少?" 意思是识别的内容是"63+332+24等于多少?"
"location": {意思是定位
"width": 446,意思是文字块宽度446
"top": 331,意思是文字块距顶部331(纵坐标)
"height": 54,意思是文字块高度54
"left": 30意思是文字块距左侧30 (横坐标)
},
注意:说的横坐标和纵坐标都是相对于图片左上角,而不是屏幕啊
提取json内容:
Dim json=Encode.JsonToTable(myjson)
TracePrint json["words_result"][1]["words"]
TracePrint json["words_result"][1]["location"]["left"]
TracePrint json["words_result"][1]["location"]["top"]
在提取代码当中有[1],如果你想提取第一行内容,就写1,第二行内容就写2,只要不超过图片中文字的行数,就都是有效的。
根据我们提取的返回值可以看出,图片上第一行文字内容是"63+332+24等于多少?" 横坐标是30,纵坐标是331。
最终我们就可以实现识别图片文字的位置。
稍微啰嗦一句,我们在看api文档的时候,有很多非必须填写的参数,这些虽然可以不填,但不代表没有用,它们可能是满足一些特殊需求的参数,在你掌握基础的参数使用方法以后,建议去看看这些参数的使用。
好了,本期内容就这些,知道有些朋友就喜欢直接用源码:
Dim api="7h4Y7Ejb21kUrXYpxhmQRfnt"
Dim Secret="zgGwEcIcXFCWrsqmALYLGzrnGq2qaMjy"
Dim post地址="https://aip.baidubce.com/oauth/2.0/token"
Dim post内容="grant_type=client_credentials&client_id="&api&"&client_secret="&Secret
Dim 返回值=url.post(post地址,post内容)
TracePrint 返回值
dim token=Encode.JsonToTable(返回值)
TracePrint token["access_token"]
Dim 路径="/sdcard/pictures/tx.png"
Import "shanhai.lua"
Dim base64=ShanHai.ReadFileBase(路径)
Dim 图片=shanhai.CharToUrl(base64)
Dim post内容1="access_token="&token["access_token"]&"&Content-Type=application/x-www-form-urlencoded&image="&图片
Dim myjson=url.post("https://aip.baidubce.com/rest/2.0/ocr/v1/general",post内容1)
TracePrint myjson
Dim json=Encode.JsonToTable(myjson)
TracePrint json["words_result"][1]["words"]
TracePrint json["words_result"][1]["location"]["left"]
TracePrint json["words_result"][1]["location"]["top"]