影子是一个会撒谎的精灵,它在虚空中流浪和等待被发现之间;在存在与不存在之间....

您现在的位置是:主页 > 工作记 >

按键精灵_百度云识别获取图片上文字的位置


  • 如果你想学会post对接api,请认真看这篇文章,保证你能学会!


    主要知识点有以下几个:

    一、post方式提交数据的方法

    二、怎么查看api帮助文档,包括参数、返回值等等


    下面我们正式这期文章教程的讲解,先来看看准备工作,首先你要有一个百度账号,这是最起码的要求,然后登陆百度云识别平台:

    http://ai.baidu.com/tech/ocr

    新建一个应用,获取到API Key和Secret Key,这两个就是开启api使用大门的钥匙。


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    之前那期文章我给大家的源码然后直接使用,并没有说源码怎么来的。那么这期就给大家说说具体的获取步骤:先来获取帮助文档,打开连接http://ai.baidu.com/docs#/OCR-API/top

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    在右侧有菜单选项,点击上图通用文字识别(含位置信息。。),说实话右侧的菜单看起来有些不习惯。之后在中间位置就可以看到本期的重点——帮助文档。

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    很多人初次接触这些api帮助文档的时候,是不愿意仔细看下去的,觉得很枯燥无聊,这没办法,必须要强迫自己认真看,既然是帮助文档其实就是说明书,只有看明白了说明书才知道怎么使用。

    下面我带着大家看说明书,首先看到HTTP方式是post方式,对于post方式至少需要两个有效的数据——post地址,post内容。接下来我们就在说明书里面找这两个数据。

    一、post地址:

    请求URL:https://aip.baidubce.com/rest/2.0/ocr/v1/general

    二、post内容:

    帮助文档中的全部URL参数。

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    对于参数来说,有些是直接填写,有些是需要通过代码获取的,有些参数是可填可不填的。

    我们按照帮助文档的顺序逐一整理出来。

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    关于参数分两部分组成:参数名和参数值,以上图为例,

    参数名:access_token

    参数值:通过API Key和Secret Key获取的access_token,参考“Access Token获取”

    关于参数值这部分,它是需要通过代码获取的,所以要分析它是怎么得到的,点击“Access Token获取”的链接。

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    通过截图内容可以看出要想获取access_token的值,还是需要post方式提交,那么老套路,分析post地址和post内容。

    post地址:

    https://aip.baidubce.com/oauth/2.0/token

    post内容:如下图3个参数

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    依然按照参数名=参数值的形式写一下。

    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内容)

    看一下在安卓按键中的实际代码:

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    得到的返回值:

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    一大段英文字母放到这里,看起来很费劲,通过形式我们可以判断出是json数据,之前有好几篇文章都讲到json的提取,稍后我会在文章底部推荐文章中放上教程链接。

    我们先把json格式化一下,用在线的工具http://www.bejson.com/

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    格式化以后,按照“ 键名:键值”这个格式换行了,看起来很清晰。

    我们需要返回值中键名叫access_token的键值。

    代码:

    dim token=Encode.JsonToTable(返回值)

    TracePrint token["access_token"]

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    这部分关于access_token这个参数就结束了。


    接下来返回百度云识别参数的帮助文档看下一个参数。


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)



    参数是Content-Type=application/x-www-form-urlencoded是直接用的参数。


    下面是“请求参数”,这部分重要,划重点了,所有post对接的参数,必不可少的就是这部分参数了。


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)



    参数一大段,先看第二列,是否必须,提示false的都是可以不填的,对于初学者,能省略不填的都先不填,那么就剩下两个参数了。


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)



    然后又发现,这两个参数还是二选一,也就说只要一个就行,我们选择image这个参数,因为平时识别的图片都是本地的居多。来看看它的说明介绍。


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    图片要求是base64编码,再转url编码。关于两个编码我们不需要掌握它的原理,只需要使用对应的命令即可。


    base64编码:ShanHai.ReadFileBase(路径)

    url编码:shanhai.CharToUrl(base64)


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)



    要识别的图片:


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    转码后的返回值:


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)



    对于这个返回值,虽然复杂但是不需要任何提取处理,所以不用管它,稍后直接用就行。


    现在百度云识别需要的所有参数都搞定了,开始动手识别了。

    下图回顾一下这个几个参数。


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)



    post内容="access_token="&token["access_token"]&"&Content-Type=application/x-www-form-urlencoded&image="&图片

    将上面所有内容合并在一起,

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    运行代码的返回值依然是json,格式化以后如下图

    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    稍微分析一下:

    "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"]


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)


    百度云识别获取图片上文字的位置(按键精灵post方式讲解)



    在提取代码当中有[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"]