Excel VBA + Google Cloud Vision API を使って画像から文字列を取り出す

要するにOCRです。Google Cloud Vision APIに画像ファイルを含んだリクエストを送信すると、画像から文字列を抽出してテキストを返してくれるので、そいつを受け取って何かに利用したい場合にお試し下さい。 

とりあえずすぐに動くものが欲しかったので、エラー処理とか細かいことは無視してます。

APIに渡すリクエストとAPIから返ってくるレスポンスはJsonで扱いますが、どちらも力技で解決してます。

ちゃんとしたい人は、Jsonを扱うVBA-Jsonとかいう便利なライブラリがあるのでそちらをどうぞ。

<下準備>

- Google Cloud Platformでアカウントを作って下さい

クレジットカードの情報を登録しなければなりませんが、月1000回までは無料で使えますし、 有料枠も大した額ではないので、事務処理でちょっと使う程度なら、びびる必要もありません。

- Google Cloud Vision APIを取得して下さい

Google Cloud Platformの左上隅の[ナビゲーションメニュー]>[APIとサービス]>[ダッシュボード]>[認証情報]と進み、

[認証情報を作成]ボタンを押して、[APIキー]を選択するとすぐにAPIキーが作成されます。それをコピーして下のコードに貼り付けて使って下さい。

ソースコード

'参照設定:

'Microsoft XML

'Microsoft ActiveX DataObjects x Library

'Microsoft WinHTTP Services

Public Function getStringFromImage(imgPath As String) As String Dim url As String: url = "https://vision.googleapis.com/v1/images:annotate" Dim apikey As String: apikey = ここに取得したAPI Keyを入れる

'画像をBase64形式でエンコードしたものを入れる Dim imgBin As String: imgBin = base64Encode(imgPath)

 'Google Cloud Vision API に渡すJSon形式の文字列 Dim requestString As String requestString = "{""requests"":[{""image"":{""content"":""" & imgBin & """}," & _ """features"":[{""type"":""TEXT_DETECTION"",""maxResults"":10}]}]}" With New WinHttpRequest .Open "POST", url & "?key=" & apikey .setRequestHeader "Content-Type", "application/json" .send requestString If .Status <> 200 Then getStringFromImage = "": Exit Function Dim jsonResponse As String: jsonResponse = .ResponseText End With

'最初の"description"に検出された文字列すべてが入ってるので適当に取ってくる。 Dim st As Long, ed As Long If InStr(1, jsonResponse, """description""") < 1 Then Exit Function st = InStr(1, jsonResponse, """description""") + 16 ed = InStr(1, jsonResponse, """boundingPoly""") - 13

Dim ret As String ret = Mid(jsonResponse, st, ed - st) ret = Replace(ret, "\n", vbNewLine) getStringFromImage = ret

End Function

'画像ファイルのパスを渡してBase64形式にエンコードしたものを返す

Private Function base64Encode(ByVal filePath As String) As String Dim domDoc As New MSXML2.DOMDocument Dim element As Object: Set element = domDoc.createElement("base64")

With New ADODB.Stream .Type = adTypeBinary .Open .LoadFromFile filePath element.DataType = "bin.base64" element.nodeTypedValue = .Read(adReadAll) base64Encode = element.Text .Close End With End Function

特集記事
最新記事
アーカイブ
タグから検索
ソーシャルメディア
  • Facebook Basic Square
  • Twitter Basic Square
  • Google+ Basic Square