CAD日記

主にAutoCADのことについて書いているけど、近頃は投資系ネタに注力している。自動売買、仮想通貨、PC関係、プログラミングなど。@caddiary

ソフト開発

OCRをPowerShellで行う方法

投稿日:

何度か書いてきたが、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 が所有し、これを主張します。
本ツールを使用したことによる事故、損害等の一切について、作者はその責を負いません。
使用される方の責任において、使用して下さい。
改変、再配布は自由です。

-ソフト開発

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

PDFアレコレでPDF暗号化(セキュリティ設定)の第一歩を踏み出した

PDFアレコレをバージョンアップ。約2か月ぶり。 Ver3.01 2020/7/26 ・セキュリティ設定を変更できるようにした。読取パスワード、編集パスワード、編集許可の各種項目が設定可能。  暗号化 …

zipcopyが設計上まちがっていることを書いたがホントにそうかを調べてみた

以下にzipcopy Ver1.07開発中に気付いたことを転記する。 いろいろ直していて気付いたんだけど、そもそものところでこのソフトの設計思想があやまっていた。 ネットワーク上のサーバーにあるファイ …

Teigha改めODAでDWGをDXFに変換するプログラムをつくってみよう!【Part.3】

Part.2の続編。今回はODAプロジェクトがどんな構造になっているのかを、逐一つまびらかにこんこんと説明してみる。 【1.MFCプロジェクトの作成】 ファイル⇒新規作成⇒プロジェクトで、MFCアプリ …

Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃん(2)

Hyper-Vのvhdxを圧縮するのはPowerShellでやるんだけど、その自動化手法がおもしろいじゃんの続き。以下2点の改修をしたスクリプトを作ってみた。 ・vhdファイルが存在しなければ、エラー …

マルチスレッドプログラミング(C++編)

マルチスレッドプログラミング(VB.net編) マルチスレッドプログラミング(C#編) もあるので、ご覧あれ。 5秒以上の時間を要する処理をやらせていると応答なしになってかっこ悪い、なんてことをアラフ …