Question
Je suis en train d'utiliser Modi OCR programme d'une fenêtre. Il fonctionne très bien pour les captures d'écran que je prends à l'aide de programme Interop win32 comme ceci:
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;
}
Cette image est ensuite enregistrée dans un fichier et a couru à travers MODI comme ceci:
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();
}
Cette partie fonctionne très bien, mais je ne veux pas OCR la capture d'écran entier, seulement des parties de celui-ci. J'essaie de recadrer l'image programme comme celui-ci:
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;
}
et puis cette petite après ROC l'image, cependant MODI lance une exception; 'Erreur en cours d'exécution OCR', le code d'erreur est -959967087.
Pourquoi peut MODI gérer le bitmap d'origine, mais pas la version plus petite prise de celle-ci?
La solution
semble que la réponse est à donner MODI une plus grande toile. Je suis également en train de prendre une capture d'écran d'un contrôle et d'OCR et couru dans le même problème. En fin de compte, je pris l'image du contrôle, recopié l'image en bitmap et plus OCRed le bitmap plus.
Une autre question que j'ai trouvé que vous devez avoir une bonne extension pour votre fichier image. En d'autres termes, .tmp ne coupe pas.
Je gardais le travail de créer une plus grande source dans ma méthode OCR, qui ressemble à quelque chose comme ça (je traite directement avec les objets de l'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;
}
Je ne sais pas exactement ce que la taille minimale est, mais il semble que 1024 x 768 le tour est joué.
Autres conseils
oui les messages de ce fil m'a aidé gettin à travailler, voici ce que je dois ajouter:
a été d'essayer de télécharger des images (petits) puis ... ocr
-Lorsque traitement d'images, il semble que la taille theyr doit être une puissance de 2! (A pu ocr images: 512x512, 128x128, 256x64 .. autres tailles pour la plupart ont échoué (comme 1103x334))
-
fond transparent problèmes aussi fait. Je suis les meilleurs résultats lors de la création d'une nouvelle TIF avec limite powerof2, fond blanc, coller l'image téléchargée dans, enregistrez.
-
mise à l'échelle de l'image n'a pas réussi pour moi, car OCR devient mauvais résultats, spécialement pour les caractères "allemand" comme "ü"
-
i à la fin aussi utilisé: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, faux, faux);
-
à l'aide du bureau 2003 modifié
salutations
womd
le RCO modi ne fonctionne que TIF avec moi. essayez d'enregistrer l'image dans "TIF".
désolé mon mauvais anglais
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
Ce qui signifie que je ne veux pas de détecter l'orientation et ne fixer aucune inclinaison. Maintenant, la commande fonctionne très bien sur toutes les images, y compris le fichier TIFF de 2400x2496.
Mais l'image doit être .tif.
Espérons que cela aide à sortir les personnes confrontées au même problème.
J'ai eu le même problème « OCR problème en cours d'exécution » avec quelques images. Je rééchelonné l'image (dans mon cas de 50%), à savoir réduit sa taille et le tour est joué! ça marche!
J'ai eu le même problème en utilisant la balise
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
sur un fichier tiff qui était 2400x2496. Redimensionnement à 50% (réduction de la taille) a résolu le problème et la méthode ne jetais pas l'exception plus, cependant, il a été reconnaissant de manière incorrecte le texte comme la détection « relerence » au lieu de « référence » ou « 712017 » au lieu de « 712517 » . Je continuais à essayer différentes tailles d'image, mais ils ont tous eu le même problème, jusqu'à ce que je l'ai changé la commande
doc.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, false, false);
ce qui signifie que je ne veux pas de détecter l'orientation et ne pas fixer de désalignement. Maintenant, la commande fonctionne très bien sur toutes les images, y compris le fichier TIFF de 2400x2496.
Espérons que cela aide à sortir les personnes confrontées au même problème
ce qui a résolu ma situation utilisait un éditeur de photos (Paint.NET) et utiliser l'effet affûter au maximum.
J'ai aussi utilisé: doc.OCR (MODI.MiLANGUAGES.miLANG_ENGLISH, faux, faux);