.NET MAUIとOCRで遊ぶ

久し振りにエンジニアっぽいエントリーです。

.NET MAUIでWinRT APIのOCRエンジンを実装してみました、というおはなし。

.NET MAUIとは

昨今の.NET界隈にはあまり詳しくなく、MS公式からの受け売りになるのですが、

.NET Multi-Platform App UI (.NET MAUI) は、C# と XAML を使用して、ネイティブのモバイル アプリやデスクトップ アプリを作成するためのクロスプラットフォーム フレームワークです。

.NET MAUI を使用すると、1 つの共有コード ベースから Android、iOS、macOS、Windows で実行できるアプリを開発できます。

.NET MAUI とは – .NET MAUI | Microsoft Learn

ということで、要するにXamarinの進化系っぽいものです。

作ったもの

ぶっちゃけ作りかけですが、こちらに置いておきます。

とりあえずMVVM化

いかんせんMAUIでまともに作るのが初めてだったため、知名度の高いMVVMフレームワークをリサーチするところから始まりました。

結果、DIコンテナはMAUIに搭載されていることが分かり、INotifyPropertyChangedのアレをするのにReactivePropertyを、BindableBaseは自作することにしました。

その他、フォルダの構成などは概ね以下のサイトを参考にしました。

.NET MAUI で MVVM パターンを書いてみよう – 放浪軍師のアプリ開発局 (gunshi.info)

WinRT APIを使うための設定

手なりで進めているとWinRT APIがそのままでは使えないことが分かりました。エラー内容的にはWindows以外のプラットフォームで対応していない、みたいな感じだったと思います。

これは以下を参考にしてプロジェクトファイルを変更して解決しました。

.NET6アプリからUWPのAPI(WinRT API)を使う – tera1707’s blog

プロジェクトファイルにあったのは TargetFrameworks というプロパティだったのですが、これはコメントアウトして単数形のプロパティを新規追加するかたちで。これが正攻法なのかどうかは分かりません。

<!--<TargetFrameworks>net6.0-android;net6.0-ios;net6.0-maccatalyst</TargetFrameworks>
<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net6.0-windows10.0.19041.0</TargetFrameworks>-->
<TargetFramework>net6.0-windows10.0.19041.0</TargetFramework>

これでWindowsしか動作しなくなります。最早MAUIで作っている意味が分からなくなってきますが、今回はサンプルということでヨシとします。ヨシとさせてください。

OCRの実装

さほど自分で考えるところはなくて、以下のQiita記事を参考にしました。

C#.net(WPF)で画面を文字認識してみる – Qiita

お作法的なところは置いておいて、ここがOCRのミソになります。

OcrResult =  await _engine.RecognizeAsync(softwareBitmap);

ファイル選択と画像の表示

ユーザーにファイルを選択させるにはFilePickerを使用します。我らの古きOpenFileDialogはお亡くなりになったようです。
ファイル ピッカー – .NET MAUI | Microsoft Learn

で、ViewのImageコントロールにバインドするときはImageSource型のプロパティに紐付けます。

Model.Value.ResultImage = ImageSource.FromFile(result.FullPath);
<Image Source="{Binding Model.Value.ResultImage}" />

所感

そんなこんなでだいたい完成。

特に何もしなくてもUIがそれなりに小綺麗に整っているのは嬉しいですね。

で、肝心のOcrEngineについて雑感ですが、日本語に関してはぶっちゃけさほど精度はよくないかなと思いました。

ドキュメントを眺める限り、認識精度のチューニングができそうなプロパティやメソッドもないですし、MS的にはAzure Cognitive Servicesを使えって感じなんでしょうかね。

OcrEngine クラス (Windows.Media.Ocr) – Windows UWP applications | Microsoft Learn

以上です。

コメントを残す

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