תוכנת סורק OMR באמצעות C#.NET

זיהוי סימנים אופטי (OMR) הוא תהליך אוטומטי של לכידה וניתוח נתונים המסומנים על סוג מיוחד של טופס מסמך. סוג מיוחד זה של מסמך יכול להיות מסומן/למלא על ידי אנשים בטפסי סקרים, דפי בדיקה ומסמכי נייר אחרים. במאמר זה נלמד כיצד לפתח יישום OMR Sheet Reader מבוסס GUI באמצעות C#. הפתרון שלנו ייקח את תמונת גיליון OMR הסרוקה כקלט מדיסק מקומי, ואז יזהה את הסימנים ולבסוף ייצא את מספר הרישום המסומן והתשובות המוצללות בפורמט CSV. לאחר ביצוע השלבים שהוזכרו, תהיה לנו תוכנת C# Optical Mark Recognition (OMR) שלנו ב-.NET. אז בואו נתחיל.

המאמר יעסוק בנושאים הבאים:

  1. תכונות של תוכנת C# Optical Mark Recognition (OMR)
  2. [C# OMR .NET API ובקרת ממשק משתמש3
  3. שלבים לפיתוח תוכנת C# OMR
  4. הדגמת תוכנה של C# Optical Mark Recognition (OMR)
  5. הורד את קוד המקור של תוכנת OMR

תכונות של תוכנת C# Optical Mark Recognition (OMR).

התוכנה שלנו לזיהוי סימנים אופטי (OMR) תכלול את התכונות הבאות:

  1. התאם באופן אינטראקטיבי פרמטרים של זיהוי וצפה בהשפעתם בזמן אמת. אנחנו יכולים להתאים את הדברים הבאים:
    • סף זיהוי
    • תקריב
    • הצג/הסתיר בועות
  2. בחר וטען את התמונה הסרוקה בפורמטים הבאים:
  3. מזהה את הסימנים האופטיים בתמונה.
  4. ייצא תוצאות ב-CSV ושמור אותן בדיסק המקומי שלך.

C# OMR .NET API ובקרת ממשק משתמש

Aspose.OMR for .NET API מאפשר עיצוב, יצירה וזיהוי דפי תשובות, מבחנים, מאמרי MCQ, חידונים, טפסי משוב, סקרים וקלפיות. יתר על כן, הוא מספק בקרת ממשק משתמש גרפית שניתן להוסיף ליישומי .NET UI. אנו נשלב את Aspose.OMR עבור .NET UI control באפליקציית .NET UI לפיתוח אפליקציית סורק/קורא OMR. אנא הורד את ה-DLL של ה-API או התקן אותו באמצעות NuGet.

PM> Install-Package Aspose.OMR

שלבים לפיתוח תוכנת C# OMR

אנו יכולים לפתח יישום סורק/קורא OMR מבוסס GUI על ידי ביצוע השלבים המפורטים להלן:

  • ראשית, צור פרויקט חדש ובחר בתבנית פרויקט WPF App (.NET Framework).
  • לאחר מכן, בתיבת הדו-שיח הגדר את הפרויקט החדש שלך, הזן את שם הפרויקט, בחר את המיקום והגדר פרמטרים אחרים.
הגדר את פרויקט האפליקציה של WPF שלך

הגדר את פרויקט האפליקציה של WPF שלך

  • לאחר מכן, פתח את NuGet Package Manager והתקן את חבילת Aspose.OMR for .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>
    /// מציג דו-שיח נתון ומחזיר את התוצאה שלו כ-a<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;

    // הגדר רישיון, ספק נתיב לקובץ רישיון ובטל הערות כדי לבדוק את התוצאות המלאות
    //License lic = new License();
    //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# Optical Mark Recognition (OMR) הדגמת תוכנה

להלן ההדגמה של אפליקציית OMR Scanner/Reader שיצרנו זה עתה.

הדגמת תוכנת C# OMR

הדגמת תוכנת OMR

הורד את קוד מקור התוכנה C# .NET OMR

אתה יכול להוריד את קוד המקור המלא של אפליקציית C# OMR Scanner מ-GitHub.

קבל רישיון חינם

אתה יכול לקבל רישיון זמני בחינם כדי לנסות את הספרייה ללא מגבלות הערכה.

סיכום

במאמר זה למדנו כיצד לעשות זאת

  • שלב Aspose.OMR עבור בקרת ממשק משתמש NET ביישום NET.
  • לפתח יישום קורא גיליונות OMR ב-C#.

חוץ מזה, אתה יכול ללמוד עוד על Aspose.OMR עבור .NET API באמצעות תיעוד. בכל מקרה של אי בהירות, אנא אל תהסס לפנות אלינו בפורום שלנו.

ראה גם