之前文章中講過百度云識別圖片文字內容,后來有群友問我怎么獲取圖片上文字的位置,對于這個問題我又看了一下百度云識別的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幫助文檔的時候,是不愿意仔細看下去的,覺得很枯燥無聊,這沒辦法,必須要強迫自己認真看,既然是幫助文檔其實就是說明書,只有看明白了說明書才知道怎么使用。
下面我?guī)е蠹铱凑f明書,首先看到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的都是可以不填的,對于初學者,能省略不填的都先不填,那么就剩下兩個參數了。
然后又發(fā)現,這兩個參數還是二選一,也就說只要一個就行,我們選擇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"]