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?
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);