Pergunta

Eu estou tentando usar MODI para OCR programa de uma janela. Ele funciona muito bem para as imagens de eu pegar programaticamente usando win32 interoperabilidade assim:

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

Esta imagem é então guardada em um arquivo e percorreu MODI assim:

    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 bem, no entanto, eu não quero OCR toda a imagem, apenas partes dele. Eu tento cortar a imagem de programação como esta:

    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, em seguida, OCRing esta imagem menor, no entanto MODI lança uma exceção; 'OCR em execução de erro', o código de erro é -959967087.

Por que MODI lidar com o bitmap original, mas não a versão menor tirados dela?

Foi útil?

Solução

Parece que a resposta é dando MODI uma tela maior. Eu também estava tentando tirar um screenshot de um controle e OCR-lo e correu para o mesmo problema. No final, eu tomei a imagem do controle, copiou a imagem em um bitmap maior e OCR o bitmap maior.

Outra questão que eu encontrei foi que você deve ter uma extensão adequada para o seu arquivo de imagem. Em outras palavras, .tmp não cortá-la.

Eu mantive o trabalho de criar uma fonte maior dentro do meu método de OCR, que é algo como isto (I lidar diretamente com objetos de imagem):

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

Eu não sei exatamente o que o tamanho mínimo é, mas parece que 1024 x 768 faz o truque.

Outras dicas

sim as publicações neste tópico ajudou-me ficando-lo para o trabalho, aqui o que eu tenho para adicionar:

estava tentando fazer download de imagens (pequenos), em seguida, ocr ...

processamento -quando imagens, parece que theyr tamanho deve ser potência de 2! (Foi capaz de OCR imagens: 512x512, 128x128, 256x64 .. outros tamanhos em sua maioria falharam (como 1103x334))

  • fundo transparente também feitas problemas. Eu tenho os melhores resultados ao criar um novo tif com limite powerof2, fundo branco, colar a imagem baixada para ela, save.

  • dimensionamento da imagem não foi bem sucedida para mim, pois OCR está obtendo resultados errados, especialmente para personagens "alemão", como "ü"

  • na extremidade i também usada: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, falsa, falsas);

  • usando modi do Office 2003

saudações

womd

o ocr modi está a trabalhar apenas tif comigo. tentar salvar imagem em "tif".

Desculpe o meu mau Inglês

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

O que significa que eu não quero isso para detectar a orientação e não corrigir qualquer distorção. Agora, o comando funciona bem em todas as imagens, incluindo a 2400x2496 tiff.

Mas a imagem deve estar em .tif.

Espero que isso ajude a pessoas que enfrentam o mesmo problema.

Eu tive o mesmo problema "OCR em execução problema" com algumas imagens. Eu re-dimensionado a imagem (no meu caso em 50%), ou seja, reduziu seu tamanho e voila! ele funciona!

Eu tive o mesmo problema ao usar o

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

em um arquivo TIFF que foi 2400x2496. O redimensionamento-lo para 50% (reduzindo o tamanho) resolveu o problema e o método não foi jogando excepção mais, no entanto, foi incorrectamente que reconhece o texto como detecção "relerence" em vez de "referência" ou "712017" em vez de "712517" . Eu continuei tentando diferentes tamanhos de imagem, mas todos eles tinham o mesmo problema, até que eu mudei o comando

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

o que significava que eu não quero isso para detectar a orientação e não para corrigir qualquer distorção. Agora, o comando funciona bem em todas as imagens, incluindo a 2400x2496 tiff.

Espero que isso ajude a pessoas que enfrentam o mesmo problema

O que resolvido a minha situação estava usando um editor de foto (Paint.NET) e usar o efeito de nitidez no máximo.

Eu também usei: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, falso, falso);

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top