Tesseract: C # Tesseract 3.02 Как получить доступ к каждому символу слова из изображения

Созданный на 12 янв. 2014  ·  3Комментарии  ·  Источник: charlesw/tesseract

Привет, я здесь новичок.
Во-первых, мне нужно нарисовать прямоугольник на каждом символе слова из изображения.
в старой версии тессеракта я обнаружил, что мы можем получить доступ к каждому персонажу с помощью

foreach (tessnet2.Character c в word.CharList)
e.Graphics.DrawRectangle ..........

demo

Но теперь я работаю над Winform C # с Tesseract 3.02

TesseractEngine a = новый TesseractEngine (@ "./ tessdata", "eng", EngineMode.TesseractAndCube);
Tesseract.Page page1 = a.Process (изображение);
foreach (....... на странице 1)
{
// рисуем прямоугольник из (ограничивающего прямоугольника каждого символа)
}

Вопрос 1: как получить доступ к каждому символу страницы page1.

Я пробую много методов, таких как PageIteratorLevel, и получаю некоторую часть страницы, такую ​​как первая строка, первое слово или первый блок, но я не могу получить их первый символ.
Что ж, я заметил, что в тексте результата HOCRtext со страницы 1 каждый элемент, такой как слово, строка, блок, имеет значение Bounding box.

Вопрос 2: как получить значение ограничивающего прямоугольника каждого элемента. (Я нашел только 1 метод "TryGetBoundingBox", который возвращает только логическое значение.

Спасибо.

question

Самый полезный комментарий

Ответ для Q1:

Ознакомьтесь с предоставленным образцом консоли, поскольку он дает пример того, как перебирать результаты, однако должно работать что-то вроде следующего:

using (var iter = page.GetIterator()) {
    do {
        do {
            do {
                if (iter.IsAtBeginningOf(PageIteratorLevel.Block)) {
                    // do whatever you need to do when a block (top most level result) is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.Para)) {
                    // do whatever you need to do when a paragraph is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine)) {
                    // do whatever you need to do when a line of text is encountered is encountered.
                }                                               
                if (iter.IsAtBeginningOf(PageIteratorLevel.Word)) {
                    // do whatever you need to do when a word is encountered is encountered.
                }

                // get bounding box for symbol
                Rect symbolBounds;
                if(iter.TryGetBoundingBox(PageIteratorLevel.Symbol, out symbolBounds)) {
                    // do whatever you want with bounding box for the symbol
                }
            } while(iter.Next(PageIteratorLevel.Word, PageIteratorLevel.Block));
        } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));
    } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));
}

Обратите внимание, что общая иерархия результатов выглядит следующим образом:

Блок -> Пара -> Текстовая строка -> Слово -> Символ

Т.е. набор результатов может содержать много блоков, которые, в свою очередь, могут содержать много абзацев и так далее.

Ответ на вопрос 2:

Как указано выше, метод TryGetBoundingBox возвращает границы в параметре out. Как и Dictionary.TryGetValue .

Все 3 Комментарий

Ответ для Q1:

Ознакомьтесь с предоставленным образцом консоли, поскольку он дает пример того, как перебирать результаты, однако должно работать что-то вроде следующего:

using (var iter = page.GetIterator()) {
    do {
        do {
            do {
                if (iter.IsAtBeginningOf(PageIteratorLevel.Block)) {
                    // do whatever you need to do when a block (top most level result) is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.Para)) {
                    // do whatever you need to do when a paragraph is encountered.
                }
                if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine)) {
                    // do whatever you need to do when a line of text is encountered is encountered.
                }                                               
                if (iter.IsAtBeginningOf(PageIteratorLevel.Word)) {
                    // do whatever you need to do when a word is encountered is encountered.
                }

                // get bounding box for symbol
                Rect symbolBounds;
                if(iter.TryGetBoundingBox(PageIteratorLevel.Symbol, out symbolBounds)) {
                    // do whatever you want with bounding box for the symbol
                }
            } while(iter.Next(PageIteratorLevel.Word, PageIteratorLevel.Block));
        } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word));
    } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine));
}

Обратите внимание, что общая иерархия результатов выглядит следующим образом:

Блок -> Пара -> Текстовая строка -> Слово -> Символ

Т.е. набор результатов может содержать много блоков, которые, в свою очередь, могут содержать много абзацев и так далее.

Ответ на вопрос 2:

Как указано выше, метод TryGetBoundingBox возвращает границы в параметре out. Как и Dictionary.TryGetValue .

Привет Чарльз,

Надеюсь, у тебя все хорошо.

Я новичок в этом материале, я могу получить требуемый текст с небольшого изображения или тестового изображения, но не с фактического изображения:

  1. как извлечь номер BIB из фотографии.
    NotWorking

  2. Как распознать область BIB # на всей фотографии.
    H1764

Спасибо.

Используйте opencv, чтобы найти и обрезать область. Есть парень с демонстрациями, написанными на Python, которые не так уж сложно перевести на .net.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги