web-dev-qa-db-ja.com

Tesseract OCRテキスト位置

私はtesseractを使用してOCRに取り組んでいます。アプリケーションを動作させて出力を取得できます。ここでは、請求書の請求書からデータを抽出し、抽出したデータを取得しようとしています。しかし、入力ファイル内の単語間の間隔は、出力ファイル内で類似している必要があります。各単語と座標を取得しています。座標に従ってテキストファイルにエクスポートする必要があります。

コードサンプル:

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

                        }
                    }
                }
            }

間違った間隔を示す入力と出力の例を次に示します。

InputOutput

6
ab2015

page.GetIterator()を使用して、ページ内で見つかったアイテムをループできます。個々のアイテムについては、「バウンディングボックス」を取得できます。これはTesseract.Rect(四角形の構造体)に含まれるもの:X1Y1X2Y2座標。

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

入力内の位置を使用して出力内のテキストの間隔を空ける明確な方法はありません。そのためのカスタムロジックを記述する必要があります。

次のようなものを使用して、テキストの左側に必要なスペースの数を見積もることができます。

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