web-dev-qa-db-fra.com

Position du texte OCR Tesseract

Je travaille sur l'OCR en utilisant tesseract. Je suis capable de faire fonctionner l'application et d'obtenir la sortie. Ici, j'essaie d'extraire des données d'une facture et d'obtenir les données extraites. Mais l'espacement entre les mots en entrée doit être similaire dans le fichier de sortie.Je reçois maintenant chaque mot et coordonnées.Je dois exporter vers un fichier texte en fonction des coordonnées

Échantillon de code:

            using (var engine = new TesseractEngine(Server.MapPath(@"~/tessdata"), "eng", EngineMode.Default))
            {
                engine.DefaultPageSegMode = PageSegMode.AutoOsd;
                // have to load Pix via a bitmap since Pix doesn't support loading a stream.

                using (var image = new System.Drawing.Bitmap(imageFile.PostedFile.InputStream))
                {

                    Bitmap bmp = Resize(image, 1920, 1080);

                    using (var pix = PixConverter.ToPix(image))
                    {
                        using (var page = engine.Process(pix))
                        {
                            using (var iter = page.GetIterator())
                            {
                                iter.Begin();
                                do
                                {
                                    Rect symbolBounds;
                                    string path = Server.MapPath("~/Output/data.txt");
                                    if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out symbolBounds))
                                    {
                                        // do whatever you want with bounding box for the symbol

                                    var curText = iter.GetText(PageIteratorLevel.Word);

                                        //WriteToTextFile(curText, symbolBounds, path);
                                        resultText.InnerText += curText;
                                        // Your code here, 'rect' should containt the location of the text, 'curText' contains the actual text itself
                                    }
                                } while (iter.Next(PageIteratorLevel.Word));
                            }


                            meanConfidenceLabel.InnerText = String.Format("{0:P}", page.GetMeanConfidence());

                        }
                    }
                }
            }

Voici un exemple d'entrée et de sortie montrant le mauvais espacement.

InputOutput

6
ab2015

Vous pouvez parcourir les éléments trouvés dans la page à l'aide de page.GetIterator(). Pour les éléments individuels, vous pouvez obtenir une "boîte englobante", c'est un Tesseract.Rect (structure rectangle) qui contient: X1, Y1, X2, Y2 coordonnées.

Tesseract.PageIteratorLevel myLevel = /*TODO*/;
using (var page = Engine.Process(img))
using (var iter = page.GetIterator())
{
    iter.Begin();
    do
    {
        if (iter.TryGetBoundingBox(myLevel, out var rect))
        {
            var curText = iter.GetText(myLevel);
            // Your code here, 'rect' should containt the location of the text, 'curText' contains the actual text itself
        }
    } while (iter.Next(myLevel));
}

Il n'existe aucun moyen clair d'utiliser les positions dans l'entrée pour espacer le texte dans la sortie. Vous devrez écrire une logique personnalisée pour cela.

Vous pourriez être en mesure d'estimer le nombre d'espaces dont vous avez besoin à gauche de votre texte avec quelque chose comme ceci:

var padLeftSpaces = (int)Math.Round((rect.X1 / inputWidth) * outputWidthSpaces);
4
GWigWam