برنامج OMR Scanner باستخدام C# .NET

التعرف الضوئي على العلامة (OMR) هو عملية آلية لالتقاط وتحليل البيانات المميزة بنوع خاص من نموذج المستند. يمكن تمييز / تعبئة هذا النوع الخاص من المستندات من قبل الأشخاص في نماذج المسح وأوراق الاختبار والمستندات الورقية الأخرى. في هذه المقالة ، سوف نتعلم كيفية تطوير تطبيق OMR Sheet Reader المستند إلى واجهة المستخدم الرسومية باستخدام C#. سيأخذ حلنا صورة ورقة OMR الممسوحة ضوئيًا كمدخلات من قرص محلي ، ثم يتعرف على العلامات ويصدر أخيرًا رقم التسجيل المحدد والإجابات المظللة بتنسيق CSV. بعد اتباع الخطوات المذكورة ، سيكون لدينا برنامج C# للتعرف الضوئي على العلامة (OMR) في .NET. فلنبدأ.

يجب أن تغطي المقالة المواضيع التالية:

  1. ميزات برنامج التعرف الضوئي على العلامة C# (OMR)
  2. C# Optical Mark Recognition .NET API and UI Control
  3. خطوات تطوير برنامج OMR
  4. عرض توضيحي لبرنامج التعرف الضوئي على العلامة C# (OMR)
  5. تنزيل رمز مصدر برنامج OMR

ميزات برنامج التعرف الضوئي على العلامة C# (OMR)

سيحتوي برنامج التعرف الضوئي على العلامة (OMR) الخاص بنا على الميزات التالية:

  1. اضبط بشكل تفاعلي معلمات التعرف وراقب تأثيرها في الوقت الفعلي. يمكننا تعديل ما يلي:
    • عتبة الاعتراف
    • تكبير
    • إظهار / إخفاء الفقاعات
  2. حدد الصورة الممسوحة ضوئيًا وقم بتحميلها بالتنسيقات التالية:
  3. يتعرف على العلامات الضوئية على الصورة.
  4. تصدير النتائج في CSV وحفظها على القرص المحلي الخاص بك.

التعرف الضوئي على العلامة C#. NET API والتحكم في واجهة المستخدم

Aspose.OMR for .NET تسمح API بتصميم وإنشاء والتعرف على أوراق الإجابة والاختبارات وأوراق MCQ والاختبارات ونماذج التغذية الراجعة والاستطلاعات وأوراق الاقتراع. علاوة على ذلك ، فإنه يوفر تحكم واجهة المستخدم الرسومية التي يمكن إضافتها إلى تطبيقات .NET UI. سنقوم بدمج Aspose.OMR للتحكم في واجهة المستخدم .NET UI في تطبيق .NET UI لتطوير تطبيق ماسح ضوئي / قارئ OMR. يرجى إما تنزيل DLL الخاصة بواجهة برمجة التطبيقات أو تثبيته باستخدام NuGet.

PM> Install-Package Aspose.OMR

خطوات تطوير برامج القراءة الضوئية

يمكننا تطوير تطبيق ماسح ضوئي / قارئ قائم على واجهة المستخدم الرسومية باتباع الخطوات الواردة أدناه:

  • أولاً ، قم بإنشاء مشروع جديد وحدد قالب مشروع تطبيق WPF (.NET Framework).
Create a new project and select the project template.
  • بعد ذلك ، في مربع حوار تكوين مشروعك الجديد ، أدخل اسم المشروع ، واختر الموقع ، وقم بتعيين المعلمات الأخرى.
قم بتكوين مشروع تطبيق WPF الخاص بك

قم بتكوين مشروع تطبيق WPF الخاص بك

  • ثم افتح NuGet Package Manager وقم بتثبيت Aspose.OMR لحزمة .NET.
قم بتثبيت Aspose.OMR for .NET

قم بتثبيت Aspose.OMR for .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 Scanner من GitHub.

احصل على رخصة مجانية

يمكنك الحصول على ترخيص مؤقت مجاني لتجربة المكتبة دون قيود التقييم.

استنتاج

في هذه المقالة ، تعلمنا كيف

  • دمج Aspose.OMR لتحكم .NET UI في تطبيق .NET ؛
  • قم بتطوير تطبيق قارئ ورقة OMR في C#.

علاوة على ذلك ، يمكنك معرفة المزيد حول Aspose.OMR for .NET API باستخدام التوثيق. في حالة وجود أي غموض ، لا تتردد في الاتصال بنا على المنتدى.

أنظر أيضا