経緯
C#で作っているWindowsアプリケーションにOCR機能を内蔵することになり、Tesseractを組込んでみたのですが、デバッグ実行する時は動作するのに、発行すると実行時例外で動作せずとても困ったが、遂に解決できたので記事にしたよ。この大AI時代に今更Tesseractかよ!と思うことなかれ。
ちなみに、Windows10のOCR機能の使ってるのですが、日本語が読み取れる分、ちょっと精度が落ちる気がします。日本語を読み取るにはそっちがいいかもしれません。また、AIのOCRは残念ながら .NET Framework4.8 では使えませんでした。
参考にした記事
この辺を参考に、VisualStudio上でTesseractを使ってOCRできるようになるところまでは、割とすんなりいきました。
発行
今回のアプリケーションは、プロジェクトを右クリックして出てくる「発行」メニューで、公開パッケージを作ってインストールしています。何も考えずにこれでアプリケーションをインストールと、new Engine()の時に例外が発生してしまいます。
ネットを調べたり、Copilot先生に聞いたりしても、tessdataのディレクトリの指定が誤ってるのでは、という情報しか出てこないので、自分もそこを、あれやこれや弄っていました。でも最初はそれも発生していたようなんですよね。
原因1
自分は最初、ソリューションエクスプローラーで、プロジェクトの下に、こんな風にtessdataを配置していました。
で、Engineの生成では以下のように指定していました。
これで、デバッグ実行時はうまく動作するようになります。しかし、発行を行ってインストールしたものでは実行時に例外が発生しました。その原因はこれ。
eng.traineddataをクリックすると、下のようにプロパティが表示されますが、ビルドアクションを「コンテンツ」に、出力ディレクトリにコピーを「常にコピーする」に設定します。
原因2
しかし、これだけでは、発行したアプリケーションでは全然動いてくれませんでした。
エライ悩んだんですが、ビルドした時のディレクトリを眺めていたら、Releaseディレクトリの中にもx64とかx86というディレクトリがあることに気づきます。中をみると、tesseract55.dllとleptonica-1.85.0.dllのDLLがありました!絶対これや!
正しいやり方がわからんのですが、このx64ディレクトリをそのままソリューションエクスプローラーにドラック&ドロップして、こんな感じにしました。もちろん、この二つのDLLもビルドアクションを「コンテンツ」に、出力ディレクトリにコピーを「常にコピーする」に設定しました。これで発行すれば、アプリケーションにもコピーされ、インストールしても実行されるようになりました。
最後に
自分はWIndows10のOCR機能も、Tesseractも使っていますが、動画フレーム上の半角英数をOCRしたいだけなので、爆速で良いんですよねー。特にTesseractは英数専用にできるので重宝します。GPTだとネット接続は必要だし10秒、20秒は軽くかかりますもんね。
救われた方がいらっしゃいましたら、ぜひ いいね! で教えてください。
また、そんな配布の仕方はいかんよ、という場合はどうすればよいか教えてください。




