ซอฟต์แวร์สแกนเนอร์ OMR โดยใช้ C#.NET

Optical Mark Recognition (OMR) เป็นกระบวนการอัตโนมัติในการจับและวิเคราะห์ข้อมูลที่ทำเครื่องหมายบนแบบฟอร์มเอกสารประเภทพิเศษ เอกสารประเภทพิเศษนี้สามารถทำเครื่องหมาย/กรอกโดยบุคคลในแบบฟอร์มการสำรวจ แผ่นทดสอบ และเอกสารกระดาษอื่นๆ ในบทความนี้ เราจะเรียนรู้วิธีพัฒนาแอปพลิเคชัน OMR Sheet Reader ที่ใช้ GUI โดยใช้ C# โซลูชันของเราจะนำอิมเมจชีต OMR ที่สแกนเป็นอินพุตจากดิสก์ในเครื่อง จากนั้นจดจำเครื่องหมายและสุดท้ายส่งออกหมายเลขการลงทะเบียนที่ทำเครื่องหมายไว้และคำตอบที่แรเงาในรูปแบบ CSV หลังจากทำตามขั้นตอนดังกล่าวแล้ว เราจะได้ซอฟต์แวร์ C# Optical Mark Recognition (OMR) ในรูปแบบ .NET มาเริ่มกันเลย

บทความจะครอบคลุมหัวข้อต่อไปนี้:

  1. คุณสมบัติของซอฟต์แวร์ C# Optical Mark Recognition (OMR)
  2. C# Optical Mark Recognition .NET API และการควบคุม UI
  3. ขั้นตอนในการพัฒนาซอฟต์แวร์ OMR
  4. การสาธิตซอฟต์แวร์ C# Optical Mark Recognition (OMR)
  5. ดาวน์โหลดซอร์สโค้ดซอฟต์แวร์ OMR

คุณลักษณะของซอฟต์แวร์ C# Optical Mark Recognition (OMR)

ซอฟต์แวร์ Optical Mark Recognition (OMR) ของเราจะมีคุณสมบัติดังต่อไปนี้:

  1. ปรับพารามิเตอร์การจดจำแบบโต้ตอบและดูผลแบบเรียลไทม์ เราสามารถปรับแต่งได้ดังนี้
    • เกณฑ์การรับรู้
    • ซูม
    • แสดง/ซ่อนฟอง
  2. เลือกและโหลดภาพที่สแกนในรูปแบบต่อไปนี้:
  3. สังเกตเครื่องหมายออปติกบนภาพ
  4. ส่งออกผลลัพธ์เป็น CSV และบันทึกลงในดิสก์ภายในเครื่องของคุณ

C# Optical Mark Recognition .NET API และการควบคุม UI

Aspose.OMR for .NET API อนุญาตให้ออกแบบ สร้าง และจดจำกระดาษคำตอบ แบบทดสอบ กระดาษ MCQ แบบทดสอบ แบบฟอร์มข้อเสนอแนะ แบบสำรวจ และบัตรลงคะแนน นอกจากนี้ยังมีการควบคุมส่วนติดต่อผู้ใช้แบบกราฟิกที่สามารถเพิ่มไปยังแอปพลิเคชัน .NET UI เราจะรวม Aspose.OMR สำหรับการควบคุม .NET UI ในแอปพลิเคชัน .NET UI สำหรับการพัฒนาแอปพลิเคชันเครื่องสแกน/เครื่องอ่าน OMR โปรด ดาวน์โหลด DLL ของ API หรือติดตั้งโดยใช้ NuGet

PM> Install-Package Aspose.OMR

ขั้นตอนในการพัฒนาซอฟต์แวร์ OMR

เราสามารถพัฒนาแอปพลิเคชันเครื่องสแกน/เครื่องอ่าน OMR แบบ GUI ได้โดยทำตามขั้นตอนด้านล่าง:

  • ขั้นแรก สร้างโครงการใหม่และเลือกเทมเพลตโครงการ WPF App (.NET Framework)
  • ถัดไป ในกล่องโต้ตอบกำหนดค่าโครงการใหม่ของคุณ ให้ป้อนชื่อโครงการ เลือกตำแหน่งที่ตั้ง และตั้งค่าพารามิเตอร์อื่นๆ
กำหนดค่าโครงการแอป 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>
    /// แสดงไดอะล็อกที่กำหนดและส่งกลับผลลัพธ์เป็น 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;

    // ตั้งค่าใบอนุญาต ระบุเส้นทางไฟล์ใบอนุญาต และไม่แสดงความคิดเห็นเพื่อทดสอบผลลัพธ์ทั้งหมด
    //ใบอนุญาต lic = ใบอนุญาตใหม่ ();
    //lic.SetLicense (เส้นทางใบอนุญาต);
}

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

ดาวน์โหลดซอร์สโค้ดซอฟต์แวร์ OMR

คุณสามารถดาวน์โหลดซอร์สโค้ดทั้งหมดของแอปพลิเคชัน OMR Scanner ได้จาก GitHub

รับใบอนุญาตฟรี

คุณสามารถ รับใบอนุญาตชั่วคราวได้ฟรี เพื่อทดลองใช้ห้องสมุดโดยไม่มีข้อจำกัดในการประเมิน

บทสรุป

ในบทความนี้ เราได้เรียนรู้วิธีการ

  • รวม Aspose.OMR สำหรับการควบคุม .NET UI ในแอปพลิเคชัน .NET
  • พัฒนาโปรแกรมอ่านแผ่นงาน OMR ด้วยภาษา C#

นอกจากนี้ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ Aspose.OMR for .NET API โดยใช้ เอกสารประกอบ ในกรณีที่มีความคลุมเครือ โปรดติดต่อเราได้ที่ ฟอรัม

ดูสิ่งนี้ด้วย