光学式マーク認識(OMR)は、特殊なタイプのドキュメントフォームにマークされたデータをキャプチャして分析する自動化されたプロセスです。この特別なタイプの文書は、調査フォーム、テストシート、およびその他の紙の文書で人々によってマーク/記入される可能性があります。この記事では、C#を使用してGUIベースのOMRシートリーダーアプリケーションを開発する方法を学習します。私たちのソリューションは、スキャンしたOMRシート画像をローカルディスクからの入力として受け取り、マークを認識し、最後にマークされた登録番号と影付きの回答をCSV形式でエクスポートします。上記の手順を実行すると、.NETにC#光学式マーク認識(OMR)ソフトウェアがインストールされます。それでは始めましょう。
この記事は、次のトピックをカバーするものとします。
- C#光学式マーク認識(OMR)ソフトウェアの機能
- C#光学式マーク認識.NET APIおよびUIコントロール
- OMRソフトウェアを開発する手順
- C#光学式マーク認識(OMR)ソフトウェアデモ
- OMRソフトウェアのソースコードをダウンロード
C#光学式マーク認識(OMR)ソフトウェアの機能
当社の光学式マーク認識(OMR)ソフトウェアには、次の機能があります。
- 認識パラメータをインタラクティブに調整し、その効果をリアルタイムで監視します。以下を調整できます。
- 認識しきい値
- ズーム
- バブルを表示/非表示
- スキャンした画像を次の形式で選択してロードします。
- 画像上の光学マークを認識します。
- 結果をCSVでエクスポートし、ローカルディスクに保存します。
C#光学式マーク認識.NETAPIおよびUIコントロール
Aspose.OMR for .NET APIを使用すると、解答用紙、テスト、MCQペーパー、クイズ、フィードバックフォーム、調査、投票用紙を設計、作成、認識できます。さらに、.NETUIアプリケーションに追加できるグラフィカルユーザーインターフェイスコントロールを提供します。 Aspose.OMR for .NETUIコントロールを.NETUIアプリケーションに統合して、OMRスキャナー/リーダーアプリケーションを開発します。 APIのDLLをダウンロードするか、NuGetを使用してインストールしてください。
PM> Install-Package Aspose.OMR
OMRソフトウェアを開発する手順
以下の手順に従って、GUIベースのOMRスキャナー/リーダーアプリケーションを開発できます。
- まず、新しいプロジェクトを作成し、WPFアプリ(.NET Framework)プロジェクトテンプレートを選択します。
- 次に、[新しいプロジェクトの構成]ダイアログで、プロジェクト名を入力し、場所を選択して、他のパラメーターを設定します。
- 次に、NuGetパッケージマネージャーを開き、Aspose.OMRfor.NETパッケージをインストールします。
- 次に、新しいファイルDialogHelper.csをプロジェクトに追加します。
- 新しく作成したDialogHelper.csに次のコードを追加します。
internal class DialogHelper
{
///<summary>
///テンプレート画像を開くダイアログのフィルター文字列。
///</summary>
private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";
///<summary>
///認識結果を保存するダイアログのフィルター文字列
///</summary>
private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";
///<summary>
///[画像ファイルを開く]ダイアログを表示します。
///</summary>
///<returns>選択したファイルへのパス、または<c>ヌル</c>ファイルが選択されていない場合。</returns>
public static string ShowOpenImageDialog(string suggestedDir = null)
{
OpenFileDialog dialog = new OpenFileDialog();
return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
}
///<summary>
///[認識結果ファイルの保存]ダイアログを表示します。
///</summary>
///<returns>選択したファイルへのパス、または<c>ヌル</c>ファイルが選択されていない場合。</returns>
public static string ShowSaveDataDialog(string suggestedName)
{
SaveFileDialog dialog = new SaveFileDialog();
return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
}
///<summary>
///指定されたダイアログを表示し、その結果を<c>ストリング</c>。
///</summary>
///<param name="dialog">表示するダイアログ。</param>
///<param name="filter">ファイルタイプのフィルター文字列。</param>
///<param name="suggestedDir">推奨されるダイアログの初期ディレクトリ</param>
///<param name="suggestedName">推奨ファイル名</param>
///<returns>選択したファイルへのパス、または<c>ヌル</c>ファイルが選択されていない場合。</returns>
private static string ShowDialog(FileDialog dialog, string filter, string suggestedDir = null, string suggestedName = null)
{
string fileName = null;
dialog.Filter = filter;
dialog.RestoreDirectory = true;
if (suggestedName != null)
{
dialog.FileName = suggestedName;
}
if (suggestedDir != null)
{
dialog.InitialDirectory = suggestedDir;
}
bool? result = dialog.ShowDialog();
if (result == true)
{
fileName = dialog.FileName;
}
return fileName;
}
}
- 次に、MainWindow.xamlファイルを次のXAMLコンテンツで更新します。
<Window x:Class="OMR_APP.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:OMR_APP"
mc:Ignorable="d"
Title="Aspose OMR Demo" Height="880" Width="1100">
<Grid Background="WhiteSmoke">
<Grid.RowDefinitions>
<RowDefinition Height="40"></RowDefinition>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<ToolBar Grid.Row="0" Background="LightGray">
<TextBox Name="txtTemplatePath" Margin="5" Width="400" Height="30" Background="White"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center">
</TextBox>
<Button Margin="5" Width="100" Height="30" Background="White"
Content="Get control" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
Click="GetButtonClicked"/>
<Separator/>
<Button Margin="5" Width="100" Height="30" Background="White"
Content="Select Image" Click="SelectImageClicked"/>
<Button Margin="5" Width="100" Height="30" Background="White"
Content="Recognize Image" Click="RecognizeImageClicked"/>
<Button Margin="5" Width="100" Height="30" Background="White"
Content="Export Results" Click="ExportResultsClicked"/>
</ToolBar>
<ContentControl Grid.Row="1" x:Name="CustomContentControl"
HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Window>
- その後、MainWindow.xaml.csファイルの次のコンテンツを置き換えます。
///<summary>
///テスト用テンプレート
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";
///<summary>
///ライセンスAspose.OMR.NET.licファイルへのパス
///</summary>
private static readonly string LicensePath = @"";
private CorrectionControl control;
public MainWindow()
{
InitializeComponent();
// テンプレートファイルのパスを設定して表示する
txtTemplatePath.Text = TemplateFilePath;
// ライセンスを設定し、ライセンスファイルのパスを指定してコメントを外し、完全な結果をテストします
//ライセンスlic=new License();
//lic.SetLicense(LicensePath);
}
public string UserImagePath { get; set; }
public string DataFolderPath { get; set; }
///<summary>
///CorrectionControlをロードして表示します
///</summary>
private void GetButtonClicked(object sender, RoutedEventArgs e)
{
string path = txtTemplatePath.Text;
try
{
OmrEngine engine = new OmrEngine();
TemplateProcessor processor = engine.GetTemplateProcessor(path);
control = engine.GetCorrectionControl(processor);
CustomContentControl.Content = control;
control.Initialize();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message,"Exception");
}
}
///<summary>
///画像を選択して表示
///</summary>
private void SelectImageClicked(object sender, RoutedEventArgs e)
{
if (control == null)
{
return;
}
string imagePath = DialogHelper.ShowOpenImageDialog(this.DataFolderPath);
if (string.IsNullOrEmpty(imagePath))
{
return;
}
this.UserImagePath = imagePath;
control.LoadAndDisplayImage(imagePath);
}
///<summary>
///ロードされた画像を認識する
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
if (control == null)
{
return;
}
control.RecognizeImage();
}
///<summary>
///結果をCSVにエクスポート
///</summary>
private void ExportResultsClicked(object sender, RoutedEventArgs e)
{
if (control == null)
{
return;
}
string imageName = Path.GetFileNameWithoutExtension(this.UserImagePath);
string path = DialogHelper.ShowSaveDataDialog(imageName);
if (string.IsNullOrEmpty(path))
{
return;
}
control.ExportResults(path);
MessageBox.Show("The exported resultant CSV file can be found here : " + path, "Operation Successful");
}
- 最後に、アプリケーションを実行します。
C#光学式マーク認識(OMR)ソフトウェアデモ
以下は、作成したばかりのOMRスキャナー/リーダーアプリケーションのデモンストレーションです。
OMRソフトウェアのソースコードをダウンロードする
OMRスキャナーアプリケーションの完全なソースコードは、GitHubからダウンロードできます。
無料ライセンスを取得する
無料の一時ライセンスを取得して、評価の制限なしにライブラリを試すことができます。
結論
この記事では、
- Aspose.OMR for.NETUIコントロールを.NETアプリケーションに統合します。
- C#でOMRシートリーダーアプリケーションを開発します。
さらに、ドキュメントを使用して、Aspose.OMR for.NETAPIについて詳しく知ることができます。ご不明な点がございましたら、フォーラムまでお気軽にお問い合わせください。