تشخیص علامت نوری (OMR) به خواندن و ضبط داده های علامت گذاری شده در نوع خاصی از فرم سند اجازه می دهد. این فرم سند می تواند یک آزمایش یا نظرسنجی باشد که شامل ورودی های حباب یا مربعی است که توسط کاربران پر شده است. ما میتوانیم به راحتی عملیات OMR را بر روی تصاویر اسکن شده چنین فرمهای نظرسنجی یا برگههای آزمایشی انجام دهیم و ورودیهای کاربر را به صورت برنامهنویسی در برنامههای NET بخوانیم. در این مقاله نحوه انجام OMR و استخراج داده ها با استفاده از سی شارپ را یاد می گیریم.
موضوعات زیر در این مقاله پوشش داده خواهد شد:
- C# OMR API برای انجام OMR و استخراج داده ها
- OMR را انجام دهید و داده ها را از تصویر استخراج کنید
- OMR را انجام دهید و داده ها را از چندین تصویر استخراج کنید
- نتایج OMR را با آستانه دریافت کنید
- عملیات OMR با محاسبه مجدد
C# OMR API برای انجام OMR و استخراج داده ها
برای انجام عملیات OMR و صادر کردن داده ها از تصاویر، از Aspose.OMR for .NET API استفاده خواهیم کرد. این امکان طراحی، ایجاد و شناسایی برگههای پاسخ، آزمونها، مقالات MCQ، آزمونها، فرمهای بازخورد، نظرسنجیها و برگههای رأی را فراهم میکند. لطفاً DLL API را دانلود یا با استفاده از NuGet نصب کنید.
PM> Install-Package Aspose.OMR
انجام OMR و استخراج داده ها از تصویر
برای انجام عملیات OMR روی یک تصویر، به الگوی OMR آماده شده (.omr) و تصویر (فرم ها/برگ های پر شده توسط کاربر) برای انجام OMR نیاز داریم. با دنبال کردن مراحل زیر میتوانیم یک عملیات OMR را روی یک تصویر انجام دهیم و دادهها را استخراج کنیم:
- ابتدا یک نمونه از کلاس OmrEngine ایجاد کنید.
- سپس، متد GetTemplateProcessor() را فراخوانی کرده و شی کلاس TemplateProcessor را مقداردهی اولیه کنید. مسیر فایل قالب OMR را به عنوان آرگومان می گیرد.
- سپس، شیء RecognitionResult را با فراخوانی متد RecognizeImage() با مسیر تصویر به عنوان آرگومان دریافت کنید.
- پس از آن، با استفاده از روش GetCsv() نتایج شناسایی را به عنوان رشته های CSV دریافت کنید.
- در نهایت، نتیجه CSV را به عنوان یک فایل CSV در دیسک محلی ذخیره کنید.
نمونه کد زیر نحوه انجام OMR را بر روی یک تصویر و استخراج داده ها با فرمت CSV با استفاده از C# نشان می دهد.
// مسیر فایل قالب OMR
string templatePath = @"D:\Files\OMR\Sheet.omr";
// مسیر فایل تصویری
string imagePath = @"D:\Files\OMR\Sheet1.jpg";
// موتور OMR را راه اندازی کنید
OmrEngine engine = new OmrEngine();
// پردازشگر قالب را دریافت کنید
TemplateProcessor templateProcessor = engine.GetTemplateProcessor(templatePath);
// تشخیص تصویر
RecognitionResult result = templateProcessor.RecognizeImage(imagePath);
// نتایج را در CSV دریافت کنید
string csvResult = result.GetCsv();
// فایل CSV را ذخیره کنید
File.WriteAllText(@"D:\Files\OMR\Sheet1.csv", csvResult);
الگوی OMR مورد استفاده در مثال کد بالا را میتوانید از اینجا دانلود کنید.
OMR را انجام دهید و داده ها را از چندین تصویر استخراج کنید
ما میتوانیم عملیات OMR را روی چندین تصویر انجام دهیم و با دنبال کردن مراحلی که قبلا ذکر شد، دادهها را در یک فایل CSV جداگانه برای هر تصویر استخراج کنیم. با این حال، ما باید مراحل # 3، 4، و 5 را برای همه تصاویر یک به یک تکرار کنیم.
نمونه کد زیر نشان می دهد که چگونه می توان OMR را روی چندین تصویر انجام داد و داده ها را با فرمت CSV با استفاده از C# استخراج کرد.
// مسیر فایل قالب OMR
string templatePath = @"D:\Files\OMR\Sheet.omr";
// مسیر فایل پوشه تصاویر
string imageFolderPath = @"D:\Files\OMR\";
// مسیر دایرکتوری خروجی
string outputPath = @"D:\Files\OMR\";
// تصاویری که باید پردازش شوند
string[] UserImages = new string[] { "Sheet1.jpg", "Sheet2.jpg" };
// موتور OMR را راه اندازی کنید
OmrEngine engine = new OmrEngine();
// پردازشگر قالب را دریافت کنید
TemplateProcessor templateProcessor = engine.GetTemplateProcessor(templatePath);
// تصاویر را یک به یک پردازش کنید
for (int i = 0; i < UserImages.Length; i++)
{
string imagePath = Path.Combine(imageFolderPath, UserImages[i]);
// تشخیص تصویر
RecognitionResult result = templateProcessor.RecognizeImage(imagePath);
// نتایج را در CSV دریافت کنید
string csvResult = result.GetCsv();
// فایل CSV را ذخیره کنید
File.WriteAllText(Path.Combine(outputPath, Path.GetFileNameWithoutExtension(UserImages[i]) + ".csv"), csvResult);
}
API همچنین عملکردی را برای شناسایی و شناسایی بارکدهای موجود بر روی تصویر در طول عملیات OMR ارائه می دهد. این ویژگی پیش فرض عملیات OMR است. ما می توانیم عملیات OMR را انجام دهیم و بارکدها را با دنبال کردن مراحل ذکر شده در قبل تشخیص دهیم.
نتایج OMR را با آستانه دریافت کنید
ما می توانیم آستانه را در حین انجام عملیات OMR روی تصاویر اعمال کنیم. مقدار آستانه بسته به نیاز می تواند از 0 تا 100 باشد. هر چه مقدار آستانه بالاتر باشد، API در مورد برجسته کردن پاسخها سختتر میشود. لطفاً برای انجام OMR با آستانه، مراحلی که قبلا ذکر شد را دنبال کنید. با این حال، ما فقط باید روش اضافه بار شده RecognizeImage(string, int32) را در مرحله 3 فراخوانی کنیم. این روش مسیر فایل تصویر و مقدار آستانه را به عنوان آرگومان می گیرد.
نمونه کد زیر نحوه اجرای OMR با مقدار آستانه را با استفاده از C# نشان می دهد.
// مسیر فایل قالب OMR
string templatePath = @"D:\Files\OMR\Sheet.omr";
// مسیر فایل تصویری
string imagePath = @"D:\Files\OMR\Sheet1.jpg";
// مقدار آستانه
int CustomThreshold = 40;
// موتور OMR را راه اندازی کنید
OmrEngine engine = new OmrEngine();
// پردازشگر قالب را دریافت کنید
TemplateProcessor templateProcessor = engine.GetTemplateProcessor(templatePath);
// تشخیص تصویر
RecognitionResult result = templateProcessor.RecognizeImage(imagePath, CustomThreshold);
// نتایج را در CSV دریافت کنید
string csvResult = result.GetCsv();
// فایل CSV را ذخیره کنید
File.WriteAllText(@"D:\Files\OMR\Sheet1_threshold.csv", csvResult);
عملیات OMR با محاسبه مجدد
در موارد خاص، ممکن است نیاز به محاسبه مجدد نتایج OMR با مقادیر آستانه متفاوت داشته باشیم. برای این منظور، میتوانیم API را طوری پیکربندی کنیم که با استفاده از روش TemplateProcessor.recalculate() بهطور خودکار دوباره محاسبه شود. این اجازه می دهد تا یک تصویر را چندین بار با تغییر تنظیمات آستانه پردازش کنید تا به نتیجه دلخواه برسید. با دنبال کردن مراحل زیر می توانیم عملیات OMR را با محاسبه مجدد انجام دهیم:
- ابتدا یک نمونه از کلاس OmrEngine ایجاد کنید.
- سپس، متد GetTemplateProcessor() را فراخوانی کنید و شی کلاس TemplateProcessor را مقداردهی اولیه کنید. مسیر فایل قالب OMR را به عنوان آرگومان می گیرد.
- سپس، شی Stopwatch را مقداردهی اولیه کنید و تایمر را شروع کنید.
- سپس، با فراخوانی متد RecognizeImage() با مسیر تصویر به عنوان آرگومان، شی RecognitionResult را دریافت کنید.
- سپس، تایمر را متوقف کنید و نتایج تشخیص را به عنوان یک رشته CSV با استفاده از روش GetCsv() صادر کنید.
- در مرحله بعد، نتیجه CSV را به عنوان یک فایل CSV در دیسک محلی ذخیره کنید.
- سپس با استفاده از متد Restart() تایمر را مجددا راه اندازی کنید.
- سپس، متد Recalculate() را فراخوانی کنید. شی RecognitionResult و مقدار آستانه را به عنوان آرگومان می گیرد.
- پس از آن، تایمر را متوقف کنید و نتایج شناسایی را به عنوان یک رشته CSV با استفاده از متد GetCsv() صادر کنید.
- در نهایت، نتیجه CSV را به عنوان یک فایل CSV در دیسک محلی ذخیره کنید.
نمونه کد زیر نحوه انجام OMR با روش محاسبه مجدد با استفاده از C# را نشان می دهد.
// مسیر فایل قالب OMR
string templatePath = @"D:\Files\OMR\Sheet.omr";
// مسیر فایل تصویری
string imagePath = @"D:\Files\OMR\Sheet1.jpg";
// مقدار آستانه
int CustomThreshold = 40;
// موتور OMR را راه اندازی کنید
OmrEngine engine = new OmrEngine();
// پردازشگر قالب را دریافت کنید
TemplateProcessor templateProcessor = engine.GetTemplateProcessor(templatePath);
// تایمر برای اندازه گیری عملکرد
Stopwatch sw = Stopwatch.StartNew();
// تشخیص تصویر
RecognitionResult result = templateProcessor.RecognizeImage(imagePath, CustomThreshold);
sw.Stop();
// نتایج را در CSV دریافت کنید
string csvResult = result.GetCsv();
// فایل CSV را ذخیره کنید
File.WriteAllText(@"D:\Files\OMR\Sheet1.csv", csvResult);
sw.Restart();
// دوباره محاسبه کنید
templateProcessor.دوباره محاسبه کنید(result, CustomThreshold);
sw.Stop();
// نتایج محاسبه شده مجدد را در CSV دریافت کنید
csvResult = result.GetCsv();
// فایل CSV حاصل دوباره محاسبه شده را ذخیره کنید
File.WriteAllText(@"D:\Files\OMR\Sheet1_دوباره محاسبه کنیدd.csv", csvResult);
مجوز رایگان دریافت کنید
میتوانید [یک مجوز موقت رایگان] دریافت کنید20 تا کتابخانه را بدون محدودیت ارزیابی امتحان کنید.
نتیجه
در این مقاله یاد گرفتیم که چگونه:
- انجام عملیات OMR بر روی تصاویر و استخراج داده ها در فرمت CSV با استفاده از C#.
- هنگام انجام OMR روی تصاویر، تنظیمات آستانه را اعمال کنید.
- نتایج OMR را در یک فرآیند خودرو به صورت برنامهریزی مجدد محاسبه کنید.
علاوه بر این، میتوانید با استفاده از مستندات درباره Aspose.OMR برای .NET API اطلاعات بیشتری کسب کنید. در صورت وجود هرگونه ابهام، لطفاً با ما در تالار گفتمان تماس بگیرید.