OMR Scanner Software using C#.NET

Optische Markierungserkennung (OMR) ist ein automatisierter Prozess zur Erfassung und Analyse von Daten, die auf einer speziellen Art von Dokumentenformular markiert sind. Diese spezielle Art von Dokument könnte von Menschen auf Umfrageformularen, Testblättern und anderen Papierdokumenten markiert oder ausgefüllt werden. In diesem Artikel werden wir lernen, wie man eine GUI-basierte OMR-Blattleseranwendung mit C# entwickelt. Unsere Lösung wird das gescannte OMR-Blattbild als Eingabe von einer lokalen Festplatte verwenden, dann die Markierungen erkennen und schließlich die markierte Registrierungsnummer und die schattierten Antworten im CSV Format exportieren. Nachdem wir die genannten Schritte befolgt haben, werden wir unsere C# Optische Markierungserkennung (OMR) Software in .NET haben. Also, lass uns anfangen.

Der Artikel wird die folgenden Themen behandeln:

  1. Funktionen der C# Optischen Markierungserkennung (OMR) Software
  2. C# OMR .NET API und UI-Steuerung
  3. Schritte zur Entwicklung der C# OMR Software
  4. C# Optische Markierungserkennung (OMR) Software Demo
  5. Herunterladen des OMR-Software-Quellcodes

Funktionen der C# Optischen Markierungserkennung (OMR) Software

Unsere Optische Markierungserkennung (OMR) Software wird die folgenden Funktionen bieten:

  1. Interaktive Anpassung der Erkennungsparameter und Beobachtung ihrer Auswirkungen in Echtzeit. Wir können Folgendes anpassen:
    • Erkennungsschwelle
    • Zoom
    • Blasen anzeigen/ausblenden
  2. Auswählen und Laden des gescannten Bildes in den folgenden Formaten:
  3. Erkennen der optischen Markierungen auf dem Bild.
  4. Exportieren der Ergebnisse im CSV-Format und Speichern auf Ihrer lokalen Festplatte.

C# OMR .NET API und UI-Steuerung

Aspose.OMR für .NET API ermöglicht das Entwerfen, Erstellen und Erkennen von Antwortblättern, Tests, MCQ-Papieren, Quizzen, Feedback-Formularen, Umfragen und Abstimmungen. Darüber hinaus bietet es eine grafische Benutzeroberfläche, die zu .NET UI-Anwendungen hinzugefügt werden kann. Wir werden Aspose.OMR für .NET UI-Steuerung in der .NET UI-Anwendung integrieren, um eine OMR-Scanner-/Leseranwendung zu entwickeln. Bitte laden Sie entweder die DLL der API herunter oder installieren Sie sie über NuGet.

PM> Install-Package Aspose.OMR

Schritte zur Entwicklung der C# OMR Software

Wir können eine GUI-basierte OMR-Scanner-/Leseranwendung entwickeln, indem wir die folgenden Schritte befolgen:

  • Zuerst ein neues Projekt erstellen und die WPF-App (.NET Framework) Projektvorlage auswählen.
Erstellen Sie ein neues Projekt und wählen Sie die Projektvorlage aus.

Erstellen Sie ein neues Projekt und wählen Sie die Projektvorlage aus.

  • Als Nächstes im Dialogfeld Konfigurieren Sie Ihr neues Projekt den Projektnamen eingeben, den Speicherort auswählen und andere Parameter festlegen.
Konfigurieren Sie Ihr WPF-App-Projekt

Konfigurieren Sie Ihr WPF-App-Projekt

  • Dann NuGet-Paket-Manager öffnen und das Aspose.OMR für .NET Paket installieren.
Installieren Sie Aspose.OMR für .NET

Installieren Sie Aspose.OMR für .NET

  • Als Nächstes eine neue Datei DialogHelper.cs zum Projekt hinzufügen.
DialogHelper-Klasse hinzufügen

DialogHelper.cs hinzufügen

  • Fügen Sie den folgenden Code in die neu erstellte DialogHelper.cs ein.
internal class DialogHelper
{
/// <summary>
/// The filter string for the dialog that opens template images.
/// </summary>
private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";
/// <summary>
/// The filter string for the dialog that saves recognition results
/// </summary>
private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";
/// <summary>
/// Shows Open Image file dialog.
/// </summary>
/// <returns>Path to selected file, or <c>null</c> if no file was selected.</returns>
public static string ShowOpenImageDialog(string suggestedDir = null)
{
OpenFileDialog dialog = new OpenFileDialog();
return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
}
/// <summary>
/// Shows Save Recognition Results file dialog.
/// </summary>
/// <returns>Path to selected file, or <c>null</c> if no file was selected.</returns>
public static string ShowSaveDataDialog(string suggestedName)
{
SaveFileDialog dialog = new SaveFileDialog();
return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
}
/// <summary>
/// Displays given dialog and returns its result as a <c>string</c>.
/// </summary>
/// <param name="dialog">The dialog to show.</param>
/// <param name="filter">File type filter string.</param>
/// <param name="suggestedDir">Suggested dialog initial directory</param>
/// <param name="suggestedName">Suggested file name</param>
/// <returns>Path to selected file, or <c>null</c> if no file was selected.</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;
}
}
  • Aktualisieren Sie dann die MainWindow.xaml-Datei mit dem folgenden XAML-Inhalt.
<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>
  • Ersetzen Sie anschließend den folgenden Inhalt in der MainWindow.xaml.cs-Datei.
/// <summary>
/// Template for testing
/// </summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";
/// <summary>
/// Path to the license Aspose.OMR.NET.lic file
/// </summary>
private static readonly string LicensePath = @"";
private CorrectionControl control;
public MainWindow()
{
InitializeComponent();
// Set and show template file path
txtTemplatePath.Text = TemplateFilePath;
// Set license, provide License file Path and uncomment to test full results
//License lic = new License();
//lic.SetLicense(LicensePath);
}
public string UserImagePath { get; set; }
public string DataFolderPath { get; set; }
/// <summary>
/// Loads and displays 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>
/// Select and display 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>
/// Recognize loaded image
/// </summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
if (control == null)
{
return;
}
control.RecognizeImage();
}
/// <summary>
/// Export results to 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");
}
  • Schließlich die Anwendung ausführen.

C# Optische Markierungserkennung (OMR) Software Demo

Die folgende Demonstration zeigt die OMR-Scanner-/Leseranwendung, die wir gerade erstellt haben.

C# OMR Software Demo

OMR Software Demo

Herunterladen des C# .NET OMR Software Quellcodes

Sie können den vollständigen Quellcode der C# OMR-Scanneranwendung von GitHub herunterladen.

Holen Sie sich eine kostenlose Lizenz

Sie können eine kostenlose temporäre Lizenz erhalten, um die Bibliothek ohne Evaluierungseinschränkungen auszuprobieren.

Fazit

In diesem Artikel haben wir gelernt, wie man

  • Aspose.OMR für .NET UI-Steuerung in die .NET-Anwendung integriert;
  • eine OMR-Blattleseranwendung in C# entwickelt.

Darüber hinaus können Sie mehr über die Aspose.OMR für .NET API in der Dokumentation erfahren. Bei Unklarheiten können Sie uns gerne in unserem Forum kontaktieren.

Siehe auch