CtrEditor/Services/PaddleOCRManager.cs

88 lines
2.7 KiB
C#

using System;
using System.IO;
using System.Drawing;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows;
using System.Linq;
using PaddleOCRSharp;
namespace CtrEditor.Services
{
// Clase auxiliar para gestionar PaddleOCR
public static class PaddleOCRManager
{
private static PaddleOCREngine _engine;
private static bool _initialized = false;
private static readonly object _lockObj = new object();
public static PaddleOCREngine GetEngine()
{
if (!_initialized)
{
lock (_lockObj)
{
if (!_initialized)
{
InitializeEngine();
_initialized = true;
}
}
}
return _engine;
}
private static void InitializeEngine()
{
try
{
string baseDir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "paddleocr");
OCRModelConfig config = new OCRModelConfig
{
// Rutas a modelos de inferencia
det_infer = Path.Combine(baseDir, "det", "inference"),
cls_infer = Path.Combine(baseDir, "cls", "inference"),
rec_infer = Path.Combine(baseDir, "rec", "inference"),
keys = Path.Combine(baseDir, "keys", "ppocr_keys.txt")
};
OCRParameter parameter = new OCRParameter
{
// Configurar parámetros de OCR
use_angle_cls = true,
cls_thresh = 0.9f,
det_db_thresh = 0.3f,
det_db_box_thresh = 0.6f,
rec_batch_num = 6,
rec_img_h = 48,
enable_mkldnn = true,
use_gpu = false,
cpu_math_library_num_threads = Environment.ProcessorCount
};
_engine = new PaddleOCREngine(config, parameter);
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"Error al inicializar PaddleOCR: {ex.Message}");
// Fallback - inicializar con configuración predeterminada
_engine = new PaddleOCREngine();
}
}
public static void Cleanup()
{
lock (_lockObj)
{
if (_initialized && _engine != null)
{
_engine.Dispose();
_engine = null;
_initialized = false;
}
}
}
}
}