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,那么程序不知道图片里有日文,结果就完全不一样了。

posted @ 2020-11-20 21:12  ryueifu  阅读(6158)  评论(8编辑  收藏  举报