Oprogramowanie skanera OMR przy użyciu języka C#.NET

Optical Mark Recognition (OMR) to zautomatyzowany proces przechwytywania i analizowania danych oznaczonych na specjalnym formularzu dokumentu. Ten specjalny rodzaj dokumentu może być oznaczany/wypełniany przez ludzi na formularzach ankiet, arkuszach testowych i innych dokumentach papierowych. W tym artykule dowiemy się, jak opracować aplikację OMR Sheet Reader opartą na graficznym interfejsie użytkownika przy użyciu języka C#. Nasze rozwiązanie pobierze zeskanowany obraz arkusza OMR jako dane wejściowe z dysku lokalnego, następnie rozpozna znaki i ostatecznie wyeksportuje oznaczony numer rejestracyjny i zacienione odpowiedzi w formacie CSV. Po wykonaniu wspomnianych kroków będziemy mieć nasze oprogramowanie C# Optical Mark Recognition (OMR) w .NET. Więc zacznijmy.

Artykuł obejmie następujące tematy:

  1. Funkcje oprogramowania C# do optycznego rozpoznawania znaków (OMR)
  2. C# Optical Mark Recognition .NET API and UI Control
  3. Kroki tworzenia oprogramowania OMR
  4. Demonstracja oprogramowania C# do optycznego rozpoznawania znaków (OMR)
  5. Pobierz kod źródłowy oprogramowania OMR

Funkcje oprogramowania C# do optycznego rozpoznawania znaków (OMR).

Nasze oprogramowanie do optycznego rozpoznawania znaków (OMR) będzie miało następujące funkcje:

  1. Interaktywnie dostosuj parametry rozpoznawania i obserwuj ich efekt w czasie rzeczywistym. Możemy dostosować następujące elementy:
    • Próg rozpoznawania
    • Powiększenie
    • Pokaż/ukryj bąbelki
  2. Wybierz i załaduj zeskanowany obraz w następujących formatach:
  3. Rozpoznaj znaki optyczne na obrazie.
  4. Eksportuj wyniki w formacie CSV i zapisuj je na dysku lokalnym.

C# Optical Mark Recognition API .NET i kontrola interfejsu użytkownika

Aspose.OMR for .NET API umożliwia projektowanie, tworzenie i rozpoznawanie arkuszy odpowiedzi, testów, arkuszy MCQ, quizów, formularzy zwrotnych, ankiet i kart do głosowania. Ponadto zapewnia kontrolę graficznego interfejsu użytkownika, którą można dodać do aplikacji .NET UI. Zintegrujemy Aspose.OMR dla kontroli .NET UI w aplikacji .NET UI w celu opracowania aplikacji skanera/czytnika OMR. Pobierz bibliotekę DLL interfejsu API lub zainstaluj ją za pomocą NuGet.

PM> Install-Package Aspose.OMR

Kroki tworzenia oprogramowania OMR

Możemy opracować aplikację skanera/czytnika OMR opartą na GUI, wykonując następujące czynności:

  • Najpierw utwórz nowy projekt i wybierz szablon projektu aplikacji WPF (.NET Framework).
  • Następnie w oknie dialogowym Skonfiguruj nowy projekt wprowadź nazwę projektu, wybierz lokalizację i ustaw inne parametry.
Skonfiguruj projekt aplikacji WPF

Skonfiguruj projekt aplikacji WPF

  • Następnie otwórz Menedżera pakietów NuGet i zainstaluj pakiet Aspose.OMR dla pakietu .NET.
Zainstaluj Aspose.OMR for .NET

Zainstaluj Aspose.OMR for .NET

  • Następnie Dodaj nowy plik DialogHelper.cs do projektu.
Dodaj klasę DialogHelper

Dodaj DialogHelper.cs

  • Dodaj następujący kod do nowo utworzonego pliku DialogHelper.cs.
internal class DialogHelper
{
    ///<summary>
    /// Ciąg filtru dla okna dialogowego otwierającego obrazy szablonów.
    ///</summary>
    private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";

