Windowsフォームのインク機能③
2014年01月09日
今回は、InkPicture上に書いた文字を認識する方法をご紹介します。
WPFの記事と同様に、Windowsにインストールされている手書き認識エンジンを利用して文字を認識を行います。します。
1. リストボックスと認識ボタンの設置
フォーム内に手書き認識エンジンを列挙するリストボックスと、文字を認識するボタンを設置します。
2. 手書き認識エンジンの列挙
Recognizersクラスを利用することで、インストールされている手書き認識エンジンを列挙することができます。
列挙した手書き認識エンジンは、設置したリストボックス上に表示します。
private void Form1_Load(object sender, EventArgs e) { // ListBox上に表示するRecognizerクラスのプロパティ名を指定する recognizerList.DisplayMember = "Name"; // インストールされている手書き認識エンジンの取得 Recognizers recognizers = new Recognizers(); Recognizers.RecognizersEnumerator recognizersEnum = recognizers.GetEnumerator(); while (recognizersEnum.MoveNext()) { // ListBoxに追加 Recognizer recognizer = (Recognizer)recognizersEnum.Current; recognizerList.Items.Add(recognizer); } }
3. 手書き認識処理の実装
フォーム上に設置した認識ボタンのクリックイベントに対して、手書き認識の処理を実装します。
利用する手書き認識エンジンは、リストボックスで選択したものを利用し、最後に認識した文字列をメッセージボックスで表示しています。
// 手書き認識ボタンのクリック private void recognizerButton_Click(object sender, EventArgs e) { if (recognizerList.SelectedIndex == -1) { MessageBox.Show("手書き認識エンジンを選択してください"); return; } if (inkPicture1.Ink.Strokes.Count == 0) { MessageBox.Show("手書きが行われていません"); return; } // 選択している手書き認識エンジンの取得 Recognizer recognizer = (Recognizer)recognizerList.SelectedItem; // InkPictureの手書きを認識する RecognizerContext context = recognizer.CreateRecognizerContext(); context.Strokes = inkPicture1.Ink.Strokes; context.EndInkInput(); RecognitionStatus status; RecognitionResult result = context.Recognize(out status); if (status != RecognitionStatus.NoError) { MessageBox.Show("認識に失敗しました:" + status); return; } // 認識した文字を表示する MessageBox.Show(result.TopString); }
以上で、InkPicutreに書いた文字を認識する処理の実装が終わりましたので、プロジェクトをビルドしましょう。
前回の記事で注意する点として漏れていましたが、Microsoft.Ink.dllは64bitに対応していないため、以下のような警告がビルド時に表示されます。
構築されているプロジェクトのプロセッサ アーキテクチャ “MSIL” と、参照 “Microsoft.Ink, Version=6.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35″ のプロセッサ アーキテクチャ “AMD64″ の間には不一致がありました。この不一致は、ランタイム エラーを発生させる可能性があります。プロジェクトと参照の間でプロセッサ アーキテクチャが一致するように、構成マネージャーを使用してターゲットとするプロジェクトのプロセッサ アーキテクチャを変更するか、ターゲットとするプロジェクトのプロセッサ アーキテクチャに一致するプロジェクト アーキテクチャとの依存関係を参照で設定することを検討してください。
デフォルトでは、プロジェクトの設定が32bit, 64bit両対応となっていますので、32bitのみに変更します。
プロジェクトのプロパティを表示し、ビルドタブの「プラットフォームターゲット」から設定を変更することができます。
「x86」と設定することで、上記の警告は表示されなくなります。
それでは、実際にアプリケーションを起動し、InkPictureに文字を書いて認識させてみましょう。
以下のスクリーンショットのように、書いた文字がメッセージボックスに表示されるかと思います。
InkPictureでは、手書き認識エンジンを選択し、文字の認識を行いました。
InkEditも同様に手書き認識エンジンを指定し、文字を認識することができますので、次は手書き認識エンジンの設定方法をご紹介します。
4. 手書き認識エンジンの設定ボタン追加
リストボックスの下に「InkEditに設定」というボタンを追加しました。
5. 手書き認識エンジンの設定処理の実装
InkEditへRecognizerクラスを設定することで、手書き認識エンジンを変更することができます。
// InkEditへ手書き認識エンジンを設定 private void recognizerSetButton_Click(object sender, EventArgs e) { if (recognizerList.SelectedIndex == -1) { MessageBox.Show("手書き認識エンジンを選択してください"); return; } // 選択している手書き認識エンジンの取得 Recognizer recognizer = (Recognizer)recognizerList.SelectedItem; // InkEditへ設定 inkEdit1.Recognizer = recognizer; MessageBox.Show(recognizer.Name + "を設定しました"); }
以上で、InkEditの手書き認識エンジンを変更する処理の実装が完了しました。
「Microsoft English (US) Handwriting Recognizer」という手書き認識エンジンを設定し、InkEdit上に表示される文字を比較してみると、日本語を認識できないようになっているかと思います。
Windowsフォームに関するInk機能の実装は、これで終了となります。
サンプルソースはこちらにアップしてありますので、興味のある方は実際に試して頂ければと思います。
次回以降は、Wintabを利用したプログラミングを紹介します。