Optical Mark Recognition (OMR) เป็นกระบวนการอัตโนมัติในการจับและวิเคราะห์ข้อมูลที่ทำเครื่องหมายบนแบบฟอร์มเอกสารประเภทพิเศษ เอกสารประเภทพิเศษนี้สามารถทำเครื่องหมาย/กรอกโดยบุคคลในแบบฟอร์มการสำรวจ แผ่นทดสอบ และเอกสารกระดาษอื่นๆ ในบทความนี้ เราจะเรียนรู้วิธีพัฒนาแอปพลิเคชัน OMR Sheet Reader ที่ใช้ GUI โดยใช้ C# โซลูชันของเราจะนำอิมเมจชีต OMR ที่สแกนเป็นอินพุตจากดิสก์ในเครื่อง จากนั้นจดจำเครื่องหมายและสุดท้ายส่งออกหมายเลขการลงทะเบียนที่ทำเครื่องหมายไว้และคำตอบที่แรเงาในรูปแบบ CSV หลังจากทำตามขั้นตอนดังกล่าวแล้ว เราจะได้ซอฟต์แวร์ C# Optical Mark Recognition (OMR) ในรูปแบบ .NET มาเริ่มกันเลย
บทความจะครอบคลุมหัวข้อต่อไปนี้:
- คุณสมบัติของซอฟต์แวร์ C# Optical Mark Recognition (OMR)
- C# Optical Mark Recognition .NET API และการควบคุม UI
- ขั้นตอนในการพัฒนาซอฟต์แวร์ OMR
- การสาธิตซอฟต์แวร์ C# Optical Mark Recognition (OMR)
- ดาวน์โหลดซอร์สโค้ดซอฟต์แวร์ OMR
คุณลักษณะของซอฟต์แวร์ C# Optical Mark Recognition (OMR)
ซอฟต์แวร์ Optical Mark Recognition (OMR) ของเราจะมีคุณสมบัติดังต่อไปนี้:
- ปรับพารามิเตอร์การจดจำแบบโต้ตอบและดูผลแบบเรียลไทม์ เราสามารถปรับแต่งได้ดังนี้
- เกณฑ์การรับรู้
- ซูม
- แสดง/ซ่อนฟอง
- เลือกและโหลดภาพที่สแกนในรูปแบบต่อไปนี้:
- สังเกตเครื่องหมายออปติกบนภาพ
- ส่งออกผลลัพธ์เป็น 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)
- ถัดไป ในกล่องโต้ตอบกำหนดค่าโครงการใหม่ของคุณ ให้ป้อนชื่อโครงการ เลือกตำแหน่งที่ตั้ง และตั้งค่าพารามิเตอร์อื่นๆ
- จากนั้นเปิด NuGet Package Manager และติดตั้ง Aspose.OMR สำหรับแพ็คเกจ .NET
- จากนั้น เพิ่มไฟล์ใหม่ 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 ที่เราเพิ่งสร้างขึ้น
ดาวน์โหลดซอร์สโค้ดซอฟต์แวร์ OMR
คุณสามารถดาวน์โหลดซอร์สโค้ดทั้งหมดของแอปพลิเคชัน OMR Scanner ได้จาก GitHub
รับใบอนุญาตฟรี
คุณสามารถ รับใบอนุญาตชั่วคราวได้ฟรี เพื่อทดลองใช้ห้องสมุดโดยไม่มีข้อจำกัดในการประเมิน
บทสรุป
ในบทความนี้ เราได้เรียนรู้วิธีการ
- รวม Aspose.OMR สำหรับการควบคุม .NET UI ในแอปพลิเคชัน .NET
- พัฒนาโปรแกรมอ่านแผ่นงาน OMR ด้วยภาษา C#
นอกจากนี้ คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ Aspose.OMR for .NET API โดยใช้ เอกสารประกอบ ในกรณีที่มีความคลุมเครือ โปรดติดต่อเราได้ที่ ฟอรัม