Программное обеспечение сканера OMR с использованием C#.NET

Оптическое распознавание меток (OMR) — это автоматизированный процесс сбора и анализа данных, отмеченных на форме документа особого типа. Этот особый тип документа может быть помечен/заполнен людьми в анкетах, контрольных листах и других бумажных документах. В этой статье мы узнаем, как разработать приложение для чтения листов OMR на основе графического интерфейса с использованием C#. Наше решение будет принимать отсканированное изображение листа OMR в качестве входных данных с локального диска, затем распознавать метки и, наконец, экспортировать отмеченный регистрационный номер и заштрихованные ответы в формате CSV. После выполнения упомянутых шагов у нас будет программное обеспечение C# для распознавания оптических меток (OMR) в .NET. Итак, начнем.

Статья должна охватывать следующие темы:

  1. Возможности программного обеспечения C# для распознавания оптических меток (OMR)
  2. C# Optical Mark Recognition .NET API и управление пользовательским интерфейсом
  3. Этапы разработки программного обеспечения OMR
  4. Демонстрация программного обеспечения для распознавания оптических меток C# (OMR)
  5. Загрузить исходный код программного обеспечения OMR

Функции программного обеспечения C# для оптического распознавания меток (OMR)

Наше программное обеспечение для распознавания оптических меток (OMR) будет иметь следующие функции:

  1. Интерактивно настраивайте параметры распознавания и наблюдайте за их эффектом в режиме реального времени. Мы можем настроить следующее:
    • Порог распознавания
    • Увеличить
    • Показать/скрыть пузыри
  2. Выберите и загрузите отсканированное изображение в следующих форматах:
  3. Распознайте оптические метки на изображении.
  4. Экспортируйте результаты в CSV и сохраняйте их на локальный диск.

C# Оптическое распознавание меток .NET API и управление пользовательским интерфейсом

Aspose.OMR для .NET API позволяет проектировать, создавать и распознавать листы ответов, тесты, документы MCQ, викторины, формы обратной связи, опросы и бюллетени. Кроме того, он предоставляет элемент управления графическим пользовательским интерфейсом, который можно добавить в приложения пользовательского интерфейса .NET. Мы интегрируем Aspose.OMR для управления пользовательским интерфейсом .NET в приложение пользовательского интерфейса .NET для разработки приложения сканера/считывателя OMR. Пожалуйста, загрузите DLL API или установите его с помощью NuGet.

PM> Install-Package Aspose.OMR

Этапы разработки программного обеспечения OMR

Мы можем разработать приложение сканера/читателя OMR на основе графического интерфейса, выполнив следующие шаги:

  • Сначала создайте новый проект и выберите шаблон проекта приложения WPF (.NET Framework).
Create a new project and select the project template.

Create a new project and select the project template.

  • Затем в диалоговом окне «Настройка нового проекта» введите имя проекта, выберите «Расположение» и установите другие параметры.
Настройте свой проект приложения WPF

Настройте свой проект приложения WPF

  • Затем откройте диспетчер пакетов NuGet и установите пакет Aspose.OMR для .NET.
Установите Aspose.OMR для .NET

Установите Aspose.OMR для .NET

  • Затем добавьте в проект новый файл DialogHelper.cs.
Добавьте класс DialogHelper

Добавить DialogHelper.cs

  • Добавьте следующий код во вновь созданный файл DialogHelper.cs.
internal class DialogHelper
{
    ///<summary>
    /// Строка фильтра для диалога, который открывает изображения шаблонов.
    ///</summary>
    private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";

    ///<summary>
    /// Строка фильтра для диалога сохранения результатов распознавания
    ///</summary>
    private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";

    ///<summary>
    /// Отображает диалоговое окно «Открыть файл изображения».
    ///</summary>
    ///<returns> Путь к выбранному файлу или<c> нулевой</c> если файл не выбран.</returns>
    public static string ShowOpenImageDialog(string suggestedDir = null)
    {
        OpenFileDialog dialog = new OpenFileDialog();
        return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
    }

    ///<summary>
    /// Отображает диалоговое окно сохранения файла результатов распознавания.
    ///</summary>
    ///<returns> Путь к выбранному файлу или<c> нулевой</c> если файл не выбран.</returns>
    public static string ShowSaveDataDialog(string suggestedName)
    {
        SaveFileDialog dialog = new SaveFileDialog();
        return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
    }

    ///<summary>
    /// Отображает данный диалог и возвращает его результат в виде<c> нить</c> .
    ///</summary>
    ///<param name="dialog"> Диалог для отображения.</param>
    ///<param name="filter"> Строка фильтра типа файла.</param>
    ///<param name="suggestedDir"> Предлагаемый исходный каталог диалога</param>
    ///<param name="suggestedName"> Предлагаемое имя файла</param>
    ///<returns> Путь к выбранному файлу или<c> нулевой</c> если файл не выбран.</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;
    }
}
  • Затем обновите файл MainWindow.xaml со следующим содержимым 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>
  • После этого замените следующее содержимое в файле MainWindow.xaml.cs.
///<summary>
/// Шаблон для тестирования
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";

///<summary>
/// Путь к файлу лицензии Aspose.OMR.NET.lic
///</summary>
private static readonly string LicensePath = @"";

private CorrectionControl control;

public MainWindow()
{
    InitializeComponent();

    // Установить и показать путь к файлу шаблона
    txtTemplatePath.Text = TemplateFilePath;

    // Установите лицензию, укажите путь к файлу лицензии и раскомментируйте, чтобы проверить полные результаты.
    //Лицензия = новая лицензия();
    //lic.SetLicense(LicensePath);
}

public string UserImagePath { get; set; }

public string DataFolderPath { get; set; }


///<summary>
/// Загружает и отображает 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>
/// Выберите и отобразите изображение 
///</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>
/// Распознать загруженное изображение
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
    if (control == null)
    {
        return;
    }

    control.RecognizeImage();
}

///<summary>
/// Экспорт результатов в 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");
}
  • Наконец, запустите приложение.

Демонстрация программного обеспечения C# для распознавания оптических меток (OMR)

Ниже представлена демонстрация приложения OMR Scanner/Reader, которое мы только что создали.

Демонстрация программного обеспечения C# OMR

Демонстрация программного обеспечения OMR

Скачать исходный код программного обеспечения OMR

Вы можете загрузить полный исходный код приложения OMR Scanner с GitHub.

Получить бесплатную лицензию

Вы можете получить бесплатную временную лицензию, чтобы попробовать библиотеку без ограничений пробной версии.

Вывод

В этой статье мы узнали, как

  • интегрировать Aspose.OMR для управления пользовательским интерфейсом .NET в приложение .NET;
  • разработать приложение для чтения листов OMR на C#.

Кроме того, вы можете узнать больше об Aspose.OMR для .NET API, используя документацию. В случае возникновения каких-либо неясностей, пожалуйста, свяжитесь с нами на нашем форуме.

Смотрите также