【エクセル・マクロ】VBA+OCRで画像内のテキストを抽出する
株式会社ブレイブ「システム開発事業部」の工藤です!
制作系案件ブログ第3弾は、指定した画像内のテキストを読み取り、取得するプログラムを紹介します。
画像上に記載されている文字列をプログラムで解析し、テキストだけを文字列として取得することが可能です!
制作系案件ブログ第3弾は、指定した画像内のテキストを読み取り、取得するプログラムを紹介します。
画像上に記載されている文字列をプログラムで解析し、テキストだけを文字列として取得することが可能です!
有料、無料、WEB上、アプリ、さまざまな文字認識(OCR)サービスがあります。
サービスによって精度や手間はまちまちです。今回は、無料で手軽に使え、それなりの精度は見込める、そんな文字認識方法を紹介したいと思います。
目次
文字認識の流れ
今回はローカルに保存された画像に対して文字認識を行うので
- ローカル画像ファイルのパスを指定
- 指定された画像ファイルを解析、文字列を取得・保存
という流れになります。
MDIVWCTL.DLLの入手
※ この項は、すでにMicrosoft Office Document Imaging(以下:MODI)がインストールされている場合は不要です。
MODIは、Office 2003、Office 2007と搭載されていましたが、Office 2010では廃止されてしまいました。
今回のプログラムはMODIを利用するため、パソコンにMODIがインストールされていなければ使えません。
サンプルの使い方
- 上記リンクからZIPファイルをダンロードして解凍します。
- エクセル(ocr.xlsm)を開きます。
- マクロを有効にします。
- 「画像パス」を記入します。(必須)
- テキストを取得したい画像ファイルを指定します。
- 「解析」ボタンを押下します。
- 完了を伝えるメッセージボックスが表示されます。
- 「結果」にテキストが入力されていれば完了です。
サンプルプログラムの説明
動作確認環境
- Windows10
- Excel2007
- InternetExplorer11
参照設定
今回はMODIを利用するので、参照設定を追加します。
デフォルト参照設定
- Visual Basic For Applications
- Microsoft Excel **.* Object Library
- OLE Automation
- Microsoft Office **.* Object Library
追加参照設定
- Microsoft Office Document Imaging **.* Type Library
サンプル
ocr モジュール
''' 参照追加
''' Microsoft Office Document Imaging **.* Type Library
'''
Option Explicit
Sub main()
'
' WS 設定値
'
Dim str_path As String
' WS 設定取得
With ActiveSheet
str_path = .Range("B5").Value
End With
' WS 設定確認
If "" = str_path Then
MsgBox ("画像パスを入力してください。")
Exit Sub
End If
' 記入済データ 消去
ActiveSheet.Range("B15").Value = ""
'
' 処理開始
'
Dim obj_modi As New MODI.Document
Dim obj_image As MODI.Image
Dim obj_layout As MODI.Layout
Dim str_result As String
str_result = ""
' modi object 生成
Set obj_modi = CreateObject("MODI.Document")
With obj_modi
' 画像をセット
.Create str_path
' OCR タイプ (17:日本語)
.ocr 17
' modi image 確認
If 0 < .Images.Count Then
' modi 画像 object
Set obj_image = .Images.Item(0)
Set obj_layout = obj_image.Layout
With obj_layout
' データ取得
' Debug.Print .Language
' Debug.Print .NumChars
' Debug.Print .NumFonts
' Debug.Print .NumWords
str_result = .Text
End With
Set obj_layout = Nothing
Set obj_image = Nothing
End If
End With
Set obj_modi = Nothing
' 結果の確認
If "" = str_result Then
str_result = "※ テキストを取得出来ませんでした。"
End If
' 結果 保存
ActiveSheet.Range("B15").Value = str_result
MsgBox ("解析が完了しました。")
End Sub
プログラムの説明
ocr モジュール
' WS 設定取得
With ActiveSheet
str_path = .Range("B5").Value
End With
' WS 設定確認
If "" = str_path Then
MsgBox ("画像パスを入力してください。")
Exit Sub
End If
入力されている値を確認します。
「画像パス」は空欄禁止。
「画像パス」は空欄禁止。
' 記入済データ 消去
ActiveSheet.Range("B15").Value = ""
前回取得した情報をクリアにします。
' modi object 生成
Set obj_modi = CreateObject("MODI.Document")
With obj_modi
' 画像をセット
.Create str_path
' OCR タイプ (17:日本語)
.ocr 17
' modi 画像 object
Set obj_image = .Images.Item(0)
Set obj_layout = obj_image.Layout
With obj_layout
' データ取得
' Debug.Print .Language
' Debug.Print .NumChars
' Debug.Print .NumFonts
' Debug.Print .NumWords
str_result = .Text
End With
Set obj_layout = Nothing
Set obj_image = Nothing
指定された画像を解析し、文字列を取得します。
' 結果の確認
If "" = str_result Then
str_result = "※ テキストを取得出来ませんでした。"
End If
' 結果 保存
ActiveSheet.Range("B15").Value = str_result
MsgBox ("解析が完了しました。")
解析結果をシートに書き出します。
まとめ
サンプルファイルのダウンロード
今回はMODIを利用し、画像から文字列を抽出する方法について、サンプルをもとに解説しました。
今回のサンプルでは、MODI.Layoutから、まとめてテキストを取得しましたが、MODI.LayoutのWordsプロパティを使えば、一文字ずつ取得することもできます。
手軽に利用できるところから、完璧な精度は望めませんが、フォント次第では十分に実用出来るものだと思います。
※ 取得したテキストを無許可で公開してしまうと著作権に触れる可能性があるのでご注意ください。
※ 本プログラムを利用しために被る損害について、当社に故意または重大な過失がある場合を除き、当社は一切その責任を負いません。
プログラムの開発、お見積り、お問い合わせは、こちらから、ご連絡ください。
まだ仕様の決まっていない場合のご相談などもお気軽にご相談ください。
まだ仕様の決まっていない場合のご相談などもお気軽にご相談ください。