OMR-skannerprogramvara som använder C#.NET

Optical Mark Recognition (OMR) är en automatiserad process för att fånga och analysera data markerade på en speciell typ av dokumentformulär. Denna speciella typ av dokument kan markeras/fyllas i av personer på undersökningsformulär, testblad och andra pappersdokument. I den här artikeln kommer vi att lära oss hur man utvecklar en GUI-baserad OMR Sheet Reader-applikation med C#. Vår lösning kommer att ta den skannade OMR-arkbilden som indata från en lokal disk, sedan känna igen märkena och slutligen exportera det markerade registreringsnumret och skuggade svaren i CSV-format. Efter att ha följt de nämnda stegen kommer vi att ha vår C# Optical Mark Recognition (OMR) programvara i .NET. Så låt oss börja.

Artikeln ska täcka följande ämnen:

  1. Funktioner i C# Optical Mark Recognition (OMR) programvara
  2. C# OMR .NET API och UI-kontroll
  3. Steg för att utveckla C# OMR-programvara
  4. C# Optical Mark Recognition (OMR) Software Demo
  5. Ladda ner OMR-programvarans källkod

Funktioner i C# Optical Mark Recognition (OMR) programvara

Vår OMR-programvara (Optical Mark Recognition) kommer att ha följande funktioner:

  1. Justera igenkänningsparametrar interaktivt och se deras effekt i realtid. Vi kan justera följande:
    • Igenkänningströskel
    • Zoom
    • Visa/dölj bubblor
  2. Välj och ladda den skannade bilden i följande format:
  3. Känn igen de optiska märkena på bilden.
  4. Exportera resultat i CSV och spara dem på din lokala disk.

C# OMR .NET API och UI-kontroll

Aspose.OMR för .NET API gör det möjligt att designa, skapa och känna igen svarsblad, tester, MCQ-uppsatser, frågesporter, feedbackformulär, enkäter och omröstningar. Dessutom tillhandahåller den en grafisk användargränssnittskontroll som kan läggas till i .NET UI-applikationer. Vi kommer att integrera Aspose.OMR för .NET UI-kontroll i .NET UI-applikationen för att utveckla en OMR-skanner/läsarapplikation. Vänligen antingen ladda ner API:ts DLL eller installera den med NuGet.

PM> Install-Package Aspose.OMR

Steg för att utveckla C# OMR-programvara

Vi kan utveckla en GUI-baserad OMR-skanner/läsarapplikation genom att följa stegen nedan:

  • Skapa först ett nytt projekt och välj projektmallen WPF App (.NET Framework).
  • Därefter anger du projektnamnet i dialogrutan Konfigurera ditt nya projekt, väljer platsen och ställer in andra parametrar.
Konfigurera ditt WPF-appprojekt

Konfigurera ditt WPF-appprojekt

  • Öppna sedan NuGet Package Manager och installera paketet Aspose.OMR för .NET.
Installera Aspose.OMR för .NET

Installera Aspose.OMR för .NET

  • Lägg sedan till en ny fil DialogHelper.cs till projektet.
Lägg till DialogHelper-klass

Lägg till DialogHelper.cs

  • Lägg till följande kod till den nyskapade DialogHelper.cs.
internal class DialogHelper
{
    ///<summary>
    /// Filtersträngen för dialogrutan som öppnar mallbilder.
    ///</summary>
    private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";

    ///<summary>
    /// Filtersträngen för dialogrutan som sparar igenkänningsresultat
    ///</summary>
    private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";

    ///<summary>
    /// Visar dialogrutan Öppna bildfil.
    ///</summary>
    ///<returns> Sökväg till vald fil, eller<c> null</c> om ingen fil har valts.</returns>
    public static string ShowOpenImageDialog(string suggestedDir = null)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
    }

    ///<summary>
    /// Visar dialogrutan för sparade igenkänningsresultat.
    ///</summary>
    ///<returns> Sökväg till vald fil, eller<c> null</c> om ingen fil har valts.</returns>
    public static string ShowSaveDataDialog(string suggestedName)
    {
        SaveFileDialog dialog = new SaveFileDialog();
        return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
    }

    ///<summary>
    /// Visar given dialog och returnerar dess resultat som en<c> sträng</c> .
    ///</summary>
    ///<param name="dialog"> Dialogrutan som ska visas.</param>
    ///<param name="filter"> Filtypsfiltersträng.</param>
    ///<param name="suggestedDir"> Föreslagen initial katalog för dialogruta</param>
    ///<param name="suggestedName"> Föreslaget filnamn</param>
    ///<returns> Sökväg till vald fil, eller<c> null</c> om ingen fil har valts.</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;
    }
}
  • Uppdatera sedan filen MainWindow.xaml med följande XAML-innehåll.
<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>
  • Efter det byter du ut följande innehåll i filen MainWindow.xaml.cs.
///<summary>
/// Mall för testning
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";

///<summary>
/// Sökväg till licensfilen Aspose.OMR.NET.lic
///</summary>
private static readonly string LicensePath = @"";

private CorrectionControl control;

public MainWindow()
{
    InitializeComponent();

    // Ställ in och visa sökväg för mallfil
    txtTemplatePath.Text = TemplateFilePath;

    // Ställ in licens, ange sökväg för licensfilen och avkommentera för att testa fullständiga resultat
    //Licens lic = new License();
    //lic.SetLicense(LicensePath);
}

public string UserImagePath { get; set; }

public string DataFolderPath { get; set; }


///<summary>
/// Laddar och visar 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älj och visa bild 
///</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>
/// Identifiera laddad bild
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
    if (control == null)
    {
        return;
    }

    control.RecognizeImage();
}

///<summary>
/// Exportera resultat till 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");
}
  • Slutligen, kör programmet.

C# Optical Mark Recognition (OMR) Software Demo

Följande är en demonstration av OMR Scanner/Reader-applikationen som vi just har skapat.

C# OMR Software Demo

OMR Software Demo

Ladda ner C# .NET OMR Software Source Code

Du kan ladda ner den fullständiga källkoden för C# OMR Scanner-applikationen från GitHub.

Skaffa en gratis licens

Du kan få en gratis tillfällig licens för att prova biblioteket utan utvärderingsbegränsningar.

Slutsats

I den här artikeln har vi lärt oss hur man gör

  • integrera Aspose.OMR för .NET UI-kontroll i .NET-applikationen;
  • utveckla OMR arkläsarapplikation i C#.

Dessutom kan du lära dig mer om Aspose.OMR för .NET API med hjälp av dokumentationen. I händelse av oklarheter, var god kontakta oss på vårt forum.

Se även