Board logo

标题: [原创] OCRImage-图片云识别工具(百度云版) [打印本页]

作者: 老刘1号    时间: 2018-6-12 13:35     标题: OCRImage-图片云识别工具(百度云版)

最近正好要批量OCR一些PDF提取出来的图片,就写了一个,
用的是百度云OCR接口,腾讯云倒是也有这种接口,不过比较麻烦,还要实名认证,懒的折腾~
如果可以的话,希望可以放到第三方库里面@CrLf。
用法如下:
老刘封装——图像云OCR工具(百度云版,支持中英文混排)

用法:
CSCRIPT -NOLOGO OCRImage.VBS    <APIKey>        <SecretKey>     <ImageFilePath>

APIKey                  你创建的百度云人工智能应用所附带的APIKey
SecretKey               你创建的百度云人工智能应用所附带的SecretKey
ImageFilePath           图像文件的路径(支持相对路径)

百度云人工智能OCR:     https://cloud.baidu.com/product/ocr

输出信息:
句柄1                   OCR结果
句柄2                   帮助、错误信息、执行耗时

注意:
一、不支持XP系统。
二、图片大小必须小于3M,建议小于1M。否则就会非常慢(VBS的锅,下次换Vb.Net),而且识别效果极差甚至无法识别(这是百度云的锅)。

大家如果懒得注册百度云,添加应用,就先拿去用吧,反正5w次LZ用不完^_^
TsjtQn5zM9jjptHFjlOPwfQp kQnaefbF0PmAQOruq7hBbQZBd1MtWVl1
码云链接:https://gitee.com/OldLiu001/codes/mwcqbtel2po8uf54xrzkh10
GitHub_Gist链接:
源码如下(ImageOCR.VBS,使用自制工具VbsHighLight-Vbs代码着色工具上色):
——————————————————
Rem CODE BY OLDLIU
Option Explicit
Randomize

Dim ExitCode
ExitCode = Main()
WSH.Quit ExitCode

Function Main()
    Const OCR_URL = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"
    If WSH.Arguments.Count = 3 Then
        Dim fso,APIKey,SecretKey,Start_Time
        Start_Time = Timer
        Set fso = CreateObject("Scripting.FileSystemObject")
        APIKey = WSH.Arguments(0)
        SecretKey = WSH.Arguments(1)
        If fso.FileExists(WSH.Arguments(2)) Then   
            Dim ImageFilePath,Token
            ImageFilePath = fso.GetFile(WSH.Arguments(2)).Path '处理相对路径
            Token = GetToken(APIKey,SecretKey)
            If Token <> "ERROR" Then
                With CreateObject("HTMLFILE")
                    .ParentWindow.execScript _
                    "var ImageBase64String_URLEnc = encodeURIComponent('" & FileBase64Enc(ImageFilePath) & "');"
                    If Len(.ParentWindow.ImageBase64String_URLEnc) <= 4*1024*1024 Then
                        .ParentWindow.execScript _
                        "var JSON = " & _
                        HTTP_POST( _
                        OCR_URL & "?access_token=" & Token, _
                        "image="& .ParentWindow.ImageBase64String_URLEnc & _
                        "&language_type=CHN_ENG" & _
                        "&detect_direction=false" & _
                        "&detect_language=false" _
                        )
                        On Error Resume Next
                        Dim Error_Code
                        Error_Code = .ParentWindow.JSON.error_code
                        If Error_Code = Empty Then
                            On Error Goto 0
                            Dim i
                            For i = 0 To .ParentWindow.JSON.words_result_num - 1
                                WSH.Echo Eval(".ParentWindow.JSON.words_result.[" & i & "].words")
                            Next
                            Main = 0
                            WSH.StdErr.WriteLine "成功,用时 " & Timer - Start_Time & " sec。"
                        Else
                            On Error Goto 0
                            Main = 5
                            WSH.StdErr.WriteLine "Error! Code:" & Error_Code & ", msg:" & .ParentWindow.JSON.error_msg
                        End If
                    Else
                        Main = 4
                        WSH.StdErr.WriteLine "文件过大。"
                    End If
                End With
            Else
                Main = 3
                WSH.StdErr.WriteLine "APIKey或SecretKey有误。"
            End If
        Else
            Main = 2
            WSH.StdErr.WriteLine "文件未找到。"
        End If
    Else
        Main = 1
        WSH.StdErr.WriteLine "老刘封装——图像云OCR工具(百度云版,支持中英文混排)" & vbNewLine & vbNewLine & _
        "用法:" & vbNewLine & _
        "CSCRIPT -NOLOGO OCRImage.VBS        <APIKey>        <SecretKey>        <ImageFilePath>" & vbNewLine & vbNewLine & _
        "APIKey                        你创建的百度云人工智能应用所附带的APIKey" & vbNewLine & _
        "SecretKey                你创建的百度云人工智能应用所附带的SecretKey" & vbNewLine & _
        "ImageFilePath                图像文件的路径(支持相对路径)"& vbNewLine & vbNewLine & _
        "百度云人工智能OCR:        https://cloud.baidu.com/product/ocr" & vbNewLine & vbNewLine & _
        "输出信息:" & vbNewLine & _
        "句柄1                        OCR结果" & vbNewLine & _
        "句柄2                        帮助、错误信息、执行耗时" & vbNewLine & vbNewLine & _
        "注意:" & vbNewLine & _
        "一、不支持XP系统。" & vbNewLine & _
        "二、图片大小必须小于3M,建议小于1M。否则就会非常慢(VBS的锅,下次换Vb.Net),而且识别效果极差甚至无法识别(这是百度云的锅)。"
    End If
