何度か書いてきたが、Snipping ToolのOCR機能を外部から操れないかというアプローチについて、ようやく第一歩が踏めたのでここに公開する。なお、以下はWindows 11でのお話しなので、他のOS利用者は読む価値がないものと認識されたし。
● SnippingTooのlOCR機能についての情報元
【Windows11 SnippingTool OCR from commandline】
C++のコードとビルド用のbat(makeファイル)がセットになったもの。oneocr.dllをリバースエンジニアリング解析して、エクスポートされた関数を特定。さらに関数の引数を解析して、OCRするためのロジックを解明したとのこと。画像処理にOpenCVが関与していたことが解析のキモだったらしい。
【ksasao/SnippingToolOcrSharp】
上記C++のコードをC#で書き換えて、oneocr.dllのC#ラッパーとしたもの。.NETプログラミングのほうが一般性が高いので、これがあるとないでは大きなちがいあり。
【Delphi SnippingTool OCR ソース(izawa-web)】
oneocr.dllを操作するところをDelphiで書き換えたもの。CADに関わる人なので、テキスト化した情報をAutoCADなどで表現しているところが秀逸。OCRした結果のテキストには座標があるので位置を明確にできるわけだ。さらにPDFを画像化するというところもやっているので、PDF⇒画像⇒OCRでテキスト化⇒CAD図面に配置という流れができる。
● OCRをPowerShellで手っ取り早く行う方法
理屈はいいから、手っ取り早く試してみたい人は、以下からダウンロードされたし。
OCRのツール
これだけでは動かないので、必要なDLLを自分のマシンからコピーしてくる必要あり。コピー元は、SnippingTool.exeと同じ場所で以下3つのファイルが対象。3つの合計で109MBと少し大きい。
oneocr.dll
oneocr.onemodel
onnxruntime.dll
私のマシンだと以下フォルダだったが、環境によっては変化することだろう。
C:\Program Files\WindowsApps\Microsoft.ScreenSketch_11.2602.49.0_x64__8wekyb3d8bbwe\SnippingTool
適当な画像をクリップボードにコピー(画面キャプチャでもよし)して、ocr_sample.batをダブルクリックしてみよう。何もエラーが出ずに終わったなら、クリップボードにテキストが入っているので、メモ帳なんかで貼り付けとしてみよう。さてどうだろうか。
なお、上記zip内にはSnippingToolOcr.dllが同梱されていて、これがApache-2.0 licenseなので、再頒布するための条件をクリアするために、SnippingToolOcr.dllのREADME.mdとLICENSEを同梱している。
● OCRをPowerShellでどうやっているのか?
詳しくは上記zip内のocr_sample.ps1を見てもらえばわかるが、ここでは概要を書いておく。
SnippingToolOcr.dllを使えるようにして、C#からそのdllを呼び出すコードを書いている。独自クラスExecOcrだけでもよさそうな感じだったが、得たテキスト情報をPowerShell側に渡すための独自クラスOneTextを定義した。SnippingToolOcr.dll内にほぼ同じ型のクラスがあるも、なぜかPowerShell側で使えなかった。
PowerShell側では、クリップボードから画像情報を得てファイル化。ロードしたdllでOCR(画像ファイルからテキスト化)して、テキストをクリップボードに入れているだけ。
見てもらうとわかるが、OCRした結果はテキストだけではなく4つのXY座標がある。このスクリプトでは座標を利用していないが、うまく利用すればXY座標系の指定した位置にテキストを表現できる。この4つの座標から文字高さ、幅、配置角度をどうやって取得するかがカギで、現時点ではよくわかっていない。CADの原点は左下だが、CAD以外(スクリーンやPDFなど)では左上が原点になるので、Y座標は上下反転させるためにImage.Heightを取得しているが実際の反転処理はしていない。
結果としてクリップボードに入るテキスト情報は上から順になっているので、シンプルにテキストだけ抜き出すなら座標はいらないということはわかっている。また、座標と言ってもピクセルの値でやってくるので、画像解像度からミリ系の値に変換して利用する必要があるだろう。
● 著作権、制限事項
使用しているライブラリの著作権は、それぞれの作者、企業が所有しています。
本ツールの著作権は、作者 caddiary が所有し、これを主張します。
本ツールを使用したことによる事故、損害等の一切について、作者はその責を負いません。
使用される方の責任において、使用して下さい。
改変、再配布は自由です。