Domanda

Sto cercando di utilizzare MODI per OCR programma di una finestra. Funziona bene per gli screenshots Afferro programmazione utilizzando win32 interoperabilità in questo modo:

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;
}

Questa immagine è poi salvata in un file e corse attraverso MODI in questo modo:

    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();
    }

Questa parte funziona bene, però, io non voglio OCR l'intera schermata, a porzioni di esso. Provo a ritagliare l'immagine a livello di codice in questo modo:

    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;
    }

e quindi OCR questa immagine più piccola, tuttavia MODI genera un'eccezione; 'OCR errore di esecuzione', il codice di errore è -959.967.087.

Perché può MODI gestire il bitmap originale, ma non la versione più piccola presa da esso?

È stato utile?

Soluzione

Sembra come se la risposta è nel dare MODI una tela più grande. Stavo anche cercando di prendere uno screenshot di un controllo e di OCR e incontrato lo stesso problema. Alla fine ho preso l'immagine del controllo, copiato l'immagine in una bitmap più grande e eseguito l'OCR la bitmap più grande.

Un altro problema che ho trovato era che è necessario avere un'estensione corretta per il file di immagine. In altre parole, TMP non è tagliato.

Ho continuato il lavoro di creazione di una fonte più grande all'interno del mio metodo di OCR, che sembra qualcosa di simile (mi occupo direttamente con oggetti Image):

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;
}

Non sono sicuro di quello che la dimensione minima è, ma sembra come se 1024 x 768 fa il trucco.

Altri suggerimenti

sì i messaggi in questa discussione mi ha aiutato gettin farlo funzionare, ecco quello che ho da aggiungere:

stava cercando di scaricare le immagini (quelle di piccole dimensioni), quindi OCR ...

-Quando l'elaborazione delle immagini, sembra che theyr dimensione deve essere potenza di 2! (È stato in grado to OCR immagini: 512x512, 128x128, 256x64 .. altre dimensioni per lo più fallito (come 1103x334))

  • sfondo trasparente anche fatte guai. Ho ottenuto i migliori risultati quando si crea un nuovo tif con powerof2 confine, sfondo bianco, incollare l'immagine scaricata in esso, risparmiare.

  • ridimensionamento dell'immagine non è riuscito per me, dal momento che OCR sta ottenendo risultati errati, specialmente per i caratteri "tedeschi" come "ü"

  • alla fine ho anche usato: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, falso, false);

  • utilizzando modi da Office 2003

saluti

womd

l'OCR modi sta lavorando solo tif con me. cercare di salvare l'immagine in "tif".

scusate il mio cattivo inglese

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

Il che significa che io non voglio di rilevare l'orientamento e non fissare alcuna inclinazione. Ora il comando funziona bene su tutte le immagini, tra cui il tiff 2400x2496.

Ma l'immagine deve essere in .tif.

Spero che questo aiuta persone che affrontano lo stesso problema.

Ho avuto lo stesso problema "OCR problema in esecuzione" con alcune immagini. I ridimensionato l'immagine (nel mio caso del 50%), cioè ridotto la sua dimensione e voilà! funziona!

Ho avuto lo stesso problema durante l'utilizzo del

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

su un file TIFF 2400x2496. Ridimensionamento al 50% (riducendo la dimensione) risolto il problema e il metodo non è stato gettare più l'eccezione, tuttavia, è stato erroneamente riconoscere il testo come rilevamento "relerence" invece di "riferimento" o "712.017" invece di "712.517" . Ho continuato a provare diversi formati di immagine, ma tutti avevano lo stesso problema, fino a quando ho cambiato il comando per

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

il che significava che non voglio di rilevare l'orientamento e non fissare alcuna inclinazione. Ora il comando funziona bene su tutte le immagini, tra cui il tiff 2400x2496.

Spero che questo aiuta persone che affrontano lo stesso problema

quello che ha risolto la mia situazione stava usando un editor di foto (Paint.NET) e utilizzare l'effetto Sharpen al massimo.

Inoltre ho usato: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, falso, false);

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top