End Function


Function HTTP_POST(ByVal Address,ByVal Args)
    With CreateObject("MSXML2.XMLHTTP")
        .Open "POST",Address, False
        .SetRequestHeader "CONTENT-TYPE","application/x-www-form-urlencoded"
        .Send Args
        HTTP_POST = .ResponseText
    End With
End Function

Function GetToken(ByVal APIKey,ByVal SecretKey)
    Const GET_TOKEN_URL = "https://aip.baidubce.com/oauth/2.0/token"
    On Error Resume Next
    GetToken = _
    Split( _
    HTTP_POST( _
    GET_TOKEN_URL, _
    "grant_type=client_credentials" & _
    "&client_id="&APIKey & _
    "&client_secret=" & SecretKey _
    ) _
    ,"""")(13)
    If Err.Number <> 0 Then GetToken = "ERROR"
    On Error Goto 0
End Function

Function FileBase64Enc(ByVal strFilePath)
    Dim fso,WshShell,TmpFilePath,oReadFile
    Const ForReading = 1
    Const MyBirthDay = 1228
    Const WINDOW_HIDE = 0
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set WshShell = CreateObject("Wscript.Shell")
    TmpFilePath = fso.GetSpecialFolder(2) & "\" & Fix(Rnd * MyBirthDay) & ".TMP"
    WshShell.Run "Certutil.EXE -ENCODE """ & strFilePath & """ """ & TmpFilePath & """" ,WINDOW_HIDE ,True
    Set oReadFile = fso.OpenTextFile(TmpFilePath,ForReading)
    oReadFile.ReadLine '跳过首行的”-----BEGIN CERTIFICATE-----“标志
    Dim Str
    While Str <> "-----END CERTIFICATE-----"
        FileBase64Enc = FileBase64Enc & Str
        Str = oReadFile.ReadLine
    Wend
    oReadFile.Close
    fso.DeleteFile TmpFilePath
End Function
——————————————————
如果这个工具帮到了您,您可以赞助我们,您的赞助就是我们最大的动力!
个人赞助:
[attach]11267[/attach]
作者: CrLf    时间: 2018-6-12 20:54

已上传
作者: kaze    时间: 2019-3-20 18:28

看不懂,太复杂了,不能处理在线地址图片,下载本地不符合绿色精神。还不是高精度识别,识别不好
作者: 老刘1号    时间: 2019-3-21 09:45

回复 4# kaze


    就是套个api,没啥看懂看不懂的
高精度这个……百度的识别率貌似比起腾讯、搜狗、有道是最差的了,
所以换其它提供商的可能好些。
不能处理在线图片,这个确实不大方便,如果还有下次更新的话写个httpget处理一下
作者: kaze    时间: 2019-3-21 13:40

回复 5# 老刘1号


感谢回复,如果方便的话改成批处理调用JAVASCRIPT的形式,可移植到安卓tasker使用,话说网上有个py脚本识别的,也是看不懂怎么转化,折腾一天我放弃了
作者: 老刘1号    时间: 2019-3-21 19:08

回复 6# kaze


    这个其实不用研究实现,直接看官方api接口文档就行了
作者: holucan    时间: 2019-3-22 15:16

说到OCR这个,Google Drive也有此功能,貌似辨识率很高,
而且没有限制的样子,但就不晓得能不能这么用
弄成批量自动化想必很不错。
作者: 5i365    时间: 2019-4-30 12:47

回复 1# 老刘1号


    您好,本人小白,请问要修改的三个参数在哪里哪呢?能指一下吗,感谢!
作者: 5i365    时间: 2019-5-2 17:30

有大神愿意伸出援手吗? 搞了三天了,还没搞定,提前感谢,
假设我的三个参数如下,我应该怎样改上面的代码呢?
APIKey 是123
SecretKey 是456
ImageFilePath 是c:\123.png
作者: 老刘1号    时间: 2019-5-2 18:13

本帖最后由 老刘1号 于 2019-5-2 18:26 编辑

回复 9# 5i365


    调用方法是:cscript -nologo vbs 123 456 c:\123.png

测试了一下发现确实不能用了,去百度云官方查了一下文档发现Access token获取回来的参数添加了几个,原来参数的位置变了,而写获取token的时候偷懒用字符串分割代替了,所以获取到了错误的token,(大家引以为戒)
顶楼已经更新代码,不过还是不严谨的字符串截取+补救版(其实就是改了个数字),
准备用其它语言重写了,毕竟vbs太慢,顺便加一个位置精确识别功能,好直接转换为word

如果不是批量使用的话,建议用天若OCR,支持快捷键矩形选框截图识别,好几个识别接口,还有公式识别、表格识别等功能,比这个不知道强到哪去了
作者: 5i365    时间: 2019-5-3 05:07

本帖最后由 5i365 于 2019-5-3 05:11 编辑

回复 10# 老刘1号

感谢大师回复,
我是一个批处理的小白,大师能再帮忙指导一下吗?我不想从其它文件中调用这些代码,我想将上面的代码,存成一个名为BaiduOCR.vbs的文件,然后将我的三个参数,写在上面代码的开头,当我双击这个VBS文件的时候,将识别的结果生成一个text文件到桌面上,这能实现吗? 再次感谢!!!
非常感谢大师的源码分享,期待大师用其它语言编写的新作,我会一直关注你的!
   

作者: 5i365    时间: 2019-5-3 14:35

本帖最后由 5i365 于 2019-5-3 14:36 编辑

本人前后用了四天时间,才让上面的代码有输出了!简真太笨了
我用白话说一下我是怎样做的,先把楼主的代码保存为OCRImage.VBS文件,然后在相同的目录下,新建一个 bat文件,文件的内容如下:

CSCRIPT -NOLOGO OCRImage.VBS  "你的百度云APIKey" "你的百度云SecretKey" "你的图片文件路径"
pause

双击bat文件后,稍等一会儿,就出现了识别的结果
但是本人,目前还是不知道怎样把BAT的内容写在同一个VBS中的运行方法,希望各种高手,能指点一下,感谢

作者: ppappa2001    时间: 2019-6-20 10:01

OCRImage.VBS  无法下载?? 连接挂了?麻烦更新下
作者: 老刘1号    时间: 2019-6-20 17:15

回复 13# ppappa2001


    你是认真的么?




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2