    ///<summary>
    /// Ciąg filtru dla okna dialogowego, w którym zapisywane są wyniki rozpoznawania
    ///</summary>
    private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";

    ///<summary>
    /// Pokazuje okno dialogowe Otwórz plik obrazu.
    ///</summary>
    ///<returns> Ścieżka do wybranego pliku lub<c> zero</c> jeśli nie wybrano żadnego pliku.</returns>
    public static string ShowOpenImageDialog(string suggestedDir = null)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
    }

    ///<summary>
    /// Pokazuje okno dialogowe Zapisz plik wyników rozpoznawania.
    ///</summary>
    ///<returns> Ścieżka do wybranego pliku lub<c> zero</c> jeśli nie wybrano żadnego pliku.</returns>
    public static string ShowSaveDataDialog(string suggestedName)
    {
        SaveFileDialog dialog = new SaveFileDialog();
        return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
    }

    ///<summary>
    /// Wyświetla podane okno dialogowe i zwraca jego wynik jako a<c> strunowy</c> .
    ///</summary>
    ///<param name="dialog"> Okno dialogowe do pokazania.</param>
    ///<param name="filter"> Ciąg filtra typu pliku.</param>
    ///<param name="suggestedDir"> Sugerowany katalog początkowy okna dialogowego</param>
    ///<param name="suggestedName"> Sugerowana nazwa pliku</param>
    ///<returns> Ścieżka do wybranego pliku lub<c> zero</c> jeśli nie wybrano żadnego pliku.</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;
    }
}
  • Następnie zaktualizuj plik MainWindow.xaml o następującą zawartość 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>
  • Następnie zastąp następującą zawartość w pliku MainWindow.xaml.cs.
///<summary>
/// Szablon do testowania
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";

///<summary>
/// Ścieżka do pliku licencji Aspose.OMR.NET.lic
///</summary>
private static readonly string LicensePath = @"";

private CorrectionControl control;

public MainWindow()
{
    InitializeComponent();

    // Ustaw i pokaż ścieżkę pliku szablonu
    txtTemplatePath.Text = TemplateFilePath;

    // Ustaw licencję, podaj ścieżkę pliku licencji i usuń komentarz, aby przetestować pełne wyniki
    //licencja licencyjna = nowa licencja();
    //lic.SetLicense(LicensePath);
}

public string UserImagePath { get; set; }

public string DataFolderPath { get; set; }


///<summary>
/// Ładuje i wyświetla 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>
/// Wybierz i wyświetl obraz 
///</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>
/// Rozpoznaj załadowany obraz
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
    if (control == null)
    {
        return;
    }

    control.RecognizeImage();
}

///<summary>
/// Eksportuj wyniki do pliku 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");
}
  • Na koniec uruchom aplikację.

Wersja demonstracyjna oprogramowania C# do optycznego rozpoznawania znaków (OMR).

Poniżej znajduje się demonstracja aplikacji OMR Scanner/Reader, którą właśnie stworzyliśmy.

Demo oprogramowania C# OMR

Demo oprogramowania OMR

Pobierz kod źródłowy oprogramowania OMR

Możesz pobrać pełny kod źródłowy aplikacji OMR Scanner z GitHub.

Uzyskaj bezpłatną licencję

Możesz uzyskać bezpłatną tymczasową licencję, aby wypróbować bibliotekę bez ograniczeń ewaluacyjnych.

Wniosek

W tym artykule dowiedzieliśmy się, jak to zrobić

  • zintegrować Aspose.OMR dla kontroli .NET UI w aplikacji .NET;
  • rozwijać aplikację czytnika arkuszy OMR w języku C#.

Poza tym możesz dowiedzieć się więcej o Aspose.OMR for .NET API korzystając z dokumentacji. W przypadku jakichkolwiek niejasności prosimy o kontakt na naszym forum.

Zobacz też