Optical Mark Recognition (OMR) adalah proses otomatis untuk menangkap dan menganalisis data yang ditandai pada jenis formulir dokumen khusus. Jenis dokumen khusus ini dapat ditandai/diisi oleh orang-orang pada formulir survei, lembar ujian, dan dokumen kertas lainnya. Pada artikel ini, kita akan mempelajari cara mengembangkan aplikasi OMR Sheet Reader berbasis GUI menggunakan C#. Solusi kami akan mengambil gambar lembar OMR yang dipindai sebagai input dari disk lokal, kemudian mengenali tanda dan akhirnya mengekspor nomor pendaftaran yang ditandai dan jawaban yang diarsir dalam format CSV. Setelah mengikuti langkah-langkah yang disebutkan, kami akan memiliki Perangkat Lunak C# Optical Mark Recognition (OMR) kami di .NET. Jadi mari kita mulai.
Artikel tersebut harus mencakup topik-topik berikut:
- Fitur Perangkat Lunak C# Optical Mark Recognition (OMR)
- C# Optical Mark Recognition .NET API dan Kontrol UI
- Langkah-Langkah Mengembangkan Perangkat Lunak OMR
- Demo Perangkat Lunak C# Optical Mark Recognition (OMR)
- Unduh Kode Sumber Perangkat Lunak OMR
Fitur Perangkat Lunak C# Optical Mark Recognition (OMR).
Perangkat Lunak Pengenalan Tanda Optik (OMR) kami akan memiliki fitur berikut:
- Sesuaikan parameter pengenalan secara interaktif dan saksikan efeknya secara real-time. Kita dapat menyesuaikan hal-hal berikut:
- Ambang pengakuan
- Perbesar
- Tampilkan/sembunyikan gelembung
- Pilih dan muat gambar yang dipindai dalam format berikut:
- Kenali tanda optik pada gambar.
- Ekspor hasil dalam CSV dan simpan ke disk lokal Anda.
C# Optical Mark Recognition .NET API dan Kontrol UI
Aspose.OMR for .NET API memungkinkan perancangan, pembuatan, dan pengenalan lembar jawaban, tes, makalah pilihan ganda, kuis, formulir umpan balik, survei, dan surat suara. Selain itu, ia menyediakan kontrol antarmuka pengguna grafis yang dapat ditambahkan ke aplikasi .NET UI. Kami akan mengintegrasikan Aspose.OMR untuk kontrol .NET UI dalam aplikasi .NET UI untuk mengembangkan aplikasi pemindai/pembaca OMR. Harap unduh DLL API atau instal menggunakan NuGet.
PM> Install-Package Aspose.OMR
Langkah-langkah Mengembangkan Perangkat Lunak OMR
Kita dapat mengembangkan aplikasi pemindai/pembaca OMR berbasis GUI dengan mengikuti langkah-langkah berikut ini:
- Pertama, buat proyek baru dan pilih template proyek WPF App (.NET Framework).
- Selanjutnya, di Konfigurasikan dialog proyek baru Anda, masukkan Nama proyek, pilih Lokasi, dan atur parameter lainnya.
- Kemudian, buka NuGet Package Manager dan instal Aspose.OMR untuk paket .NET.
- Selanjutnya, tambahkan file baru DialogHelper.cs ke proyek.
- Tambahkan kode berikut ke DialogHelper.cs yang baru dibuat.
internal class DialogHelper
{
///<summary>
/// String filter untuk dialog yang membuka gambar template.
///</summary>
private static readonly string ImageFilesFilterPrompt = "Image files |*.jpg; *.jpeg; *.png; *.gif; *.tif; *.tiff;";
///<summary>
/// String filter untuk dialog yang menyimpan hasil pengenalan
///</summary>
private static readonly string DataExportFilesFilterPrompt = "Comma-Separated Values (*.csv)" + " | *.csv";
///<summary>
/// Menampilkan dialog file Buka Gambar.
///</summary>
///<returns> Jalur ke file yang dipilih, atau<c> batal</c> jika tidak ada file yang dipilih.</returns>
public static string ShowOpenImageDialog(string suggestedDir = null)
{
OpenFileDialog dialog = new OpenFileDialog();
return ShowDialog(dialog, ImageFilesFilterPrompt, suggestedDir);
}
///<summary>
/// Menampilkan dialog file Hasil Pengakuan Simpan.
///</summary>
///<returns> Jalur ke file yang dipilih, atau<c> batal</c> jika tidak ada file yang dipilih.</returns>
public static string ShowSaveDataDialog(string suggestedName)
{
SaveFileDialog dialog = new SaveFileDialog();
return ShowDialog(dialog, DataExportFilesFilterPrompt, suggestedName);
}
///<summary>
/// Menampilkan dialog yang diberikan dan mengembalikan hasilnya sebagai a<c> rangkaian</c> .
///</summary>
///<param name="dialog"> Dialog untuk ditampilkan.</param>
///<param name="filter"> String filter jenis file.</param>
///<param name="suggestedDir"> Direktori awal dialog yang disarankan</param>
///<param name="suggestedName"> Nama file yang disarankan</param>
///<returns> Jalur ke file yang dipilih, atau<c> batal</c> jika tidak ada file yang dipilih.</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;
}
}
- Selanjutnya, perbarui file MainWindow.xaml dengan konten XAML berikut.
<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>
- Setelah itu, ganti konten berikut di file MainWindow.xaml.cs.
///<summary>
/// Templat untuk pengujian
///</summary>
private static readonly string TemplateFilePath = @"C:\Files\OMR\Sheet.omr";
///<summary>
/// Path ke file Aspose.OMR.NET.lic lisensi
///</summary>
private static readonly string LicensePath = @"";
private CorrectionControl control;
public MainWindow()
{
InitializeComponent();
// Tetapkan dan tampilkan jalur file templat
txtTemplatePath.Text = TemplateFilePath;
// Tetapkan lisensi, berikan Path file Lisensi dan batalkan komentar untuk menguji hasil lengkap
//Lisensi lisensi = Lisensi baru();
//lic.SetLicense(LicensePath);
}
public string UserImagePath { get; set; }
public string DataFolderPath { get; set; }
///<summary>
/// Memuat dan menampilkan 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>
/// Pilih dan tampilkan gambar
///</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>
/// Kenali gambar yang dimuat
///</summary>
private void RecognizeImageClicked(object sender, RoutedEventArgs e)
{
if (control == null)
{
return;
}
control.RecognizeImage();
}
///<summary>
/// Ekspor hasil ke 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");
}
- Terakhir, jalankan aplikasi.
Demo Perangkat Lunak C# Optical Mark Recognition (OMR).
Berikut adalah demonstrasi dari aplikasi OMR Scanner/Reader yang baru saja kita buat.
Unduh Kode Sumber Perangkat Lunak OMR
Anda dapat mengunduh kode sumber lengkap aplikasi OMR Scanner dari GitHub.
Dapatkan Lisensi Gratis
Anda bisa mendapatkan lisensi sementara gratis untuk mencoba perpustakaan tanpa batasan evaluasi.
Kesimpulan
Pada artikel ini, kita telah mempelajari caranya
- mengintegrasikan Aspose.OMR untuk kontrol .NET UI di aplikasi .NET;
- mengembangkan aplikasi pembaca lembar OMR di C #.
Selain itu, Anda dapat mempelajari lebih lanjut tentang Aspose.OMR for .NET API menggunakan dokumentasi. Jika ada ambiguitas, jangan ragu untuk menghubungi kami di forum kami.