Software OMR Scanner využívající C#.NET

Optical Mark Recognition (OMR) je automatizovaný proces zachycování a analýzy dat označených na zvláštním typu formuláře dokumentu. Tento speciální typ dokumentu mohou lidé označit/vyplnit na formulářích průzkumů, testovacích listech a dalších papírových dokumentech. V tomto článku se naučíme, jak vyvinout aplikaci OMR Sheet Reader založenou na GUI pomocí C#. Naše řešení vezme naskenovaný obrázek listu OMR jako vstup z místního disku, poté rozpozná značky a nakonec vyexportuje označené registrační číslo a stínované odpovědi ve formátu CSV. Po provedení uvedených kroků budeme mít náš C# software pro rozpoznávání optických značek (OMR) v .NET. Tak začněme.

Článek se bude týkat následujících témat:

  1. Funkce softwaru C# pro rozpoznávání optických značek (OMR)
  2. C# OMR .NET API a ovládání uživatelského rozhraní
  3. Kroky k vývoji softwaru C# OMR
  4. Ukázka softwaru C# Optical Mark Recognition (OMR)
  5. Stáhnout zdrojový kód softwaru OMR

Vlastnosti softwaru C# Optical Mark Recognition (OMR).

Náš software pro rozpoznávání optických značek (OMR) bude mít následující funkce:

  1. Interaktivně upravujte parametry rozpoznávání a sledujte jejich účinek v reálném čase. Můžeme upravit následující:
    • Práh rozpoznání
    • Zvětšení
    • Zobrazit/skrýt bubliny
  2. Vyberte a načtěte naskenovaný obrázek v následujících formátech:
  3. Rozpoznejte optické značky na obrázku.
  4. Exportujte výsledky ve formátu CSV a uložte je na místní disk.

C# OMR .NET API a ovládání uživatelského rozhraní

Aspose.OMR for .NET API umožňuje navrhování, vytváření a rozpoznávání odpovědních archů, testů, dokumentů MCQ, kvízů, formulářů zpětné vazby, průzkumů a hlasovacích lístků. Navíc poskytuje ovládání grafického uživatelského rozhraní, které lze přidat do aplikací .NET UI. Začleníme ovládání Aspose.OMR for .NET UI do aplikace .NET UI pro vývoj aplikace OMR skeneru/čtečky. Prosím buď stáhněte DLL API, nebo ji nainstalujte pomocí NuGet.

PM> Install-Package Aspose.OMR

Kroky k vývoji softwaru C# OMR

Můžeme vyvinout aplikaci OMR skeneru/čtečky na bázi GUI podle následujících kroků:

  • Nejprve vytvořte nový projekt a vyberte šablonu projektu WPF App (.NET Framework).
  • Dále v dialogovém okně Konfigurace nového projektu zadejte Název projektu, zvolte Umístění a nastavte další parametry.
Nakonfigurujte svůj projekt aplikace WPF

Nakonfigurujte svůj projekt aplikace WPF

  • Poté otevřete NuGet Package Manager a nainstalujte balíček Aspose.OMR for .NET.
Nainstalujte Aspose.OMR pro .NET

Nainstalujte Aspose.OMR pro .NET

  • Dále do projektu přidejte nový soubor DialogHelper.cs.
Přidejte třídu DialogHelper

Přidejte DialogHelper.cs

  • Přidejte následující kód do nově vytvořeného DialogHelper.cs.
internal class DialogHelper
{
    ///<summary>
    /// Řetězec filtru pro dialogové okno, které otevírá obrázky šablony.
    ///</summary>
    private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";

    ///<summary>
    /// Řetězec filtru pro dialog, který ukládá výsledky rozpoznávání
    ///</summary>
    private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";

    ///<summary>
    /// Zobrazí dialogové okno Otevřít soubor obrázku.
    ///</summary>
    ///<returns> Cesta k vybranému souboru, popř<c> nula</c> pokud nebyl vybrán žádný soubor.</returns>
    public static string ShowOpenImageDialog(string suggestedDir = null)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
    }

    ///<summary>
    /// Zobrazí dialogové okno Uložit soubor výsledků rozpoznávání.
    ///</summary>
    ///<returns> Cesta k vybranému souboru, popř<c> nula</c> pokud nebyl vybrán žádný soubor.</returns>
    public static string ShowSaveDataDialog(string suggestedName)
    {
        SaveFileDialog dialog = new SaveFileDialog();
        return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
    }

    ///<summary>
    /// Zobrazí daný dialog a vrátí jeho výsledek jako a<c> tětiva</c> .
    ///</summary>
    ///<param name="dialog"> Dialog, který se má zobrazit.</param>
    ///<param name="filter"> Řetězec filtru typu souboru.</param>
    ///<param name="suggestedDir"> Doporučený výchozí adresář dialogu</param>
    ///<param name="suggestedName"> Navrhovaný název souboru</param>
    ///<returns> Cesta k vybranému souboru, popř<c> nula</c> pokud nebyl vybrán žádný soubor.</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;
    }
}
  • Dále aktualizujte soubor MainWindow.xaml následujícím obsahem 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>
  • Poté nahraďte následující obsah v souboru MainWindow.xaml.cs.
///<summary>
/// Šablona pro testování
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";

///<summary>
/// Cesta k souboru licence Aspose.OMR.NET.lic
///</summary>
private static readonly string LicensePath = @"";

private CorrectionControl control;

public MainWindow()
{
    InitializeComponent();

    // Nastavte a zobrazte cestu k souboru šablony
    txtTemplatePath.Text = TemplateFilePath;

    // Chcete-li otestovat úplné výsledky, nastavte licenci, zadejte cestu k licenčnímu souboru a odkomentujte
    //Licence lic = nová licence();
    //lic.SetLicense(LicensePath);
}

public string UserImagePath { get; set; }

public string DataFolderPath { get; set; }


///<summary>
/// Načte a zobrazí 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>
/// Výběr a zobrazení obrázku 
///</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>
/// Rozpoznat načtený obrázek
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
    if (control == null)
    {
        return;
    }

    control.RecognizeImage();
}

///<summary>
/// Export výsledků do 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");
}
  • Nakonec spusťte aplikaci.

Ukázka softwaru C# pro rozpoznávání optických značek (OMR).

Následuje ukázka aplikace OMR Scanner/Reader, kterou jsme právě vytvořili.

Ukázka softwaru C# OMR

Demo softwaru OMR

Stáhněte si zdrojový kód softwaru C# .NET OMR

Kompletní zdrojový kód aplikace C# OMR Scanner si můžete stáhnout z GitHub.

Získejte bezplatnou licenci

Můžete získat bezplatnou dočasnou licenci a vyzkoušet knihovnu bez omezení hodnocení.

Závěr

V tomto článku jsme se naučili, jak na to

  • integrovat ovládání Aspose.OMR for .NET UI do aplikace .NET;
  • vyvinout aplikaci pro čtení listů OMR v C#.

Kromě toho se můžete dozvědět více o Aspose.OMR for .NET API pomocí dokumentace. V případě jakýchkoliv nejasností nás neváhejte kontaktovat na našem fóru.

Viz také