Optik İşaret Tanıma (OMR), özel türde bir belge formunda işaretlenmiş verileri yakalama ve analiz etmeye yönelik otomatik bir süreçtir. Bu özel belge türü, kişiler tarafından anket formları, test sayfaları ve diğer kağıt belgeler üzerine işaretlenebilir/doldurulabilir. Bu yazımızda C# kullanarak GUI tabanlı bir OMR Sheet Reader uygulaması geliştirmeyi öğreneceğiz. Çözümümüz, taranan OMR sayfası görüntüsünü yerel bir diskten girdi olarak alacak, ardından işaretleri tanıyacak ve son olarak işaretli kayıt numarasını ve gölgeli yanıtları CSV formatında dışa aktaracaktır. Bahsedilen adımları takip ettikten sonra C# Optical Mark Recognition (OMR) Yazılımımızı .NET ortamında yapmış olacağız. Öyleyse başlayalım.
Makale aşağıdaki konuları kapsayacaktır:
- C# Optik İşaret Tanıma (OMR) Yazılımının Özellikleri
- C# Optik İşaret Tanıma .NET API ve UI Kontrolü
- OMR Yazılımını Geliştirme Adımları
- C# Optik İşaret Tanıma (OMR) Yazılım Demosu
- OMR Yazılımı Kaynak Kodunu İndirin
C# Optik İşaret Tanıma (OMR) Yazılımının Özellikleri
Optik İşaret Tanıma (OMR) Yazılımımız aşağıdaki özelliklere sahip olacaktır:
- Tanıma parametrelerini etkileşimli olarak ayarlayın ve etkilerini gerçek zamanlı olarak izleyin. Aşağıdakileri ayarlayabiliriz:
- Tanıma eşiği
- yakınlaştır
- Baloncukları göster/gizle
- Aşağıdaki biçimlerde taranan görüntüyü seçin ve yükleyin:
- Görüntüdeki optik işaretleri tanıyın.
- Sonuçları CSV olarak dışa aktarın ve yerel diskinize kaydedin.
C# Optik İşaret Tanıma .NET API ve UI Kontrolü
Aspose.OMR for .NET API; cevap kağıtları, testler, MCQ kağıtları, sınavlar, geri bildirim formları, anketler ve oy pusulaları tasarlamanıza, oluşturmanıza ve tanımanıza olanak tanır. Ayrıca, .NET UI uygulamalarına eklenebilen bir grafik kullanıcı arayüzü kontrolü sağlar. Bir OMR tarayıcı/okuyucu uygulaması geliştirmek için Aspose.OMR for .NET UI kontrolünü .NET UI uygulamasına entegre edeceğiz. Lütfen API’nin DLL’sini indirin veya NuGet kullanarak kurun.
PM> Install-Package Aspose.OMR
OMR Yazılımı Geliştirme Adımları
Aşağıda verilen adımları izleyerek GUI tabanlı bir OMR tarayıcı/okuyucu uygulaması geliştirebiliriz:
- Öncelikle yeni bir proje oluşturun ve WPF Uygulaması (.NET Framework) proje şablonunu seçin.
- Ardından, Yeni projenizi yapılandırın iletişim kutusunda Proje adını girin, Konumu seçin ve diğer parametreleri ayarlayın.
- Ardından, NuGet Paket Yöneticisi’ni açın ve Aspose.OMR for .NET paketini kurun.
- Ardından, projeye yeni bir DialogHelper.cs dosyası ekleyin.
- Yeni oluşturulan DialogHelper.cs dosyasına aşağıdaki kodu ekleyin.
internal class DialogHelper
{
///<summary>
/// Şablon resimlerini açan iletişim kutusu için filtre dizesi.
///</summary>
private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";
///<summary>
/// Tanıma sonuçlarını kaydeden iletişim kutusu için filtre dizisi
///</summary>
private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";
///<summary>
/// Görüntü dosyası aç iletişim kutusunu gösterir.
///</summary>
///<returns> Seçilen dosyanın yolu veya<c> hükümsüz</c> herhangi bir dosya seçilmediyse.</returns>
public static string ShowOpenImageDialog(string suggestedDir = null)
{
OpenFileDialog dialog = new OpenFileDialog();
return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
}
///<summary>
/// Tanıma Sonuçlarını Kaydet iletişim kutusunu gösterir.
///</summary>
///<returns> Seçilen dosyanın yolu veya<c> hükümsüz</c> herhangi bir dosya seçilmediyse.</returns>
public static string ShowSaveDataDialog(string suggestedName)
{
SaveFileDialog dialog = new SaveFileDialog();
return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
}
///<summary>
/// Verilen iletişim kutusunu görüntüler ve sonucunu şu şekilde döndürür:<c> sicim</c> .
///</summary>
///<param name="dialog"> Gösterilecek iletişim kutusu.</param>
///<param name="filter"> Dosya türü filtre dizesi.</param>
///<param name="suggestedDir"> Önerilen diyalog başlangıç dizini</param>
///<param name="suggestedName"> Önerilen dosya adı</param>
///<returns> Seçilen dosyanın yolu veya<c> hükümsüz</c> herhangi bir dosya seçilmediyse.</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;
}
}
- Ardından, MainWindow.xaml dosyasını aşağıdaki XAML içeriğiyle güncelleyin.
<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>
- Bundan sonra, MainWindow.xaml.cs dosyasındaki aşağıdaki içeriği değiştirin.
///<summary>
/// Test için şablon
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";
///<summary>
/// Aspose.OMR.NET.lic dosyasının lisans yolu
///</summary>
private static readonly string LicensePath = @"";
private CorrectionControl control;
public MainWindow()
{
InitializeComponent();
// Şablon dosya yolunu ayarla ve göster
txtTemplatePath.Text = TemplateFilePath;
// Tam sonuçları test etmek için lisansı ayarlayın, Lisans dosyası Yolunu sağlayın ve açıklamayı kaldırın
//Lisans lisansı = yeni Lisans();
//lic.SetLicense(LicensePath);
}
public string UserImagePath { get; set; }
public string DataFolderPath { get; set; }
///<summary>
/// CorrectionControl'ü yükler ve görüntüler
///</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>
/// Görüntüyü seçin ve görüntüleyin
///</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>
/// Yüklenen görüntüyü tanı
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
if (control == null)
{
return;
}
control.RecognizeImage();
}
///<summary>
/// Sonuçları CSV'ye aktar
///</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");
}
- Son olarak uygulamayı çalıştırın.
C# Optik İşaret Tanıma (OMR) Yazılım Demosu
Aşağıda yeni oluşturduğumuz OMR Tarayıcı/Okuyucu uygulamasının tanıtımı yer almaktadır.
OMR Yazılımı Kaynak Kodunu İndirin
OMR Tarayıcı uygulamasının tüm kaynak kodunu GitHub adresinden indirebilirsiniz.
Ücretsiz Lisans Alın
Kitaplığı değerlendirme sınırlamaları olmadan denemek için ücretsiz bir geçici lisans alabilirsiniz.
Çözüm
Bu yazıda, nasıl yapılacağını öğrendik
- Aspose.OMR for .NET UI kontrolünü .NET uygulamasına entegre edin;
- C# dilinde OMR sayfa okuyucu uygulaması geliştirin.
Ayrıca, belgeleri kullanarak Aspose.OMR for .NET API hakkında daha fazla bilgi edinebilirsiniz. Herhangi bir belirsizlik durumunda, lütfen forumumuzdan bizimle iletişime geçmekten çekinmeyin.