VBA調用百度智能雲的文字識別獲取圖片中的數字


平時經常需要把相片中的文字轉換為可編輯的文字。

百度的文字識別可以讓C#、Python等語言調用。我把它整合到了API封裝庫了。

API封裝庫的下載和部署,請參考下帖:

https://www.cnblogs.com/ryueifu-VBA/p/10128063.html

 

下面我演示一下,如何在VBA中調用API封裝庫中的SendData函數,實現了提取相片中的數據。

在Excel VBA中添加外部引用API。

 

模塊中的代碼如下:

Private B As API.Baidu
Private N As API.Network
Private O As API.Other

Sub 百度智能雲_通用場景文字識別()
   Dim url As String
    url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic?charset=UTF-8&access_token=24.bdaf66e1441c945c98d2802597d133c3.2592000.1634512823.282335-24856804"
    Dim headers As String
    headers = "{'content-type':'application/x-www-form-urlencoded'}"
    Dim data  As String
    Dim base64 As String
    Set O = New API.Other
    Set B = New API.Baidu
    base64 = O.FileTobase64(Filename:="E:\粉煤灰\2.jpg")
    Set N = New API.Network
    base64 = N.UrlEncode(url:=base64)
    data = "image=" & base64
    Dim s As String
    s = B.SendData(url:=url, headers:=headers, data:=data, utf8:=True)
    Debug.Print s
End Sub

 

本例處理的是一張化工物質含量檢測的科研圖片,該圖片中含有L22和L23兩個樣品的數據,我關心的是Conc這一列,也就是單位是mg/L的。

當我執行了GetData過程以后,立即窗口結果:

 

 可以看到變量S是一個JSON字符串,定義了每一個單詞在圖片中的位置(Location)、寬度高度等,另外鍵Words對應的就是要提取的文本了。那么這么長一個JSON包含很多mg/L結尾的數字,如何提取出來呢?可以用JavaScript的功能,也可以用正則表達式。此處簡單地用模式 "([0-9\.]+)mg/L" 就可以獲取全部。

繼續執行Split方法,立即窗口打印出純數字。接下來把這些粘貼到單元格中就可以進行處理了。

很多情況下,用戶想得到的是圖片中的表格內容。但是利用文字識別功能得到是是一個很長的字符串,破壞了原來表格的結構。不過沒關系,利用JSON或正則表達式還可以還原為矩陣形式的表格,這屬於字符串處理的內容。 

 另外,百度的這個功能也支持網絡上圖片的文字識別,例如 

 

 

Sub 百度智能雲_手寫文字識別()
    Dim url As String
    url = "https://aip.baidubce.com/rest/2.0/ocr/v1/handwriting?charset=UTF-8&access_token=24.bdaf66e1441c945c98d2802597d133c3.2592000.1634512823.282335-24856804"
    Dim headers As String
    headers = "{'content-type':'application/x-www-form-urlencoded'}"
    Dim data  As String
    data = "url=" & "http://img.alicdn.com/imgextra/i2/1984011608/TB2yDCNheJ8puFjy1XbXXagqVXa_%21%211984011608.jpg_620x10000.jpg"
    Set B = New API.Baidu
    Dim s As String
    s = B.SendData(url:=url, headers:=headers, data:=data, utf8:=True)
    Debug.Print s
    Dim J As API.JSON
    Set J = New API.JSON
    J.Parse s
    Debug.Print J.ToString
    Dim words() As String
    words = J.GetMultipleValues(Jpath:="$.words_result[*].words")
    Debug.Print Join(words, vbNewLine)
End Sub

識別結果為:

 

 

輸出的JSON字符串中包含location這些位置信息。不過這個函數可以讓用戶選擇是否需要位置信息。

另外,還可以事先傳達給程序,這個圖片中是哪一國家的文字,默認是CHN_ENG。如果是中英文以外的圖片,必須傳遞參數。

可以指定哪些參數,請參考百度文字識別的技術文檔:

https://cloud.baidu.com/doc/OCR/s/tk3h7y2aq

假設我有一張日語的圖片。

Options參數必須用&開頭。

再次運行上述程序,識別結果為:

{"log_id": 4725858224074987814, "words_result_num": 11, "words_result": [{"words": "RANDEN "}, {"words": "等持院"}, {"words": "B 8 "}, {"words": "立命館大學衣笠キャンパス前"}, {"words": "Ritsumeikan University "}, {"words": "りょうあんし"}, {"words": "とうじいん"}, {"words": "きたのはくばいちょう"}, {"words": "Ryoanji "}, {"words": "りめいんだいがくきがさきゃんすまえ"}, {"words": "B 9 "}]}

如果不傳遞language_type,那么程序不知道圖片里有日文,結果就完全不一樣了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM