Software scanner OMR che utilizza C#.NET

Optical Mark Recognition (OMR) è un processo automatizzato di acquisizione e analisi dei dati contrassegnati su un tipo speciale di modulo di documento. Questo tipo speciale di documento può essere contrassegnato/compilato da persone su moduli di indagine, fogli di prova e altri documenti cartacei. In questo articolo impareremo come sviluppare un’applicazione per la lettura di fogli OMR basata su GUI utilizzando C#. La nostra soluzione prenderà l’immagine del foglio OMR scansionato come input da un disco locale, quindi riconoscerà i segni e infine esporterà il numero di registrazione contrassegnato e le risposte ombreggiate in formato CSV. Dopo aver seguito i passaggi menzionati, avremo il nostro software C# Optical Mark Recognition (OMR) in .NET. Quindi iniziamo.

L’articolo tratterà i seguenti argomenti:

  1. Caratteristiche del software C# Optical Mark Recognition (OMR)
  2. Riconoscimento ottico del segno C# API .NET e controllo dell’interfaccia utente
  3. Passaggi per lo sviluppo del software OMR
  4. Dimostrazione del software per il riconoscimento ottico del segno C# (OMR)
  5. Scarica il codice sorgente del software OMR

Caratteristiche del software C# Optical Mark Recognition (OMR).

Il nostro software OMR (Optical Mark Recognition) avrà le seguenti caratteristiche:

  1. Regola interattivamente i parametri di riconoscimento e osserva il loro effetto in tempo reale. Possiamo regolare quanto segue:
    • Soglia di riconoscimento
    • Ingrandisci
    • Mostra/nascondi bolle
  2. Selezionare e caricare l’immagine acquisita nei seguenti formati:
  3. Riconoscere i segni ottici sull’immagine.
  4. Esporta i risultati in CSV e salvali sul tuo disco locale.

Riconoscimento ottico del segno C# API .NET e controllo dell’interfaccia utente

L’API Aspose.OMR for .NET consente di progettare, creare e riconoscere fogli di risposta, test, documenti MCQ, quiz, moduli di feedback, sondaggi e schede elettorali. Inoltre, fornisce un controllo dell’interfaccia utente grafica che può essere aggiunto alle applicazioni dell’interfaccia utente .NET. Integreremo Aspose.OMR per il controllo dell’interfaccia utente .NET nell’applicazione dell’interfaccia utente .NET per lo sviluppo di un’applicazione scanner/lettore OMR. Si prega di scaricare la DLL dell’API o installarla utilizzando NuGet.

PM> Install-Package Aspose.OMR

Passaggi per lo sviluppo del software OMR

Possiamo sviluppare un’applicazione scanner/lettore OMR basata su GUI seguendo i passaggi indicati di seguito:

  • Innanzitutto, crea un nuovo progetto e seleziona il modello di progetto dell’app WPF (.NET Framework).
  • Successivamente, nella finestra di dialogo Configura il tuo nuovo progetto, inserisci il nome del progetto, scegli la posizione e imposta altri parametri.
Configura il tuo progetto di app WPF

Configura il tuo progetto di app WPF

  • Quindi, apri NuGet Package Manager e installa Aspose.OMR per il pacchetto .NET.
Installa Aspose.OMR per .NET

Installa Aspose.OMR per .NET

  • Quindi, aggiungi un nuovo file DialogHelper.cs al progetto.
Aggiungi la classe DialogHelper

Aggiungi DialogHelper.cs

  • Aggiungere il codice seguente all’oggetto DialogHelper.cs appena creato.
internal class DialogHelper
{
    ///<summary>
    /// La stringa del filtro per la finestra di dialogo che apre le immagini del modello.
    ///</summary>
    private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";

    ///<summary>
    /// La stringa del filtro per la finestra di dialogo che salva i risultati del riconoscimento
    ///</summary>
    private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";

    ///<summary>
    /// Mostra la finestra di dialogo Apri file immagine.
    ///</summary>
    ///<returns> Percorso del file selezionato, o<c> nullo</c> se non è stato selezionato alcun file.</returns>
    public static string ShowOpenImageDialog(string suggestedDir = null)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
    }

    ///<summary>
    /// Mostra la finestra di dialogo Salva file risultati riconoscimento.
    ///</summary>
    ///<returns> Percorso del file selezionato, o<c> nullo</c> se non è stato selezionato alcun file.</returns>
    public static string ShowSaveDataDialog(string suggestedName)
    {
        SaveFileDialog dialog = new SaveFileDialog();
        return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
    }

    ///<summary>
    /// Visualizza la finestra di dialogo data e restituisce il risultato come a<c> corda</c> .
    ///</summary>
    ///<param name="dialog"> La finestra di dialogo da mostrare.</param>
    ///<param name="filter"> Stringa di filtro del tipo di file.</param>
    ///<param name="suggestedDir"> Directory iniziale della finestra di dialogo suggerita</param>
    ///<param name="suggestedName"> Nome file suggerito</param>
    ///<returns> Percorso del file selezionato, o<c> nullo</c> se non è stato selezionato alcun file.</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;
    }
}
  • Quindi, aggiorna il file MainWindow.xaml con il seguente contenuto 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>
  • Successivamente, sostituisci il contenuto seguente nel file MainWindow.xaml.cs.
///<summary>
/// Modello per il test
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";

///<summary>
/// Percorso del file di licenza Aspose.OMR.NET.lic
///</summary>
private static readonly string LicensePath = @"";

private CorrectionControl control;

public MainWindow()
{
    InitializeComponent();

    // Imposta e mostra il percorso del file modello
    txtTemplatePath.Text = TemplateFilePath;

    // Impostare la licenza, fornire il percorso del file di licenza e rimuovere il commento per testare i risultati completi
    //Licenza lic = nuova Licenza();
    //lic.SetLicense(LicensePath);
}

public string UserImagePath { get; set; }

public string DataFolderPath { get; set; }


///<summary>
/// Carica e visualizza 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>
/// Seleziona e visualizza l'immagine 
///</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>
/// Riconosci l'immagine caricata
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
    if (control == null)
    {
        return;
    }

    control.RecognizeImage();
}

///<summary>
/// Esporta i risultati in 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");
}
  • Infine, esegui l’applicazione.

Demo del software C# Optical Mark Recognition (OMR).

Quella che segue è la dimostrazione dell’applicazione Scanner/Reader OMR che abbiamo appena creato.

Demo del software C# OMR

Demo del software OMR

Scarica il codice sorgente del software OMR

È possibile scaricare il codice sorgente completo dell’applicazione OMR Scanner da GitHub.

Ottieni una licenza gratuita

Puoi ottenere una licenza temporanea gratuita per provare la libreria senza limitazioni di valutazione.

Conclusione

In questo articolo abbiamo imparato a farlo

  • integrare Aspose.OMR per il controllo dell’interfaccia utente .NET nell’applicazione .NET;
  • sviluppare un’applicazione per la lettura di fogli OMR in C#.

Inoltre, puoi saperne di più su Aspose.OMR per .NET API usando la documentazione. In caso di ambiguità, non esitare a contattarci sul nostro forum.

Guarda anche