C#.NETを使用したOMRスキャナーソフトウェア

光学式マーク認識(OMR)は、特殊なタイプのドキュメントフォームにマークされたデータをキャプチャして分析する自動化されたプロセスです。この特別なタイプの文書は、調査フォーム、テストシート、およびその他の紙の文書で人々によってマーク/記入される可能性があります。この記事では、C#を使用してGUIベースのOMRシートリーダーアプリケーションを開発する方法を学習します。私たちのソリューションは、スキャンしたOMRシート画像をローカルディスクからの入力として受け取り、マークを認識し、最後にマークされた登録番号と影付きの回答をCSV形式でエクスポートします。上記の手順を実行すると、.NETにC#光学式マーク認識(OMR)ソフトウェアがインストールされます。それでは始めましょう。

この記事は、次のトピックをカバーするものとします。

  1. C#光学式マーク認識(OMR)ソフトウェアの機能
  2. C#光学式マーク認識.NET APIおよびUIコントロール
  3. OMRソフトウェアを開発する手順
  4. C#光学式マーク認識(OMR)ソフトウェアデモ
  5. OMRソフトウェアのソースコードをダウンロード

C#光学式マーク認識(OMR)ソフトウェアの機能

当社の光学式マーク認識(OMR)ソフトウェアには、次の機能があります。

  1. 認識パラメータをインタラクティブに調整し、その効果をリアルタイムで監視します。以下を調整できます。
    • 認識しきい値
    • ズーム
    • バブルを表示/非表示
  2. スキャンした画像を次の形式で選択してロードします。
  3. 画像上の光学マークを認識します。
  4. 結果を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)プロジェクトテンプレートを選択します。
  • 次に、[新しいプロジェクトの構成]ダイアログで、プロジェクト名を入力し、場所を選択して、他のパラメーターを設定します。
WPFアプリプロジェクトを構成する

WPFアプリプロジェクトを構成する

  • 次に、NuGetパッケージマネージャーを開き、Aspose.OMRfor.NETパッケージをインストールします。
Aspose.OMRfor.NETをインストールします

Aspose.OMRfor.NETをインストールします

  • 次に、新しいファイルDialogHelper.csをプロジェクトに追加します。
DialogHelperクラスを追加します

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スキャナー/リーダーアプリケーションのデモンストレーションです。

C#OMRソフトウェアデモ

OMRソフトウェアデモ

OMRソフトウェアのソースコードをダウンロードする

OMRスキャナーアプリケーションの完全なソースコードは、GitHubからダウンロードできます。

無料ライセンスを取得する

無料の一時ライセンスを取得して、評価の制限なしにライブラリを試すことができます。

結論

この記事では、

  • Aspose.OMR for.NETUIコントロールを.NETアプリケーションに統合します。
  • C#でOMRシートリーダーアプリケーションを開発します。

さらに、ドキュメントを使用して、Aspose.OMR for.NETAPIについて詳しく知ることができます。ご不明な点がございましたら、フォーラムまでお気軽にお問い合わせください。

関連項目