تشخیص علامت نوری (OMR) فرآیندی خودکار برای جمعآوری و تجزیه و تحلیل دادههای علامتگذاریشده در نوع خاصی از فرم سند است. این نوع خاص از سند می تواند توسط افراد در فرم های نظرسنجی، برگه های آزمون و سایر اسناد کاغذی علامت گذاری/پر شود. در این مقاله یاد می گیریم که چگونه یک برنامه OMR Sheet Reader مبتنی بر رابط کاربری گرافیکی را با استفاده از سی شارپ توسعه دهیم. راه حل ما تصویر برگه OMR اسکن شده را به عنوان ورودی از یک دیسک محلی می گیرد، سپس علائم را تشخیص می دهد و در نهایت شماره ثبت علامت گذاری شده و پاسخ های سایه دار را در قالب CSV صادر می کند. پس از انجام مراحل ذکر شده، نرم افزار C# Optical Mark Recognition (OMR) خود را در دات نت خواهیم داشت. پس بیایید شروع کنیم.
مقاله باید موضوعات زیر را پوشش دهد:
- ویژگی های نرم افزار C# Optical Mark Recognition (OMR)
- C# Optical Mark Recognition .NET API and UI Control
- مراحل توسعه نرم افزار OMR
- نمایش نرم افزار تشخیص علامت نوری C# (OMR)
- دانلود کد منبع نرم افزار OMR
ویژگی های نرم افزار C# Optical Mark Recognition (OMR).
نرم افزار تشخیص علامت نوری (OMR) ما دارای ویژگی های زیر خواهد بود:
- به صورت تعاملی پارامترهای تشخیص را تنظیم کنید و تأثیر آنها را در زمان واقعی تماشا کنید. ما می توانیم موارد زیر را تنظیم کنیم:
- آستانه تشخیص
- بزرگنمایی
- نمایش/پنهان کردن حباب ها
- تصویر اسکن شده را در قالب های زیر انتخاب و بارگذاری کنید:
- علائم نوری روی تصویر را بشناسید.
- نتایج را در CSV صادر کنید و آنها را در دیسک محلی خود ذخیره کنید.
C# Optical Mark Recognition .NET API و UI Control
Aspose.OMR for .NET API امکان طراحی، ایجاد و شناسایی برگههای پاسخ، آزمونها، مقالات MCQ، آزمونها، فرمهای بازخورد، نظرسنجیها و برگههای رأی را میدهد. علاوه بر این، یک کنترل رابط کاربری گرافیکی را فراهم می کند که می تواند به برنامه های .NET UI اضافه شود. ما Aspose.OMR را برای کنترل UI .NET در برنامه .NET UI برای توسعه یک برنامه اسکنر/خواننده OMR ادغام خواهیم کرد. لطفاً DLL API را دانلود یا با استفاده از NuGet نصب کنید.
PM> Install-Package Aspose.OMR
مراحل توسعه نرم افزار OMR
ما می توانیم با دنبال کردن مراحل زیر، یک برنامه اسکنر/خواننده OMR مبتنی بر رابط کاربری گرافیکی ایجاد کنیم:
- ابتدا یک پروژه جدید ایجاد کنید و الگوی پروژه WPF App (.NET Framework) را انتخاب کنید.
- بعد، در گفتگوی Configure your new project، نام پروژه را وارد کنید، مکان را انتخاب کنید و سایر پارامترها را تنظیم کنید.
- سپس، NuGet Package Manager را باز کنید و Aspose.OMR را برای بسته دات نت نصب کنید.
- سپس یک فایل 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>
/// محاوره فایل Save Recognition Results را نشان می دهد.
///</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# (OMR).
در زیر نمایش برنامه OMR Scanner/Reader است که به تازگی ایجاد کرده ایم.
کد منبع نرم افزار OMR را دانلود کنید
می توانید کد منبع کامل برنامه OMR Scanner را از GitHub دانلود کنید.
مجوز رایگان دریافت کنید
شما می توانید یک مجوز موقت رایگان دریافت کنید تا کتابخانه را بدون محدودیت ارزیابی امتحان کنید.
نتیجه
در این مقاله یاد گرفتیم که چگونه
- Aspose.OMR را برای کنترل UI .NET در برنامه .NET ادغام کنید.
- برنامه ورق خوان OMR را در سی شارپ توسعه دهید.
علاوه بر این، میتوانید با استفاده از مستندات درباره Aspose.OMR for .NET API اطلاعات بیشتری کسب کنید. در صورت وجود هرگونه ابهامی، لطفاً با ما در [تالار گفتمان17 تماس بگیرید.