Pregunta

Estoy intentando usar MODI para realizar OCR en un programa de ventana.Funciona bien para capturas de pantalla que tomo mediante programación usando interoperabilidad win32 como esta:

public string SaveScreenShotToFile()
{
    RECT rc;
    GetWindowRect(_hWnd, out rc);

    int width = rc.right - rc.left;
    int height = rc.bottom - rc.top;

    Bitmap bmp = new Bitmap(width, height);
    Graphics gfxBmp = Graphics.FromImage(bmp);
    IntPtr hdcBitmap = gfxBmp.GetHdc();

    PrintWindow(_hWnd, hdcBitmap, 0);

    gfxBmp.ReleaseHdc(hdcBitmap);
    gfxBmp.Dispose();

    string fileName = @"c:\temp\screenshots\" + Guid.NewGuid().ToString() + ".bmp";
    bmp.Save(fileName);
    return fileName;
}

Luego, esta imagen se guarda en un archivo y se ejecuta en MODI de esta manera:

    private string GetTextFromImage(string fileName)
    {

        MODI.Document doc = new MODI.DocumentClass();
        doc.Create(fileName);
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        MODI.Image img = (MODI.Image)doc.Images[0];
        MODI.Layout layout = img.Layout;

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < layout.Words.Count; i++)
        {
            MODI.Word word = (MODI.Word)layout.Words[i];
            sb.Append(word.Text);
            sb.Append(" ");
        }

        if (sb.Length > 1)
            sb.Length--;

        return sb.ToString();
    }

Esta parte funciona bien, sin embargo, no quiero realizar OCR en toda la captura de pantalla, solo en partes.Intento recortar la imagen mediante programación de esta manera:

    private string SaveToCroppedImage(Bitmap original)
    {
        Bitmap result = original.Clone(new Rectangle(0, 0, 250, 250), original.PixelFormat);
        var fileName = "c:\\" + Guid.NewGuid().ToString() + ".bmp";
        result.Save(fileName, original.RawFormat);

        return fileName;
    }

y luego realizar OCR en esta imagen más pequeña, sin embargo, MODI genera una excepción;'Error de ejecución de OCR', el código de error es -959967087.

¿Por qué MODI puede manejar el mapa de bits original pero no la versión más pequeña extraída de él?

¿Fue útil?

Solución

Parece como si la respuesta es en el dar MODI un lienzo más grande. También estaba tratando de tomar una captura de pantalla de un control y OCR y encontré con el mismo problema. Al final tomé la imagen del control, copiado la imagen en un mapa de bits mayor y OCR el mapa de bits mayor.

Otro problema que encontré fue que debe tener una extensión adecuada para su archivo de imagen. En otras palabras, .tmp no es suficiente.

Me quedé con el trabajo de crear una fuente más grande dentro de mi método de OCR, que se ve algo como esto (me tratan directamente con los objetos de imagen):

public static string ExtractText(this Image image)
{
    var tmpFile = Path.GetTempFileName();
    string text;
    try
    {
        var bmp = new Bitmap(Math.Max(image.Width, 1024), Math.Max(image.Height, 768));
        var gfxResize = Graphics.FromImage(bmp);
        gfxResize.DrawImage(image, new Rectangle(0, 0, image.Width, image.Height));
        bmp.Save(tmpFile + ".bmp", ImageFormat.Bmp);
        var doc = new MODI.Document();
        doc.Create(tmpFile + ".bmp");
        doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
        var img = (MODI.Image)doc.Images[0];
        var layout = img.Layout;
        text = layout.Text;
    }
    finally
    {
        File.Delete(tmpFile);
        File.Delete(tmpFile + ".bmp");
    }

    return text;
}

No estoy seguro exactamente lo que el tamaño mínimo es, pero parece como si 1024 x 768 hace el truco.

Otros consejos

Si los mensajes en este tema me ayudó a gettin que funcione, aquí lo que tengo que añadir:

estaba tratando de descargar imágenes (las más pequeñas) y luego ocr ...

-cuando el procesamiento de imágenes, parece que theyr tamaño debe ser potencia de 2! (OCR fue capaz de imágenes: 512x512, 128x128, 256x64 .. otros tamaños sobre todo falló (como 1103x334))

  • fondo transparente también hechas problemas. Me dieron los mejores resultados al crear un nuevo tif con frontera powerof2, fondo blanco, pegar la imagen descargado en él, guardar.

  • escalar la imagen final no tuvo para mí, ya que OCR está consiguiendo resultados erróneos, especialmente para caracteres "alemán" como "ü"

  • en el extremo i también se utiliza: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, falso, false);

  • mediante modificación de la oficina 2003

saludos

WOMD

el OCR modi está trabajando solamente tif conmigo. tratar de salvar la imagen en "TIF".

lo siento mi mala Inglés

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

Lo que significa que no quiero que le permite detectar la orientación y no fija ningún sesgo. Ahora el comando funciona bien en todas las imágenes, incluyendo el tiff 2400x2496.

Sin embargo, la imagen debe estar en .tif.

Espero que esto ayude a las personas que enfrentan el mismo problema.

Yo tenía el mismo problema "OCR problema al ejecutar" con algunas imágenes. Me remodelarán la imagen (en mi caso en un 50%), es decir, reducido su tamaño y listo! Así funciona!

Tuve el mismo problema mientras usaba el

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);

en un archivo tiff de 2400x2496.Cambiar su tamaño al 50% (reducir el tamaño) solucionó el problema y el método ya no arrojaba la excepción; sin embargo, reconocía incorrectamente el texto, como detectar "relerencia" en lugar de "referencia" o "712017" en lugar de "712517". .Seguí probando diferentes tamaños de imagen pero todos tenían el mismo problema, hasta que cambié el comando a

doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);

lo que significa que no quiero que detecte la orientación y no corrija ninguna inclinación.Ahora el comando funciona bien en todas las imágenes, incluido el tiff de 2400x2496.

Espero que esto ayude a las personas que enfrentan el mismo problema.

lo resolvió mi situación estaba usando un editor de imágenes (Paint.NET) y utilizar el efecto de nitidez en el máximo.

También utilicé: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, falso, false);

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top