zoukankan      html  css  js  c++  java
  • VBA调用百度智能云的文字识别获取图片中的数字

    平时经常需要把相片中的文字转换为可编辑的文字。

    百度的文字识别可以让C#、Python等语言调用。我把它整合到了API封装库了。

    API封装库的下载和部署,请参考下帖:

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

    下面我演示一下,如何在VBA中调用API封装库中的Image2Character函数,实现了提取相片中的数据。

    在Excel VBA中添加外部引用API和正则表达式。

    模块中的代码如下:

    Private S As String
    Sub GetData()
        Dim B As New API.Baidu
        Dim Result As String
        S = B.Image2Character(imagepath:="E:粉煤灰2.jpg")
        Debug.Print S
    End Sub
    Sub Split()
        Dim Reg As RegExp, MC As MatchCollection, M As Match
        Set Reg = New RegExp
        With Reg
            .Global = True
            .Pattern = Chr(34) & "([0-9.]+)mg/L" & Chr(34)
            Set MC = .Execute(S)
            For Each M In MC
                Debug.Print M.SubMatches(0)
            Next M
        End With
    End Sub

    GetData负责把电脑中的一个图片中的文字提取出来,赋给变量S。

    Split负责把变量S根据指定的模式进行分解。

    本例处理的是一张化工物质含量检测的科研图片,该图片中含有L22和L23两个样品的数据,我关心的是Conc这一列,也就是单位是mg/L的。

    当我执行了GetData过程以后,立即窗口结果:

     可以看到变量S是一个JSON字符串,定义了每一个单词在图片中的位置(Location)、宽度高度等,另外键Words对应的就是要提取的文本了。那么这么长一个JSON包含很多mg/L结尾的数字,如何提取出来呢?可以用JavaScript的功能,也可以用正则表达式。此处简单地用模式 "([0-9.]+)mg/L" 就可以获取全部。

    继续执行Split方法,立即窗口打印出纯数字。接下来把这些粘贴到单元格中就可以进行处理了。

    很多情况下,用户想得到的是图片中的表格内容。但是利用文字识别功能得到是是一个很长的字符串,破坏了原来表格的结构。不过没关系,利用JSON或正则表达式还可以还原为矩阵形式的表格,这属于字符串处理的内容。 

     另外,百度的这个功能也支持网络上图片的文字识别, 例如https://i.cnblogs.com/assets/adminlogo.png中的图片为:

    把这个路径传递到Image2Character函数中,可以看到运行后S的值中包含“博客园”。

    从上面的输出结果可以看到,输出的JSON字符串中包含location这些位置信息。不过这个函数可以让用户选择是否需要位置信息。

    另外,还可以事先传达给程序,这个图片中是哪一国家的文字,默认是CHN_ENG。如果是中英文以外的图片,必须传递参数。

    可以指定哪些参数,请参考百度文字识别的技术文档:

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

    假设我有一张日语的图片。

    代码应该修改为

    Sub GetData()
        Dim B As New API.Baidu
        Dim Result As String
        S = B.Image2Character(imagepath:="D:TempJP.jpg", Containslocation:=False, Options:="&language_type=JAP")
        Debug.Print S
    End Sub

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

  • 相关阅读:
    git 教程
    gruntjs
    arm linux
    2021最佳迎接元旦的方式是什么!程序员:中国新冠疫苗上市!
    元旦表白神器!C语言实现浪漫烟花表白(有背景音乐+示例源码)
    大学期间,为啥我能学好C语言?只因我做到了这五点!
    为什么都说代码改变世界?是因为这五位程序员创造了未来!
    C++丨常见的四种求最大公约数方法!赶紧收藏!
    【腾讯C++面试题】如何才能获得腾讯的offer?掌握这20道终身受益!
    惊呆了!字节跳动成唯一上榜的中国公司!它是如何做到脱颖而出的?
  • 原文地址:https://www.cnblogs.com/ryueifu-VBA/p/14013069.html
Copyright © 2011-2022 走看看