Logiciel de numérisation OMR utilisant C#.NET

La reconnaissance optique de marques (OMR) est un processus automatisé de capture et d’analyse de données marquées sur un type spécial de formulaire de document. Ce type spécial de document pourrait être marqué/rempli par des personnes sur des formulaires d’enquête, des feuilles de test et d’autres documents papier. Dans cet article, nous allons apprendre à développer une application OMR Sheet Reader basée sur une interface graphique à l’aide de C#. Notre solution prendra l’image de la feuille OMR numérisée comme entrée d’un disque local, puis reconnaîtra les marques et enfin exportera le numéro d’enregistrement marqué et les réponses ombrées au format CSV. Après avoir suivi les étapes mentionnées, nous aurons notre logiciel C# Optical Mark Recognition (OMR) dans .NET. Alors commençons.

L’article doit couvrir les sujets suivants :

  1. Caractéristiques du logiciel de reconnaissance optique de marques (OMR) C#
  2. API .NET de reconnaissance optique de marques C# et contrôle de l’interface utilisateur
  3. Étapes pour développer un logiciel OMR
  4. Démo du logiciel de reconnaissance optique de marques (OMR) C#
  5. Télécharger le code source du logiciel OMR

Fonctionnalités du logiciel de reconnaissance optique de marques (OMR) C#

Notre logiciel de reconnaissance optique de marques (OMR) aura les fonctionnalités suivantes :

  1. Ajustez de manière interactive les paramètres de reconnaissance et observez leur effet en temps réel. Nous pouvons ajuster les éléments suivants :
    • Seuil de reconnaissance
    • Zoom
    • Afficher/masquer les bulles
  2. Sélectionnez et chargez l’image numérisée dans les formats suivants :
  3. Reconnaître les marques optiques sur l’image.
  4. Exportez les résultats au format CSV et enregistrez-les sur votre disque local.

C# Reconnaissance optique de marques API .NET et contrôle de l’interface utilisateur

Aspose.OMR for .NET L’API permet de concevoir, de créer et de reconnaître des feuilles de réponses, des tests, des QCM, des questionnaires, des formulaires de commentaires, des enquêtes et des bulletins de vote. De plus, il fournit un contrôle d’interface utilisateur graphique qui peut être ajouté aux applications d’interface utilisateur .NET. Nous intégrerons Aspose.OMR pour le contrôle .NET UI dans l’application .NET UI pour développer une application de scanner/lecteur OMR. Veuillez soit télécharger la DLL de l’API ou l’installer à l’aide de NuGet.

PM> Install-Package Aspose.OMR

Étapes pour développer un logiciel OMR

Nous pouvons développer une application de scanner/lecteur OMR basée sur une interface graphique en suivant les étapes ci-dessous :

  • Tout d’abord, créez un nouveau projet et sélectionnez le modèle de projet WPF App (.NET Framework).
  • Ensuite, dans la boîte de dialogue Configurer votre nouveau projet, entrez le nom du projet, choisissez l’emplacement et définissez d’autres paramètres.
Configurez votre projet d'application WPF

Configurez votre projet d’application WPF

  • Ensuite, ouvrez le gestionnaire de packages NuGet et installez le package Aspose.OMR for .NET.
Installer Aspose.OMR for .NET

Installer Aspose.OMR for .NET

  • Ensuite, ajoutez un nouveau fichier DialogHelper.cs au projet.
Ajouter la classe DialogHelper

Ajouter DialogHelper.cs

  • Ajoutez le code suivant au DialogHelper.cs nouvellement créé.
internal class DialogHelper
{
    ///<summary>
    /// La chaîne de filtre pour la boîte de dialogue qui ouvre les images de modèle.
    ///</summary>
    private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";

    ///<summary>
    /// La chaîne de filtre pour la boîte de dialogue qui enregistre les résultats de la reconnaissance
    ///</summary>
    private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";

    ///<summary>
    /// Affiche la boîte de dialogue Ouvrir le fichier image.
    ///</summary>
    ///<returns> Chemin d'accès au fichier sélectionné, ou<c> nul</c> si aucun fichier n'a été sélectionné.</returns>
    public static string ShowOpenImageDialog(string suggestedDir = null)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
    }

    ///<summary>
    /// Affiche la boîte de dialogue Enregistrer le fichier des résultats de la reconnaissance.
    ///</summary>
    ///<returns> Chemin d'accès au fichier sélectionné, ou<c> nul</c> si aucun fichier n'a été sélectionné.</returns>
    public static string ShowSaveDataDialog(string suggestedName)
    {
        SaveFileDialog dialog = new SaveFileDialog();
        return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
    }

    ///<summary>
    /// Affiche la boîte de dialogue donnée et renvoie son résultat sous forme de<c> chaîne de caractères</c> .
    ///</summary>
    ///<param name="dialog"> La boîte de dialogue à afficher.</param>
    ///<param name="filter"> Chaîne de filtre de type de fichier.</param>
    ///<param name="suggestedDir"> Répertoire initial de la boîte de dialogue suggéré</param>
    ///<param name="suggestedName"> Nom de fichier suggéré</param>
    ///<returns> Chemin d'accès au fichier sélectionné, ou<c> nul</c> si aucun fichier n'a été sélectionné.</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;
    }
}
  • Ensuite, mettez à jour le fichier MainWindow.xaml avec le contenu XAML suivant.
<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>
  • Après cela, remplacez le contenu suivant dans le fichier MainWindow.xaml.cs.
///<summary>
/// Modèle de test
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";

///<summary>
/// Chemin d'accès au fichier de licence Aspose.OMR.NET.lic
///</summary>
private static readonly string LicensePath = @"";

private CorrectionControl control;

public MainWindow()
{
    InitializeComponent();

    // Définir et afficher le chemin du fichier de modèle
    txtTemplatePath.Text = TemplateFilePath;

    // Définir la licence, fournir le chemin du fichier de licence et décommenter pour tester les résultats complets
    //Licence lic = nouvelle licence();
    //lic.SetLicense(LicensePath);
}

public string UserImagePath { get; set; }

public string DataFolderPath { get; set; }


///<summary>
/// Charge et affiche 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>
/// Sélectionner et afficher l'image 
///</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>
/// Reconnaître l'image chargée
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
    if (control == null)
    {
        return;
    }

    control.RecognizeImage();
}

///<summary>
/// Exporter les résultats au format 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");
}
  • Enfin, exécutez l’application.

Démo du logiciel de reconnaissance optique de marques (OMR) C#

Voici la démonstration de l’application OMR Scanner/Reader que nous venons de créer.

Démo du logiciel C# OMR

Démo du logiciel OMR

Télécharger le code source du logiciel OMR

Vous pouvez télécharger le code source complet de l’application OMR Scanner depuis GitHub.

Obtenez une licence gratuite

Vous pouvez obtenir une licence temporaire gratuite pour essayer la bibliothèque sans limitation d’évaluation.

Conclusion

Dans cet article, nous avons appris à

  • intégrer Aspose.OMR pour le contrôle de l’interface utilisateur .NET dans l’application .NET ;
  • développer une application de lecteur de feuille OMR en C#.

En outre, vous pouvez en savoir plus sur Aspose.OMR for .NET en utilisant la documentation. En cas d’ambiguïté, n’hésitez pas à nous contacter sur notre forum.

Voir également