یک خط لوله (Pipeline) استاندارد OCR شامل سه مرحله حیاتی است:
در پلتفرم .NET، ما به کتابخانههای متنباز و تجاری قدرتمندی دسترسی داریم که میتوانند این پایپلاین را به بهترین شکل پیادهسازی کنند.
برای ساخت چنین سیستمی، انتخاب ابزار مناسب براساس نوع پروژه (متنباز، تجاری، ویندوز-محور یا跨-platform) حیاتی است:
در ادامه، سناریویی را پیادهسازی میکنیم که در آن ابتدا تصویر دستخط توسط OpenCvSharp بهینهسازی شده و سپس توسط موتور Tesseract پردازش میشود.
گام اول: نصب پکیجهای مورد نیاز (NuGet)
از طریق پکیج منیجر داتنت، ابزارهای لازم را نصب کنید:
dotnet add package Tesseract
dotnet add package OpenCvSharp4
dotnet add package OpenCvSharp4.runtime.win
گام دوم: پیادهسازی لایه پیشپردازش تصویر (Image Preprocessing)
تصاویر دستخط معمولاً دارای نویز، نور ناهموار یا پسزمینه کدر هستند. اعمال فیلتر آستانهگذاری (Thresholding) و حذف نویز پیش از ورود به OCR الزامی است:
using OpenCvSharp;
public class ImageProcessor
{
public static Mat PrepareHandwritingImage(string inputPath)
{
// ۱. خواندن تصویر به صورت خاکستری (Grayscale)
Mat src = Cv2.ImRead(inputPath, ImreadModes.Grayscale);
Mat processed = new Mat();
// ۲. حذف نویز با فیلتر GaussianBlur
Cv2.GaussianBlur(src, processed, new Size(3, 3), 0);
// ۳. باینریسازی تطبیقی (Adaptive Thresholding) مناسب برای دستخط با نور نامتوازن
Cv2.AdaptiveThreshold(
processed,
processed,
255,
AdaptiveThresholdTypes.GaussianC,
ThresholdTypes.Binary,
11,
2
);
return processed;
}
}
گام سوم: موتور تشخیص متن با Tesseract
پس از آمادهسازی تصویر، آن را به موتور Tesseract ارسال میکنیم. توجه داشته باشید که برای متون دستخط، دانلود فایلهای آموزشی اختصاصی (.traineddata) مربوط به آن خط یا زبان (مانند fas برای فارسی یا eng برای انگلیسی) از مخزن رسمی Tesseract ضروری است.
using System;
using Tesseract;
using OpenCvSharp;
public class OcrEngineService
{
private readonly string _tessDataPath;
public OcrEngineService(string tessDataPath)
{
_tessDataPath = tessDataPath;
}
public string RecognizeText(Mat processedImage, string languageCode = "eng")
{
// تبدیل ماتریس OpenCvSharp به آرایه بایت برای استفاده در Tesseract
Cv2.ImEncode(".png", processedImage, out byte[] buf);
using var engine = new TesseractEngine(_tessDataPath, languageCode, EngineMode.Default)
{
// تنظیمات بهینه برای دقت بالاتر
DefaultPageSegMode = PageSegMode.Auto
};
using var img = Pix.LoadFromMemory(buf);
using var page = engine.Process(img);
string extractedText = page.GetText();
float meanConfidence = page.GetMeanConfidence();
Console.WriteLine($"Mean Confidence: {meanConfidence * 100:F2}%");
return extractedText;
}
}
اگر این سیستم قرار است به عنوان یک وبسیس یا میکروسرویس در بستر ASP.NET Core پیادهسازی شود، رعایت نکات زیر از منظر معماری نرمافزار حیاتی است:
public class OcrBackgroundWorker : BackgroundService
{
private readonly IChannel _taskQueue;
public OcrBackgroundWorker(IChannel taskQueue)
{
_taskQueue = taskQueue;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await foreach (var task in _taskQueue.Reader.ReadAllAsync(stoppingToken))
{
try
{
// اجرای پردازش تصویر و OCR
var preparedImg = ImageProcessor.PrepareHandwritingImage(task.ImagePath);
// ذخیره یا ارسال نتیجه به کلاینت از طریق SignalR / Database
}
catch (Exception ex)
{
// ثبت لاگ خطا
}
}
}
}
پیادهسازی OCR برای دستخط با چالشهای ساختاری روبهروست که کتابخانههای سنتی بهخودیخود قادر به حل100 درصدی آنها نیستند:
ساخت سیستم تشخیص دستخط با اکوسیستم .NET به لطف وجود ابزارهای قدرتمندی نظیر OpenCvSharp برای پیشپردازش و Tesseract برای تشخیص، کاملاً امکانپذیر، بهینه و مقرونبهصرفه است. با طراحی یک پایپلاین استاندارد، مدیریت صحیح حافظه در پردازشهای سنگین تصویر، و بهرهگیری از معماری غیرهمگام در ASP.NET Core، میتوان سامانهای با پایداری و دقت بالا برایکاربردهای سازمانی خلق کرد.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.