О программе ABBYY FlexiLayout™ Studio

ABBYY FlexiLayout Studio - это приложение, позволяющее создать формализованное описание (FlexiLayout) структуры документов произвольного формата, так называемых гибких форм. Созданное описание FlexiLayout затем используется приложением обработки форм для потокового ввода документов.

В основе FlexiLayout Studio лежат лидирующие технологии распознавания ABBYY - OCR/ICR/OMR/OBR, использующие принципы распознавания образов живыми существами (IPA технология), что обеспечивает точность обнаружения и распознавания данных.

Особенностью любых гибких форм является отсутствие информации о точном расположении полей на форме, а также разнообразие их оформления. Поэтому для идентификации полей требуется дополнительная информация, например, информация о расположении полей данных относительно друг друга. Технология ABBYY FlexiLayout Studio позволяет описать правила поиска полей данных, а также проверить выполнение этих правил на реальных формах.

ABBYY FlexiLayout Studio позволяет быстро создать надежное описание расположения полей данных для форм практически любой сложности.

Используя ABBYY FlexiLayout Studio совместно с системой ввода форм, в основе которой лежит технология ABBYY FlexiCapture, вы можете автоматизировать процесс ввода гибких форм, таких как накладные, счета, шапки входящих документов и т.п.


Гибкие формы и их обработка

Форма - это документ, состоящий из одной или нескольких страниц и предназначенный для заполнения человеком от руки или любым печатным способом. Для удобства заполнения и обработки на форме размечаются поля для ввода данных, рядом с полями располагаются поясняющие заголовки.

Формы, все бланки которых имеют одинаковое расположение и количество полей, называют жесткими формами. Для обработки жестких форм применяют системы потокового ввода документов, в которых выполняется распознавание данных формы и передача этих данных во внешние приложения (базы данных, системы документооборота, системы архивирования). Распознавание и извлечение данных из форм становится возможным благодаря применению шаблона - описания расположения полей формы с указанием типов данных, содержащихся в полях, и правил проверки результатов распознавания. Данное описание применимо ко всем жестким формам одного типа. Шаблон четко указывает системе потокового ввода форм расположение и тип данных формы, устраняя тем самым необходимость поиска данных и ошибки интерпретации.

Однако, среди множества документов, требующих автоматизированного ввода, имеется большое количество форм, содержащих схожие данные, но имеющих нестрогую структуру организации этих данных внутри формы.

Ярким примером гибких форм являются разнообразные платежные документы. Поля для ввода данных на таких формах явно указаны, но их расположение и размеры обычно не фиксированы. Причем на различных документах возможно различное расположение полей относительно друг друга. Также важной особенностью таких форм является непостоянное количество полей. Например, на части документов может отсутствовать поле для ввода подписи, а на других присутствовать дополнительные элементы оформления, такие как линии, отступы или картинки.

Другой характерный пример гибких форм - это письма, нотариальные документы или регистрационные формы (заявления о приеме в институт и т.п.). Эти формы имеют повторяющуюся или схожую структуру расположения данных, при этом поля на таких формах строго не указаны. Так письма содержат в заголовочной части: имя и адрес отправителя, имя и адрес получателя. Нотариальные документы - некоторые характерные реквизиты, такие как номер и дата заключения договора, фамилии участников договора и т.п.

Из-за того, что наличие и расположение полей на формах заранее неизвестно, становится невозможным создание шаблона. Это приводит к тому, что хотя формы и могут быть распознаны (т.е. переведены в электронный вид, а их текст можно редактировать), автоматически извлечь данные из них невозможно. Система потокового ввода не может самостоятельно найти нужную информацию.

ABBYY FlexiLayout Studio позволяет создать описание структуры документов и задать алгоритм поиска распознаваемых полей гибких форм на основе дополнительной информации, например, о расположении поля относительно других полей или о характере данных, которые могут быть в поле и т.п., а также настроить гибкое описание на реальных изображениях.

Гибкое описание FlexiLayout, созданное в программе ABBYY FlexiLayout Studio, затем передается в систему ввода форм (ABBYY FlexiCapture 10), где на его основе создается шаблон. Технология ABBYY FlexiCapture предоставляет широкие возможности по автоматизированному вводу форм различных видов. Используя эту технологию распознавания форм, вы можете автоматизировать процесс ввода практически любых документов, как стандартных, так и гибких форм.


Создание гибкого описания FlexiLayout

Гибкое описание FlexiLayout - это формализованное описание структуры документа, позволяющее обнаружить на изображении документа объекты, подлежащие распознаванию.

Условия поиска объектов изображения задаются с помощью элементов. Для каждого объекта или группы объектов, которые необходимо найти на изображении, в гибком описании создается элемент, свойства которого полностью описывают тип (текст, картинка или штрих-код) искомого объекта, его характеристики (длина, ширина и т.д.) и область поиска, в которой предположительно находится объект.

Блок гибкого описания указывает положение объектов изображения, из которых необходимо извлечь данные. Цель гибкого описания - нахождение блоков. Координаты блока могут быть заданы с помощью элемента(ов), а также могут быть указаны непосредственно.

Благодаря наглядности и понятности интерфейса программы ABBYY FlexiLayout Studio создание отдельных элементов и блоков FlexiLayout не представляет сложности. Однако, создание гибкого описания, т.е. описание структуры всего документа, включает в себя большой элемент творчества, так как зачастую один и тот же объект изображения может быть найден разными способами, и выбор наиболее надежного и эффективного пути поиска является задачей пользователя.

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

Создание проекта FlexiLayout Studio Проект - это файл, создаваемый программой ABBYY FlexiLayout™ Studio и содержащий всю информацию о гибком описании FlexiLayout. В рамках проекта создаются гибкое описание FlexiLayout и пакет тестовых изображений, в созданное описание FlexiLayout добавляются элементы и блоки. Также проект позволяет отладить, скомпилировать гибкое описание и протестировать его.

Подробнее...

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

Подробнее...

Предраспознавание В процессе предраспознавания изображений программа FlexiLayout Studio выделяет на изображении и классифицирует по типам элементарные объекты изображения, такие, как текст, разделители, метки и т.д. По результатам предварительного распознавания можно судить о том, что же фактически может быть найдено на форме.

Подробнее...

Анализ результатов распознавания

На данном этапе необходимо просмотреть все изображения и выделить наиболее надежные объекты изображения:

  • объекты, расположение которых одинаково на всех формах. Это могут быть логотипы, заголовки и т.п.;
  • объекты надежно распознаваемые и присутствующие на всех изображениях;
  • объекты, мало зависящие от качества печати и сканирования;

При наличие достаточного количества таких однозначно идентифицируемых и уверенно распознаваемых объектов становится возможным описание расположения всех остальных объектов изображения. Здесь же можно выбрать пути поиска того или иного поля данных, т.е. выбрать опорные объекты изображения, относительно которых можно описать положение искомого объекта.

Подробнее...

Создание элементов и блоков FlexiLayout Сначала создаются элементы, описывающие объекты, которые могут быть найдены независимо от наличия или отсутствия других объектов. Например, текст или иной объект, который присутствует на форме только один раз. Затем положение остальных объектов описывается с помощью уже созданных элементов. Так формируется цепочка поиска: от более надежного объекта к менее надежному.

Необходимо создать элемент, соответствующий объекту(ам), отличающим форму данного типа от других форм. Наличие на формах таких объектов позволят создать элементы-идентификаторы, которые исключат возможность наложения на форму неверного шаблона, что сократит время обработки форм и повысит ее качество. Затем можно переходить к созданию остальных элементов.

Вопрос о порядке создания элементов и блоков решается только пользователем. Однако, мы рекомендуем после создания каждого элемента или блока наложить шаблон и убедиться в том, что элемент позволяет найти нужный объект на всех тестовых изображениях.

Обычно бывает удобно разделить форму на некоторые логические части и описать объекты изображения каждой части отдельно. Это облегчит дальнейшую отладку гибкого описания.

Подробнее...

Компиляция гибкого описания В ходе компиляции гибкого описания выполняется проверка созданного описания (блоков и элементов и их свойств). Компиляция позволяет выявить ошибки и противоречия гибкого описания.

Подробнее...

Наложение и отладка гибкого описания Проверка гибкого описания выполняется путем наложения гибкого описания на изображение, при этом важен не только сам факт успешного наложения, но и правильность нахождения объектов изображения. Такую проверку следует выполнять после создания каждого элемента и блока. Поиск ошибок в готовом описании, особенно если описываемый документ имеет сложную структуру и множество полей, представляет собой сложную и трудоемкую задачу.

Подробнее...

Экспорт Готовое гибкое описание FlexiLayout экспортируется в систему потокового ввода форм.

Подробнее...


Новые возможности программы ABBYY FlexiLayout Studio

Новые возможности программы ABBYY FlexiLayout Studio 10 по сравнению с ABBYY FlexiLayout Studio 9.0

Автоматическое обучение гибкого описания на примерах

Гибкое описание может быть создано автоматически на основе разметки полей и статических элементов, указанных на нескольких страницах. Автоматическое создание гибкого описания может применяться в следующих случаях:

  • Создание гибкого описания для документов простой структуры, у которых на разных экземплярах могут меняться расстояния между элементами и значения статических строк, но при этом сохраняется взаимное расположение элементов.
  • Быстрое создание гибкого описания для пилотных и демонстрационных проектов. В случае документов сложной структуры данная технология позволяет быстро создать описание, которое будет успешно накладываться на большой процент нужных полей на тестовых изображениях. Созданное описание можно впоследствии доработать вручную, добавляя элементы для поиска полей, которые определяются недостаточно точно.
  • Самостоятельное обучение пользователей технологии создания гибких описаний. Программа создает пример гибкого описания на основе заданной разметки, что позволяет пользователю быстро овладеть основами создания гибких описаний.

Обучение шаблона гибкого описания
Автоматическая настройка параметров элемента

Обучение параметров может быть выполнено для любого элемента простого (несоставного) типа. Параметры элемента вычисляются на основе эталонной разметки (Reference layout) данного элемента на нескольких страницах. Вы можете сравнить новые значения параметров элемента с предыдущими значениями и указать, какие значения требуется сохранить.
Автоматизированная настройка параметров элемента позволяет значительно сократить трудоемкость создания гибкого описания.

Обучение параметров элемента
Автоматическая настройка отношений элемента

Настройка отношений может быть выполнено для любого элемента простого (несоставного) типа. Программа предлагает выбрать один или несколько элементов, расположенных в дереве элементов выше данного, и автоматически создает отношения на основе положения этих элементов, заданного в эталонной разметке (Reference layout). Вы можете сравнить новые отношения с уже имеющимися отношениями и указать, какие отношения требуется сохранить.
Автоматическая настройка отношений элемента позволяет значительно сократить трудоемкость создания гибкого описания.

Генерация отношений элемента
Автоматическая настройка отступов отношений элемента

Отступы для уже заданных отношений выбранного элемента могут быть вычислены на основе эталонной разметки (Reference layout).
Вы можете сравнить новые значения отступов отношений с предыдущими значениями и указать, какие значения требуется сохранить.

Обучение отступов отношений
Создание отношения элемента визуальными средствами

Создание отношений элементов можно упростить за счет использования визуальных средств. Тип нового отношения можно выбрать по картинке-образцу, а отступы можно настраивать непосредственно на изображении при помощи перемещения границы области поиска.

Визуализация отношений
Визуализация и корректировка отступов отношений на изображении

При выборе отношения на закладке Relations в окне свойств элемента выбранное отношение отображается в окне изображения. При выборе нескольких отношений отображается результирующая область поиска для выбранных отношений.

Визуализация отношений
Element references browser

Element references browser служит для отображения зависимостей между элементами дерева.

Element references browser
Новый элемент

Для поиска первого найденного элемента группы добавлен элемент First Found.

First Found
Изменения элемента Static text

Добавлен новый режим поиска для иероглифических языков.

Static Text
Автоматическое обучение классификатора

Дерево решений в проекте классификатора теперь может быть обучено на наборе страниц, для которых указаны их эталонные классы. Несколько страниц каждого класса включаются в обучающий набор, остальные страницы классов можно использовать для проверки правильности работы обученного классификатора. Обучение автоматического классификатора можно проводить по различным признакам, которые выбираются из списка предустановленных профилей классификации. Вы можете выбрать один из следующих профилей: Raster (fast), Raster, Raster with Text, Raster with Titles, Raster with Titles and Image Objects или Raster with Image Objects. Автоматический классификатор можно использовать как отдельно, так и совместно с деревом решений, построенным на основе Id-элементов, определенных пользователем.

Автоклассификатор
Автоматическая инициализация дерева классов

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

Инициализация дерева классов
Создание классов на основе исходных имен изображений пакета

Для изображений, которые были добавлены в пакет из папок, классы могут быть созданы автоматически на основе имен папок, из которых файлы изображений были загружены в пакет. Таким образом, можно построить систему классов на основе файловой системы хранения изображений.

Создание классов на основе имен исходных папок
Создание классов при загрузке в пакет изображений из папок

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

Создание классов при загрузке изображений из папок
Новый режим распознавания

Новый режим распознавания Balanced является улучшенным быстрым режимом распознавания и позволяет распознавать изображения с более высоким качеством. Может применяться, если требуется осуществлять распознавание с учетом цвета.

Параметры предраспознавания
Лог классификации

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

Корректировка эталона обучения
Язык гибких описаний
  • Добавлены функции преобразования типа данных Real к типу данных Int
  • Добавлены функции доступа к набору записей из базы данных
  • Добавлен метод Keyword элемента Static Text для получения ключевого слова по его индексу в строке
  • Добавлены методы для типа Page, позволяющие вычислить площадь пересечения объектов с заданной областью
Другие улучшения
  • Значительно улучшен графический пользовательский интерфейс
  • Редактор нечетких интервалов стал более удобным и гибким инструментом за счет дополнительных возможностей масштабирования и настройки
  • Ускорена работа с пакетами больших размеров
  • Возможно добавлять в пакет изображений из папок и подпапок
  • Изображения из пакета можно сохранять в графические форматы
  • Добавлена команда быстрого перехода к следующему документу
  • Добавлена команда наложения описания на текущий документ
  • В классификаторе добавлена поддержка китайского, корейского и японского языков распознавания
  • Поддержано распознавание двухмерных штрих-кодов QR Code, Aztec и DataMatrix
  • Для элемента Date название месяца теперь можно указывать также на испанском, итальянском, немецком и французском языках

Новые возможности программы ABBYY FlexiLayout Studio 9.0 по сравнению с ABBYY FlexiLayout Studio 8.0
Варианты гибкого описания

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

Варианты гибкого описания
Классификаторы

FlexiLayout Studio позволяет создавать специальные проекты, предназначенные для идентификации отдельных страниц до наложения гибкого описания. По результатам идентификации, например, может быть выбран вариант гибкого описания, который будет наложен на страницу.

Классификаторы
Недопустимые элементы

Элементы данного типа не могут присутствовать на изображении. Если при построении цепочки гипотез обнаруживается данный элемент, данная цепочка не рассматривается.

Обязательные, необязательные и недопустимые элементы
Новые элементы

Для поиска полей с заголовками создан элемент Labeled Field. Для вычисления регионов вне зависимости от содержащихся в них объектов добавлен элемент Region.

Элемент Labeled Field
Элемент Region
Конвертация элементов

Реализовано преобразование элементов из одного типа в другой.
Элементы

Изменение поиска элемента Paragraph

Доработаны алгоритм и параметры поиска элемента Paragraph.

Элемент Paragraph
Блок Non-Recognized

Для исключения определенной области из распознавания создан блок Non-Recognized.

Блоки
Создание и инициализация параметров элемента по изображению

Теперь можно быстро создавать элементы при просмотре изображения. Параметры создаваемых элементов инициализируются значениями, полученными при предраспознавании. При создании элементов Static Text и Labeled Field найденный текст используется в качестве имени элемента. Жесткость параметров определяется с помощью ползунка.

Создание, копирование и удаление элементов
Определяемые пользователем свойства элементов

Каждый элемент теперь может содержать свой набор дополнительных переменных.

Определяемые пользователем свойства элемента
Язык гибких описаний
  • Возможность управлять сборкой многостраничных документов из языка гибких описаний.
  • Добавлены циклы вида for <var-name> from <from-expr> to <to-expr> [step <step-expr>].
  • Добавлены функции преобразования строки в целое (StrToInt) и вещественное (StrToReal) числа, а также функции проверки безопасности данных преобразований (IsInt и IsReal).
  • Добавлены функции записи в текстовый файл (WriteToFile) и выполнения запроса к базе данных (ExecuteSQL).
  • У гипотезы элемента Paragraph появились методы доступа к прямоугольникам найденных строк, аналогичные методам гипотезы элемента Static Text.
Другие улучшения
  • Хранение и распознавание цветных изображений.
  • Обработка изображений при добавлении в пакет.
  • Импорт гибких описаний из других проектов.
  • Работа без предраспознавания текста (при отсутствии текстовых элементов).
  • В параметры предраспознавания добавлен параметр Pre-recognition area, ограничивающий область предраспознавания. Также добавлена возможность самостоятельно запускать предраспознавание в любом регионе с помощью языка гибких описаний.
  • Возможно копирование с изображения распознанного текста.
  • Возможен поиск текста с учетом регистра.
  • Возможен поиск без учета диакритических символов.
  • Возможно указать тип столбца при создании блока Table.
  • Для наименований элементов, вариантов, блоков и других идентификаторов можно использовать как обычные латинские буквы, так и буквы с диакритическими знаками, а так же русские буквы.
  • Добавлена визуализация отношений: картинки в свойствах элемента для создаваемого или выбранного отношения.
  • Добавлено отображение области поиска элементов в наложенной разметке, в том числе и после закрытия окна гипотез.

Новые возможности программы ABBYY FlexiLayout Studio 8.0 по сравнению с ABBYY FlexiCapture Studio 1.5
Поддержка многостраничных документов

FlexiLayout Studio работает с многостраничными документами и позволяет создавать единое гибкое описание для обработки таких документов. Многостраничные гибкие описания используют маркеры начала и конца документа: новые элементы Header и Footer, для того чтобы идентифицировать документы с переменным, неизвестным заранее, числом страниц. На многостраничных документах поиск нужных полей производится вне зависимости от того, на какой странице эти поля расположены.
Многостраничное гибкое описание

Многостраничные таблицы

Элемент Table может располагаться на нескольких страницах. Число страниц заранее неизвестно и может различаться в разных документах.
Работа с таблицами

Повторяющиеся группы

Новый элемент Repeatable Group позволяет настраивать свойства каждого поля в группе только один раз, а затем указывать возможное количество повторений группы на одной или нескольких страницах. Эта возможность облегчает настройку поиска большого числа единообразных групп полей, например, при анализе распечаток из базы данных, заголовочной и итоговой частей страниц, а также таблиц со сложной структурой.
Repeatable Group (повторяющаяся группа)

Окно многостраничных изображений

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

Улучшение редактирования кода (Advanced-секции)

Код гибкого описания можно редактировать в удобном полноэкранном редакторе, который обладает возможностью подсвечивать разным цветом разные типы лексем, предлагать возможные методы и свойства (подсказка по точке), а также производить поиск и замену любых строк.
Дополнительные условия поиска

Инструмент поиска и замены в коде гибкого описания

Появилась возможность осуществлять поиск и замену в коде для всего гибкого описания.
Дополнительные условия поиска

Автоматическая коррекция ориентации страниц

Добавлена возможность автоматически корректировать ориентацию страниц изображения в пакете.
Работа с изображениями

Инструмент "Циркуль"

Инструмент "Циркуль" позволяет определять координаты элементов и измерять расстояния на изображении, что упрощает создание гибкого описания.
Измерение объектов

Настройка единиц измерения

Пользователь теперь имеет возможность выбирать предпочтительные единицы измерения: миллиметры, сантиметры, дюймы, dots (1/300 дюйма), точки (1/72 дюйма).
Единицы измерения объектов

Удобный инструмент для задания нечеткого интервала

Добавлен удобный и наглядный инструмент, позволяющий легко задать нечеткий интервал с помощью графика и калькулятора штрафующих коэффициентов. При вызове инструмента из диалога свойств элемента Character String полученные нечеткие интервалы автоматически копируются в соответствующие свойства элемента. Эта функция поможет вам и при написании кода на закладке Advanced, если нужно использовать нечеткий интервал, для этого ее можно вызвать из раздела Tools главного меню программы.
Нечеткий интервал

Шифрование гибкого описания FlexiLayout

Экспортируемое гибкое описание (файл *.afl) кодируется для предотвращения несанкционированного использования.

Отображение недостроенных цепочек гипотез для составных элементов

Если цепочка гипотез составного элемента (группы, повторяющейся группы) не достроена, то гипотеза составного элемента отображается красным кружком, дважды щелкнув на который можно просмотреть недостроенную цепочку и обнаружить тот элемент группы, который не был найден.
Дерево гипотез

Другие улучшения
  • Изменение порядка страниц с помощью перетаскивания и перенумерация страниц в окне пакета.
  • Настройка пользовательских цветов для графики и объектов кода.
  • Удобные настройки для регулярного выражения элемента Character String.
  • Настройка и тестирование соединения с базой данных при поиске ключевых слов для элемента Static Text.
  • Настройка отношения Nearest.
  • Тестирование групповых элементов.
  • Добавлен инструмент прокрутки окна изображений.


Установка программы ABBYY FlexiLayout Studio 10

Установка, запуск и удаление программы ABBYY FlexiLayout™ Studio 10

Программа ABBYY FlexiLayout Studio 10 устанавливается и удаляется вместе с программой ABBYY FlexiCapture 10.

Чтобы запустить программу ABBYY FlexiLayout Studio выберите в меню Пуск пункт :

  • Пуск/Программы/ABBYY FlexiCapture 10/Инструменты/ABBYY FlexiCapture 10 - для автономной версии;
  • Пуск/Программы/ABBYY FlexiCapture 10 Stations/Инструменты/ABBYY FlexiCapture 10 - для распределенной версии.

Внимание! Для корректной работы ABBYY FlexiLayout Studio требуется наличие ключа защиты, поэтому перед запуском программы убедитесь, что на Ваш компьютер установлен ключ защиты. В противном случае запуск программы будет невозможен.
Так как в стандартной поставке программа ABBYY FlexiLayout Studio поставляется вместе с программой ABBYY FlexiCapture, то для работы с ABBYY FlexiLayout Studio следует использовать тот же самый ключ, что и для работы с ABBYY FlexiCapture.


Интерфейс программы ABBYY FlexiLayout™ Studio

Программа ABBYY FlexiLayout Studio обладает удобным и наглядным интерфейсом, позволяющим пользователю создавать элементы и блоки гибких описаний FlexiLayout, задавать и изменять их свойства, а также просматривать результаты наложения гибкого описания на изображение для выявления причин, препятствующих нахождению того или иного объекта изображения.

Обратите внимание на то, что расположение элементов главного окна может отличаться от показанного на рисунке. Для изменения положения вспомогательного окна, щелкните по заголовку окна и перетащите его в другое место. Расположение панелей инструментов также может быть иным. Щелкните мышью по началу панели инструментов и перетащите ее в удобное для вас место. Для отображения/скрытия строки состояния выберите View>Status Bar.

Для вызова локальных меню щелкните правой кнопкой мыши на области главного окна.


Окно Batch

Окно Batch содержит таблицу изображений, отобранных для создания и отладки гибкого описания FlexiLayout.

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

При работе с гибким описанием:

  • Used For Training - используется ли страница при обучении;
  • Page No. - номер страницы;
  • Recognized - выполнено ли предраспознавание;
  • Analyzed - наложено ли гибкое описание;
  • Has Reference Blocks - была ли создана эталонная разметка блоков;
  • Matched Document Number - номер документа, к которому отнесена данная страница в процессе наложения FlexiLayout.
  • Matched Sequence Number - номер страницы в документе, который был ей присвоен в процессе наложения FlexiLayout. После номера отображается (H), если на странице был найден элемент Header или (F), если на странице был найден элемент Footer.
  • Reference Document Number - номер документа, к которому должна относиться страница согласно эталонной сборке.
  • Reference Sequence Number - номер страницы в документе, который должен быть присвоен странице согласно эталонной сборке. После номера отображается (H), если на странице должен присутствовать элемент Header или (F), если на странице должен присутствовать элемент Footer.
  • Excess Areas - результаты сравнения наложения гибкого описания и эталонной разметки, показывается суммарная площадь областей блоков, найденных при наложении, но не вошедшие в блоки эталонной разметки, выраженная в процентах по отношению к суммарной площади блоков эталонной разметки;
  • Missing Areas - результаты сравнения наложения гибкого описания и эталонной разметки, показывается суммарная площадь областей блоков эталонной разметки, не вошедших в блоки, полученные при наложении, выраженная в процентах по отношению к суммарной площади блоков эталонной разметки;
  • Matched Alternative - наименование варианта гибкого описания, наложенного на страницу;
  • Reference Alternative - эталонный вариант гибкого описания;
  • Comment - комментарий к данному изображению;
  • Source - путь к исходному файлу изображения.

При работе с классификатором:

  • Used For Training - используется ли страница при обучении;
  • Classification Fidelity - совпадают ли значения классов в столбцах Classification Result и Reference Class;
  • Page No. - номер страницы;
  • Recognized - выполнено ли предраспознавание;
  • Classification Result - результат классификации (текстовая строка); ;
  • Reference Class - эталонный результат классификации;
  • Comment - комментарий к данному изображению;
  • Source - путь к исходному файлу изображения.

Расположение и ширину столбцов таблицы можно изменить с помощью мыши.


Окно FlexiLayout

В окне FlexiLayout отображается древовидная структура гибкого описания. Корневая папка дерева соответствует гибкому описанию в целом. Дерево гибкого описания состоит из следующих ветвей:

  • Blocks, в которой находятся блоки;
  • SearchElements, в которой находятся элементы. Таких ветвей может быть несколько, каждая из них соответствует варианту гибкого описания.

Блоки и элементы могут объединяться в группы, образуя новые уровни вложенности.

Совет. Элементы и блоки гибкого описания можно перемещать ( drag&drop) и копировать (Ctrl+drag&drop) с помощью мыши в пределах соответствующей ветви дерева.


Окно Classification

Окно Classifier

В окне Classifier отображается список созданных классов (группа Classes) и древовидная структура классификатора. Корневая папка дерева соответствует классификатору в целом.

Каждый узел дерева представляет из себя этап классификации. Узел содержит групповой идентифицирующий элемент (с именем по умолчанию Id) и вложенные узлы. Количество уровней вложенности неограниченно.

Совет. Этапы классификации можно перемещать ( drag&drop) и копировать (Ctrl+drag&drop) с помощью мыши.

Подробнее

Классификаторы

Создание классификатора


Окно Properties

Окно Properties предназначено для показа свойств объекта, выбранного в окне Batch, FlexiLayout, Image, Hypotheses.

В нижней части окна Properties дается описание выбранного свойства и его значение.


Окно Image

В окне Image показано изображение, соответствующее странице, выбранной в окне Batch. В заголовке окна указывается номер документа, наименование варианта гибкого описания, номер открытой страницы и режим просмотра. Также указываются признаки Header/Footer, если они присутствуют у данной страницы в выбранном режиме просмотра.
В окне Image возможно три режима просмотра изображения:

  • В режиме Matched layout отображаются результаты наложения гибкого описания. Для перехода в данный режим просмотра изображения щелкните по кнопке [image], расположенной на панели инструментов Layout. С помощью стрелки, расположенной справа от кнопки, можно выбрать отображаемые объекты: блоки, элементы или и то, и другое.
  • В режиме Reference layout можно создавать, редактировать и просматривать эталонную разметку. Для перехода в данный режим просмотра изображения щелкните по кнопке [image], расположенной на панели инструментов Layout.
  • В режиме Difference layout возможен просмотр различий между результатом наложения гибкого описания и эталонной разметкой. Чтобы перейти в режим Difference layout щелкните по кнопке [image], расположенной на панели инструментов Layout.
    Замечание. Просмотр различий между результатом наложения гибкого описания и эталонной разметкой возможен только после создания эталонной разметки.


Окно Hypotheses

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

Данное окно открывается после того, как на изображение наложено гибкое описание (команда Match меню Image), при этом в окне Image должен быть выбран режим просмотра Matched layout (кнопка [image] на панели инструментов).


Окно Classifier log

В окне Classifier log отображается журнал наложения классификатора на страницы. Для каждой страницы указывается последовательность налагаемых классов и результат наложения.

Подробнее

Классификаторы

Создание классификатора


Панель инструментов: Standard

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

Описание кнопок панели инструментов:

Кнопка | Описание
New Project | Открывает диалог Create Project, в котором можно ввести имя нового проекта.
Open Project | Открывает диалог Open Project, в котором можно выбрать файл проекта для работы в ABBYY FlexiLayout™ Studio.
Save Project | Сохраняет текущий проект.
Cut | Удаляет выделение и помещает его в Буфер обмена.
Copy | Копирует выделение (текст в окне Properties, выделенные блоки в окне Image, выделенные в окне Batch страницы или блоки и элементы в окне FlexiLayout) в Буфер обмена.
Paste | Вставляет содержимое Буфера обмена.
Undo | Отменяет действие последней выполненной команды.
Redo | Отменяет действия последней команды Отменить.
Previous Page | Открывает страницу пакета, предшествующую открытой странице.
Next Page | Открывает страницу пакета, следующую за открытой страницей.
Previous Document | Открывает документ пакета, предшествующий открытому документу.
Next Document | Открывает документ пакета, следующий за открытым документом.


Панель инструментов Extracted Objects

Панель инструментов Extracted Objects содержит кнопки, позволяющие отображать/скрывать на изображении объекты, выделенные при предраспознавании.

Описание кнопок панели инструментов:

Кнопка | Описание
Recognized Words | Показывает на изображении объекты, распознанные программой как слова.
Recognized Lines | Показывает на изображении объекты, распознанные программой как строки текста.
Separators | Показывает на изображении объекты, распознанные программой как разделители.
Barcodes | Показывает на изображении объекты, распознанные программой как штрих-коды.
Raw Objects | Показывает на изображении все объекты, распознанные программой при предраспознавании.


Панель инструментов Block-Drawing Tools

Панель инструментов Block-Drawing Tools содержит кнопки, позволяющие создавать и редактировать эталонную разметку.

Описание кнопок панели инструментов:

Кнопка

Описание

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

Совет. Иногда, из-за маленьких размеров блока, переместить его не получается, т.к. при наведении курсора активируется режим изменения размеров из-за того, что границы слишком близко друг к другу. Чтобы переключиться на перемещение принудительно нужно нажать клавишу Ctrl.

Замечание. Команда доступна только в режиме Reference layout.

Measure Rectangle Позволяет определить координаты и размеры объектов на изображении и скопировать координаты в буфер обмена.

Чтобы измерить какой-либо объект на изображении, откройте инструмент Measure Tool и выделите мышью измеряемый прямоугольник: щелкните в одном из углов прямоугольника, переместите курсор мыши по диагонали в противоположный угол и отпустите кнопу мыши. В диалоге Measure Tool будут отображаться координаты, ширина и высота измеряемого прямоугольника. Величины измеряются в используемых в данный момент единицах измерения.

Если отмечена опция Automatically copy results to Clipboard, то координаты прямоугольника будут скопированы в буфер обмена и их можно сразу же использовать, например, для задания области поиска на закладке Search Constraints диалога свойств любого элемента.

Scroll Tool | Позволяет прокручивать изображения в окне Image.
Create New Block/Element | Создает новый блок или элемент и указывает его настройки на основании распознанного изображения.
Draw Location Позволяет выделить на изображении область, соответствующую выбранному блоку или элементу.
Замечание. Команда доступна только в режиме Reference layout.
Add Block Part Позволят добавить прямоугольную часть к выбранной области.
Замечание. Команда доступна только в режиме Reference layout.
Cut Block Part Позволяет удалить прямоугольную часть выделенной области.
Замечание. Команда доступна только в режиме Reference layout.
Delete Block Позволяет удалить блок или элемент с изображения.
Замечание. Команда доступна только в режиме Reference layout.
Add Vertical Separator Позволят добавить вертикальный разделитель к выбранному табличному блоку.
Замечание. Команда доступна только в режиме Reference layout.
Add Horizontal Separator Позволят добавить горизонтальный разделитель к выбранному табличному блоку.
Замечание. Команда доступна только в режиме Reference layout.
Delete Separator Позволяет удалить разделитель с изображения.
Замечание. Команда доступна только в режиме Reference layout.


Панель инструментов Layout

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

Описание кнопок панели инструментов:

Кнопка | Описание
Matched layout | Позволяет просматривать изображение в режиме Matched layout. Стрелка справа от кнопки позволяет выбрать отображаемые объекты - блоки, элементы или и то, и другое.
Reference layout | Позволяет просматривать изображение в режиме Reference layout.
Difference layout | Позволяет просматривать изображение в режиме Difference layout.


Панель инструментов Image Tools

Панель инструментов Image Tools содержит кнопки, позволяющие повернуть и инвертировать изображение, а также изменить масштаб изображения.

Описание кнопок панели инструментов:

Кнопка | Описание
Rotate Clockwise | Позволяет повернуть изображение на 90° по часовой стрелке.
Rotate Counter-Clockwise | Позволяет повернуть изображение на 90° против часовой стрелки.
Rotate Upside Down | Позволяет повернуть изображение на 180°.
Correct Page Orientation | Позволяет автоматически исправить ориентацию страниц. Автоматический подбор ориентации производится на основе выбранного языка предраспознавания и согласно настройкам, заданным в диалоге Options (меню Tools>Options).
Invert | Позволяет инвертировать изображение (заменить белые точки - черными и наоборот).
Despeckle | Позволяет удалить отдельно стоящие точки (мусор) на изображении.
Zoom In | Позволяет увеличить изображение в 2 раза.
Zoom Out | Позволяет уменьшить изображение в 2 раза.
Масштаб | Позволяет выбрать подходящий масштаб изображения.

Замечание. При операциях над изображением результаты предраспознавания и наложения FlexiLayout удаляются. При поворотах и зеркальных отражениях удаляется также и эталонная разметка (Reference Layout).


Строка состояния

В строке состояние отображаются результаты выполнения операций и подсказки. Также отображается имя выбранного объекта. В поле Координаты отображаются координаты объекта, выбранного на изображении.


Команды меню

  • Меню File
  • Меню Edit
  • Меню View
  • Меню Batch
  • Меню Image
  • Меню FlexiLayout / Classifier
  • Меню Training
  • Меню Tools
  • Меню Help
  • Локальное меню пакета изображений
  • Локальное меню FlexiLayout
  • Локальное меню блока
  • Локальное меню элемента
  • Локальное меню изображения
  • Локальное меню гипотезы


Меню File

Пункт меню | Описание
New Project | Открывает диалог Create New Project…, в котором можно ввести имя нового проекта гибкого описания или классификатора и указать его распололожение.
Open Project… | Открывает диалог Open Project, в котором можно выбрать файл проекта для работы в ABBYY FlexiLayout™ Studio.
Close Project | Закрывает текущий проект.
Add Images… | Открывает диалог Open Images, в котором можно выбрать одно или несколько изображений для добавления в пакет.
Add Images from Folder… | Открывает диалог Add Images from Folder…, в котором можно выбрать папку, из которой будут загружены изображения.
Save | Сохраняет текущий проект.
Save Copy… | Открывает диалог Save Copy, в котором можно сохранить текущий проект с новым именем.
Export… | Открывает диалог Export FlexiLayout для проекта гибкого описания или Export Classifier для проекта классификатора, в котором можно указать имя файла экспорта. Для проекта гибкого описания файл экспортируется в формате *.afl, для проекта классификатора файл экспорта имеет формат *.cfl.
Project Properties… | Открывает диалог Properties, в котором можно просмотреть свойства проекта.
Recent Projects | Отображает список проектов, открытых последними.
Exit | Закрывает программу.


Меню Edit

Пункт меню | Описание
Undo | Отменяет действие последней выполненной команды.
Redo | Отменяет действия последней команды Undo.
Cut | Удаляет выделение и помещает его в Буфер обмена.
Copy | Копирует выделение (текст в окне Properties, выделенные блоки в окне Image, выделенные в окне Batch страницы или блоки и элементы в окне FlexiLayout) в Буфер обмена.
Paste | Вставляет содержимое Буфера обмена.
Delete | Удаляет выделение.
Select All | Выделяет все страницы в окне Batch или все объекты (блоки и элементы) на изображении.


Меню View

Пункт меню | Описание
Batch | Позволяет перейти в окно Batch.
Training | Позволяет перейти в окно Training.
Classifier | Позволяет перейти в окно Classifier.
Properties | Позволяет перейти в окно Properties.
Image | Позволяет перейти в окно Image.
Hypotheses | Позволяет перейти в окно Hypotheses. Замечание. Данное окно открывается после наложения гибкого описания на изображение (команда Match меню Image), если для изображения выбран режим просмотра Matched Layout (кнопка [image] на панели инструментов).
Status Bar | Позволяет отобразить/скрыть строку состояния в главном окне программы.
Classifier Log | Позволяет перейти в окно Classifier log.


Меню Batch

Пункт меню | Описание
Match | Накладывает гибкое описание на выделенные в пакете страницы.
Set Reference FlexiLayout Alternative | Устанавливает эталонную разметку для выбранных страниц.
Classify | Осуществляет классификацию выделенных страниц. Пункт меню доступен только при работе с проектом-классификатором.
Set Reference Class | Устанавливает эталонный класс для выделенных страниц. Пункт меню доступен только при работе с проектом-классификатором.
Use for Training Selected Pages | Создает обучающий набор из выделенных страниц.
Add Selected Pages to Training Set | Добавляет выделенные страницы к обучающему набору.
Remove Selected Pages from Training Set | Удаляет выделенные страницы из обучающего набора.
Pre-Recognize | Позволяет провести предраспознавание выделенных в списке страниц.
Copy Matched Layout to Reference | Для проекта гибкого описания - позволяет создать эталонную разметку на изображении на основе результатов наложения гибкого описания. Замечание. Команда доступна только для изображений, на которые наложено гибкое описание. Для проекта классификатора - копирует результат классификации в свойства страницы.
Assemble to Reference Documents… | Позволяет задать параметры эталонной сборки в диалоге Assemble to Reference Documents и осуществить эталонную сборку выделенных документов.
Disassemble Reference Documents | Позволяет отменить эталонную сборку для выделенных документов.
Change Reference Header/Footer… | Открывает диалог Change Header/Footer, который позволяет задать, будет ли совпадать заголовок/итоговая часть с первой/последней страницей выделенных документов.
Delete Pages | Удаляет выделенные страницы из пакета.
Delete Page Data… | Открывает диалог Select Data to Delete, в котором можно выбрать какие данные о странице удалить.
Correct Orientation | Позволяет исправить ориентацию страниц пакета. Автоматический подбор ориентации производится на основе выбранного языка предраспознавания и согласно настройкам, заданным в диалоге Options (меню Tools>Options…).


Меню Image

Пункт меню |  | Описание
Match |  | Накладывает гибкое описание на текущую страницу
Next Page |  | Открывает страницу пакета, следующую за открытой страницей.
Previous Page |  | Открывает страницу пакета, предшествующую открытой странице.
Go to Page… |  | Открывает диалог Go to Page, в котором можно указать номер страницы.
Image Window Scale | 200% | Позволяет установить масштаб 200% в окне Image.
 | 100% | Позволяет установить масштаб 100% в окне Image.
 | 50% | Позволяет установить масштаб 50% в окне Image.
 | 25% | Позволяет установить масштаб 25% в окне Image.
 | Fit to Width | Позволяет установить в окне Image такой масштаб, при котором изображение умещается на экране по ширине.
 | Fit to Height | Позволяет установить в окне Image такой масштаб, при котором изображение умещается на экране по высоте.
 | Best Fit | Позволяет установить в окне Image такой масштаб, при котором изображение умещается на экране по ширине и высоте.
 | Zoom In | Позволяет увеличить изображение на 25%.
 | Zoom Out | Позволяет уменьшить изображение на 25%.
Show Image Objects | Show All Objects | Отображает на открытой странице все объекты, выделенные при предраспознавании.
 | Hide All Objects | Скрывает на открытой странице все объекты, выделенные при предраспознавании.
 | Recognized Words | Показывает на изображении объекты, распознанные программой как слова.
 | Recognized Lines | Показывает на изображении объекты, распознанные программой как строки текста.
 | Separator | Показывает на изображении объекты, распознанные программой как разделители.
 | Raw Objects | Показывает на изображении объекты, распознанные программой при предраспознавании.
 | Barcodes | Показывает на изображении объекты, распознанные программой как штрих-коды.
 | Замечание. Для выбора объектов нескольких типов удерживайте клавишу Ctrl при нажатии кнопок панели инструментов или выбора пункта меню.
Select Tool | Select | Позволяет выбрать на изображении существующий блок.
 | Measure Rectangle | Позволяет определить координаты и размеры объектов на изображении и скопировать координаты в буфер обмена.
 | Create Block | Позволяет создать на изображении новый блок. Замечание. Команда доступна только в режиме Reference layout.
 | Add Block Part | Позволят добавить прямоугольник к выбранному блоку. Замечание. Команда доступна только в режиме Reference layout.
 | Cut Block Part | Позволяет удалить часть выделенного блока. Замечание. Команда доступна только в режиме Reference layout.
 | Delete Block | Позволяет удалить блок с изображения. Замечание. Команда доступна только в режиме Reference layout.
 | Add Vertical Separator | Позволят добавить вертикальный разделитель к выбранному табличному блоку. Замечание. Команда доступна только в режиме Reference layout.
 | Add Horizontal Separator | Позволят добавить горизонтальный разделитель к выбранному табличному блоку. Замечание. Команда доступна только в режиме Reference layout.
 | Delete Separator | Позволят удалить разделитель из выбранного табличного блока. Замечание. Команда доступна только в режиме Reference layout.
Image Operations | Rotate Clockwise | Позволяет повернуть изображение на 90° по часовой стрелке.
 | Rotate Counter Clockwise | Позволяет повернуть изображение на 90° против часовой стрелки.
 | Rotate Upside Down | Позволяет повернуть изображение на 180°.
 | Flip Horizontally | Позволят получить зеркальное отражение изображения относительно горизонтальной прямой.
 | Flip Vertically | Позволяет получить зеркальное отражение изображения относительно вертикальной прямой.
 | Invert | Позволяет инвертировать изображение (заменить белые точки - черными и наоборот).
 | Despeckle | Позволяет удалить отдельно стоящие точки (мусор) на изображении.
Pre-Recognize |  | Позволяет провести предраспознавание выделенных в списке страниц.
Copy Matched Layout to Reference |  | Позволяет создать эталонную разметку на изображении на основе результатов наложения гибкого описания. Замечание. Команда доступна только для изображений, на которые наложено гибкое описание.
Hide Active Blocks or Elements |  | Позволяет скрывать на изображении выделенные блоки или элементы, что позволяет просматривать изображения, на которых одновременно выделены объекты изображения и отмечены регионы элементов и блоков. Временно скрыв выделенный элемент, можно увидеть объект изображения, находящийся под элементом.
Page Properties… |  | Открывает диалог свойств открытой страницы, в котором на закладке Image можно посмотреть полную информацию об изображении страницы (ее размере, разрешении, цвете), а на закладке Page можно посмотреть информацию об открытой странице пакета: номере страницы, исходном изображении, результатах наложения гибкого описания на открытую страницу.


Меню FlexiLayout

Меню FlexiLayout / Classifier

Пункт меню |  | Описание
Add Feature |  | Открывает диалог Add Feature, где можно указать свойства нового признака.
Import ID… |  | Позволяет выбрать проект, заголовок которого требуется импортировать.
Add Block | Text | Создает новый блок Text на ветке блоков дерева FlexiLayout.
 | Table | Создает новый блок Table на ветке блоков дерева FlexiLayout.
 | Barcode | Создает новый блок Barcode на ветке блоков дерева FlexiLayout.
 | Checkmark | Создает новый блок Checkmark на ветке блоков дерева FlexiLayout.
 | Checkmark Group | Создает новый блок Checkmark Group на ветке блоков дерева FlexiLayout.
 | Picture | Создает новый блок Picture на ветке блоков дерева FlexiLayout.
 | Non-Recognized | Cоздает новый блок Non-recognized на ветке блоков дерева FlexiLayout.
 | Group | Создает новый блок Group на ветке блоков дерева FlexiLayout.
 | Repeating Group | Создает новый блок Repeating Group на ветке блоков дерева FlexiLayout.
Add Element | Header | Позволяет добавить в гибкое описание элемент Header, служащий признаком начала нового документа.
 | Footer | Позволяет добавить в гибкое описание элемент Footer, служащий признаком конца документа.
 | Group | Создает составной элемент на ветке элементов дерева FlexiLayout.
 | Static Text | Создает новый элемент Static Text на ветке элементов дерева FlexiLayout.
 | Labeled Field | Создает новый элемент Labeled Field на ветке элементов дерева FlexiLayout.
 | First Found | Создает новый элемент First Found на ветке элементов дерева FlexiLayout.
 | Character String | Создает новый элемент Character String на ветке элементов дерева FlexiLayout.
 | Paragraph | Создает новый элемент Paragraph на ветке элементов дерева FlexiLayout.
 | Date | Создает новый элемент Date на ветке элементов дерева FlexiLayout.
 | Currency | Создает новый элемент Currency на ветке элементов дерева FlexiLayout.
 | Phone | Создает новый элемент Phone на ветке элементов дерева FlexiLayout.
 | Separator | Создает новый элемент Separator на ветке элементов дерева FlexiLayout.
 | Barcode | Создает новый элемент Barcode на ветке элементов дерева FlexiLayout.
 | Object Collection | Создает новый элемент Object Collection на ветке элементов дерева FlexiLayout.
 | White Gap | Создает новый элемент White Gap на ветке элементов дерева FlexiLayout.
 | Region | Создает новый элемент Region на ветке элементов дерева FlexiLayout.
 | Table | Создает новый элемент Table на ветке элементов дерева FlexiLayout.
 | Repeating Group | Создает новый элемент Repeating Group на ветке элементов дерева FlexiLayout.
Convert Element to | Header | Превращает элемент в Header.
 | Footer | Превращает элемент в Footer.
 | Group | Превращает элемент в составной элемент.
 | First Found | Превращает элемент в элемент типа First Found.
 | Static Text | Превращает элемент в новый элемент типа Static Text.
 | Labeled Field | Превращает элемент в Labeled Field.
 | Character String | Превращает элемент в Character String.
 | Paragraph | Превращает элемент в Paragraph.
 | Date | Превращает элемент в Date.
 | Currency | Превращает элемент в Currency.
 | Phone | Превращает элемент в Phone.
 | Separator | Превращает элемент в Separator.
 | Barcode | Превращает элемент в Barcode.
 | Object Collection | Превращает элемент в Object Collection.
 | White Gap | Превращает элемент в White Gap.
 | Region | Превращает элемент в Region.
 | Table | Превращает элемент в Table.
Disable |  | Позволяет исключить из гибкого описания (сделать временно недоступным) выделенный объект (элемент или блок). Замечание. Если в дереве проекта присутствуют элементы и/или блоки, в которых есть ссылки на недоступные элементы, их либо тоже надо сделать недоступными, либо удалить в них ссылки на недоступные элементы. Наличие ссылок на недоступные элементы не позволит скомпилировать гибкое описание, такое описание невозможно наложить на изображение.
Train Element Parameters |  | Открывает диалог Element Parameters Selection, где вы можете сравнить новые значения параметров элемента с их предыдущими значениями.
Test Element |  | Позволяет осуществить тестирование выделенного элемента.
Import Alternative Elements… |  | Импорт гибкого описания из проекта FlexiLayoutStudio.
Build |  | Позволяет скомпилировать гибкое описание.
Save |  | Позволяет сохранить гибкое описание.
Properties… |  | Открывает диалог Properties of FlexiLayout, в котором можно посмотреть свойства гибкого описания.


Меню Training

Пункт меню | Описание
Training Mode | Позволяет перейти в режим обучения. При этом закладка FlexiLayout заменяется на закладку Training
Add Field | Добавляет новое поле в список полей на закладке Training.
Add AnchorText | Добавляет элемент Anchor Text в список элементов на закладке Training.
Add Separator | Добавляет элемент разделитель в список элементов на закладке Training.
Add Barcode | Добавляет элемент штрих-код в список элементов на закладке Training.
Show Dialog | Открывает диалог Training, который позволяет перемещаться по страницам в соответствии с настройками, указанными в диалоге Tools > Options…, и отмечать отсутствующие элементы.


Меню Tools

Пункт меню | Описание
Find in Advanced Code… | Позволяет осуществлять поиск и замену строк по всему коду на всех закладках Advanced.
Fuzzy Interval Editor… | Открывает редактор нечеткого интервала.
Options… | Открывает диалог Options…, в котором можно задать единицы измерения, используемые в программе, цвета объектов в программе и подсветки лексем в коде, возможную ориентацию страниц в пакете, параметры обучения шаблона гибкого описания и некоторые другие настройки.


Меню Help

Пункт меню | Описание
Help Topics | Открывает файл справки.
Tutorial | Открывает раздел справки "Обучение на примерах".
Send Feedback… | Открывает страницу Send your feedback на web-сайте компании ABBYY.
About | Открывает диалог, в котором содержится краткая информация о программе ABBYY FlexiLayout Studio.


Локальное меню пакета изображений

Данное локальное меню открывается при щелчке правой кнопкой мыши в окне Batch.
Пункт меню | Описание
Match | Накладывает гибкое описание на выделенные страницы.
Classify | Осуществляет классификацию выделенных страниц. Пункт меню доступен только при работе с проектом-классификатором.
Train Auto-Classifier on Training Set | Осуществляет обучение автоклассификатора на страницах, выбранных для обучения. Пункт меню доступен только при работе с проектом-классификатором.
Set Reference Class | Устанавливает эталонный класс для выделенных страниц. Пункт меню доступен только при работе с проектом-классификатором.
Create Class by Source Folder | Определяет эталонные классы для выделенных страниц на основе имен исходных папок. Пункт меню доступен только при работе с проектом-классификатором.
Match Selected Alternative | Осуществляет наложение текущего варианта гибкого описания.
Set Reference FlexiLayout Alternative | Устанавливает выбранный вариант гибкого описания для выделенных страниц.
Use for Training Selected Pages | Создает обучающий набор из выделенных страниц.
Add Selected Pages to Training Set | Добавляет выделенные страницы к обучающему набору.
Remove Selected Pages from Training Set | Удаляет выделенные страницы из обучающего набора.
Export Images to Files… | Открывает диалог Export Images to Folder…, в котором можно указать настройки сохранения выбранных изображений.
Pre-Recognize | Позволяет провести предраспознавание выделенных страниц.
Copy Matched Layout to Reference | Позволяет создать эталонную разметку на изображении на основе результатов наложения гибкого описания. Замечание. Команда доступна только для изображений, на которые наложено гибкое описание.
Assemble to Reference Documents… | Позволяет задать параметры эталонной сборки в диалоге Assemble to Reference Documents и осуществить эталонную сборку выделенных документов.
Disassemble Reference Documents | Позволяет отменить эталонную сборку для выделенных документов.
Change Reference Header/Footer… | Открывает диалог Change Header/Footer, который позволяет задать, будет ли совпадать заголовок/итоговая часть с первой/последней страницей выделенных документов.
Delete Pages | Удаляет выделенные страницы из пакета.
Delete Page Data… | Открывает диалог Select Data to Delete, в котором можно выбрать какие данные о странице удалить.
Correct Orientation | Позволяет автоматически исправить ориентацию страниц. Автоматический подбор ориентации производится на основе выбранного языка предраспознавания и согласно настройкам, заданным в диалоге Options (меню Tools>Options…).
Test Header | Позволяет осуществить тестирование заголовочной части документа.
Test Footer | Позволяет осуществить тестирование итоговой части документа.
Properties… | Открывает диалог Properties, в котором можно просмотреть свойства выделенной страницы.


Локальное меню FlexiLayout

Данное локальное меню открывается при щелчке правой кнопкой мыши в окне FlexiLayout.
Пункт меню | Описание
Build FlexiLayout | Позволяет скомпилировать гибкое описание.
Save FlexiLayout | Сохраняет изменения в гибком описании.
Add FlexiLayout Alternative | Добавляет вариант гибкого описания.
Import FlexiLayout Alternatives… | Открывает диалог выбора проекта, из которого будут импортированы варианты гибкого описания.
Select Alternative Layout | Позволяет выбрать одно из гибких описаний в качестве текущего.
Properties… | Открывает диалог Properties, в котором можно посмотреть свойства гибкого описания.


Локальное меню блока

Данное локальное меню открывается при щелчке правой кнопкой мыши по блоку в дереве FlexiLayout.
Пункт меню |  | Описание
Add block | Text | Создает новый блок типа Text.
 | Table | Создает новый блок типа Table.
 | Barcode | Создает новый блок типа Barcode.
 | Checkmark | Создает новый блок типа Checkmark.
 | Checkmark Group | Создает новый блок типа Checkmark Group.
 | Picture | Создает новый блок типа Picture.
 | Non-Recognized | Создает новый блок типа Non-recognized.
 | Group | Создает новый блок типа Group.
 | Repeating Group | Создает новый блок типа Repeating group.
Cut |  | Перемещает блок в буфер для последующей вставки.
Copy |  | Копирует блок в буфер.
Paste |  | Вставляет блок из буфера в вариант гибкого описания.
Delete |  | Удаляет выбранный блок.
Disable |  | Позволяет сделать блок недоступным.
Build FlexiLayout |  | Позволяет скомпилировать гибкое описание.
Save FlexiLayout |  | Сохраняет изменения, внесенные в гибкое описание. Замечание. При компиляции изменения, внесенные в гибкое описание, сохраняются автоматически.
Properties… |  | Открывает диалог Properties, в котором можно посмотреть свойства выбранного блока.


Локальное меню элемента

Данное локальное меню открывается при щелчке правой кнопкой мыши по элементу в дереве FlexiLayout.
Пункт меню |  | Описание
Add Element | Header | Позволяет добавить в гибкое описание элемент Header, служащий признаком начала нового документа.
 | Footer | Позволяет добавить в гибкое описание элемент Footer, служащий признаком конца документа.
 | Group | Создает составной элемент.
 | Static Text | Создает новый элемент типа Static Text.
 | Labeled Field | Создает новый элемент Labeled Field на ветке элементов дерева FlexiLayout.
 | First Found | Создает новый элемент First Found на ветке элементов дерева FlexiLayout.
 | Character String | Создает новый элемент типа Character String.
 | Paragraph | Создает новый элемент типа Paragraph.
 | Date | Создает новый элемент типа Date.
 | Currency | Создает новый элемент Currency на ветке элементов дерева FlexiLayout.
 | Phone | Создает новый элемент Phone на ветке элементов дерева FlexiLayout.
 | Separator | Создает новый элемент типа Separator.
 | Barcode | Создает новый элемент типа Barcode.
 | Object Collection | Создает новый элемент типа Object Collection.
 | White Gap | Создает новый элемент типа White Gap.
 | Region | Создает новый элемент Region на ветке элементов дерева FlexiLayout.
 | Table | Создает новый элемент Table на ветке элементов дерева FlexiLayout.
Repeating Group | Создает новый элемент Repeating Group на ветке элементов дерева FlexiLayout.
Convert Element to | Header | Превращает элемент в Header.
 | Footer | Превращает элемент в Footer.
 | Group | Превращает элемент всоставной элемент.
 | Static Text | Превращает элемент вновый элемент типа Static Text.
 | Labeled Field | Превращает элемент в Labeled Field.
 | First Found | Превращает элемент в First Found.
 | Character String | Превращает элемент в Character String.
 | Paragraph | Превращает элемент в Paragraph.
 | Date | Превращает элемент в Date.
 | Currency | Превращает элемент в Currency.
 | Phone | Превращает элемент в Phone.
 | Separator | Превращает элемент в Separator.
 | Barcode | Превращает элемент в Barcode.
 | Object Collection | Превращает элемент в Object Collection.
 | White Gap | Превращает элемент в White Gap.
 | Region | Превращает элемент в Region.
Table | Превращает элемент в Table.
Cut |  | Перемещает элемент в буфер для последующей вставки.
Copy |  | Копирует элемент в буфер.
Paste |  | Вставляет элемент из буфера в вариант гибкого описания.
Delete |  | Удаляет выбранный элемент.
Disable |  | Позволяет сделать элемент недоступным.
Test Element |  | Позволяет осуществить тестирование выделенного элемента.
Match Selected Alternative |  | Осуществляет наложение выбранного варианта гибкого описания.
Pin FlexiLayout Alternative |  | Текущее описание становится выбранным.
Import Alternative Elements… |  | Импорт гибкого описания из проекта FlexiLayoutStudio.
Find in Code |  | Позволяет осуществлять поиск и замену строк по коду на закладках Advanced для выбранного элемента и его подэлементов.
Build |  | Позволяет скомпилировать гибкое описание.
Save |  | Сохраняет изменения, внесенные в гибкое описание.
Properties… |  | Открывает диалог Properties, в котором можно просмотреть свойства выбранного элемента.


Локальное меню изображения

Данное локальное меню открывается при щелчке правой кнопкой мыши по окну Image.
Пункт меню |  | Описание
Match |  | Накладывает гибкое описание на открытое изображение, результаты наложения описания отображаются в окне Image в виде найденных регионов элементов и блоков, а также в окне Hypotheses в виде гипотез, построенных для элементов.
Classify |  | Осуществляет классификацию открытого изображения. Доступно только при работе с проектом-классификатором.
Go to Page… |  | Позволяет осуществить переход на страницу с указанным номером.
Pre-Recognize |  | Позволяет провести предраспознавание выделенных в списке страниц.
Copy Matched Layout to Reference |  | Позволяет создать эталонную разметку на изображении, на основе результатов наложения гибкого описания. Замечание. Команда доступна только для изображений, на которые наложено описание.
Correct Orientation |  | Позволяет автоматически исправить ориентацию страниц. Автоматический подбор ориентации производится на основе выбранного языка предраспознавания и согласно настройкам, заданным в диалоге Options (меню Tools>Options…).
Test Element |  | Позволяет осуществить тестирование выделенного элемента.
Match Selected Alternative |  | Осуществляет наложение текущего варианта гибкого описания.
Hide Active Blocks or Elements |  | Скрывает выбранные на изображении блоки или элементы.
Scale | 200% | Позволяет установить масштаб 200% в окне Image.
 | 100% | Позволяет установить масштаб 100% в окне Image.
 | 50% | Позволяет установить масштаб 50% в окне Image.
 | 25% | Позволяет установить масштаб 25% в окне Image.
 | Fit Width | Позволяет установить в окне Image такой масштаб, при котором изображение умещается на экране по ширине.
 | Fit Height | Позволяет установить в окне Image такой масштаб, при котором изображение умещается на экране по высоте.
 | Fit Page | Позволяет установить в окне Image такой масштаб, при котором изображение умещается на экране по ширине и высоте.
 | Zoom In | Позволяет увеличить изображение на 25%.
 | Zoom Out | Позволяет уменьшить изображение на 25%.
Show Image Objects | Show All Objects | Отображает на открытой странице все объекты, выделенные при предраспознавании.
 | Hide All Objects | Скрывает на открытой странице все объекты, выделенные при предраспознавании.
 | Recognized Words | Показывает на изображении объекты, распознанные программой как слова.
 | Recognized Lines | Показывает на изображении объекты, распознанные программой как строки текста.
 | Separators | Показывает на изображении объекты, распознанные программой как разделители.
 | Raw Objects | Показывает на изображении все объекты, распознанные программой при предраспознавании.
 | Barcodes | Показывает на изображении объекты, распознанные программой как штрих-коды.
 | Замечание. Для выбора объектов нескольких типов удерживайте клавишу Ctrl при нажатии кнопок панели инструментов или выбора пункта меню.
Image Operations | Rotate Clockwise | Позволяет повернуть изображение на 90° по часовой стрелке.
 | Rotate Counter Clockwise | Позволяет повернуть изображение на 90° против часовой стрелки.
 | Rotate Upside Down | Позволяет повернуть изображение на 180°.
 | Flip Horizontally | Позволят получить зеркальное отражение изображения относительно горизонтальной прямой.
 | Flip Vertically | Позволяет получить зеркальное отражение изображения относительно вертикальной прямой.
 | Invert | Позволяет инвертировать изображение (заменить белые точки - черными и наоборот).
 | Despeckle | Позволяет удалить отдельно стоящие точки (мусор) на изображении.
Tool | Select | Позволяет выбрать на изображении существующий блок.
 | Measure Rectangle | Позволяет определить координаты и размеры объектов на изображении и скопировать координаты в буфер обмена.
 | Draw Location | Позволяет создать на изображении новый блок. Замечание. Команда доступна в режиме Reference layout.
 | Draw Location | Позволяет выделить на изображении область, соответствующую выбранному блоку или элементу. Замечание. Команда доступна в режиме Reference layout.
 | Add Box Part | Позволяет добавить часть к выделенному блоку. Замечание. Команда доступна в режиме Reference layout.
 | Cut Box Part | Позволяет удалить часть выделенного блока. Замечание. Команда доступна в режиме Reference layout.
 | Delete Box | Позволяет удалить блок с изображения. Замечание. Команда доступна в режиме Reference layout.
 | Add Vertical Separator | Позволят добавить вертикальный разделитель к выбранному табличному блоку. Замечание. Команда доступна в режиме Reference layout.
 | Add Horizontal Separator | Позволят добавить горизонтальный разделитель к выбранному табличному блоку. Замечание. Команда доступна в режиме Reference layout.
Delete Separator | Позволят удалить разделитель из выбранного табличного блока. Замечание. Команда доступна в режиме Reference layout.
Properties… |  | Открывает диалог свойств выбранного объекта изображений.


Локальное меню гипотезы

Данное локальное меню открывается при щелчке правой кнопкой мыши по правой панели окна Hypotheses.
Пункт меню | Описание
Show Details | Позволяет посмотреть сформированные гипотезы для элементов, входящих в составной элемент, для которого была сформирована данная гипотеза. Данная команда доступна только для гипотез элементов Group и Table.
Go One Level Up | Данная команда доступна для всех гипотез, кроме гипотез корневого элемента (SearchElements). Позволяет перейти на уровень просмотра гипотез родительского группового элемента.
Expand Active | Доступно для гипотез, имеющих более 1-го продолжения в виде гипотез следующего элемента. Позволяет отобразить все гипотезы следующего элемента, исходящие из данной гипотезы текущего элемента.
Collapse Active | Доступно для гипотез, имеющих более 1-го продолжения в виде гипотез следующего элемента. Позволяет скрыть все гипотезы следующего элемента, исходящие из данной. Эта операция используется при просмотре сильно разветвленного дерева гипотез и позволяет уменьшить число одновременно отображаемых на экране веток дерева. Замечание: гипотеза, принадлежащая к лучшему пути в дереве, т.е. к выбранному программой результату наложения шаблона, при выполнении данной операции не скрывается.
Expand All | Доступно для любой гипотезы любого элемента. Позволяет отобразить в дереве все гипотезы, в том числе не входящие в лучший путь.
Collapse All | Доступно для любой гипотезы любого элемента. Позволяет скрыть все гипотезы, не принадлежащие лучшему пути.
Show Search Area | Позволяет включить/выключить режим отображения области поиска элемента, для которого была сформирована данная гипотеза.
Element Properties… | Открывает диалог Properties, в котором можно посмотреть свойства элемента, для которого была сформирована данная гипотеза.


Локальное меню лога классификатора

Данное локальное меню открывается при щелчке правой кнопкой мыши по панели окна Classifier log.
Пункт меню | Описание
Display Hypotheses | Позволяет посмотреть сформированные гипотезы для элементов, входящих в классификатор.
Export Log | Открывает диалог Export classification log, в котором вы можете сохранить лог классификации в виде текстового файла.


Проект

Проект - это набор файлов, создаваемый программой ABBYY FlexiLayout™ Studio и содержащий информацию об элементах и их свойствах, тестовых изображениях и т.д.

Пакет может быть одного из следующих типов:

  • Гибкое описание. Проекты данного типа предназначены для разработки гибких описаний структуры документов и поиска распознаваемых полей.
  • Классификатор. Проекты данного типа предназначены для разработки анализаторов, позволяющих классифицировать документы по типам.

В рамках проекта осуществляются отладка, компиляция и тестирование гибкого описания или классификатора.

Проект включает в себя:

  • Описание элементов (гибкое описание или классификатор).
  • Пакет - набор изображений, с помощью которого создается и отлаживается гибкое описание.

Файл проекта гибкого описания имеет расширение *.fsp. Файл проекта-классификатора имеет расширение .fcp. Изображения, добавленные в пакет FlexiLayout, сохраняются по умолчанию в папку [Имя проекта]Batch, гибкое описание по умолчанию сохраняется в папку [Имя проекта]Template.

Работа с программой ABBYY FlexiLayout Studio начинается с создания нового или открытия существующего проекта.

Подробнее

Работа с проектами


Проект гибкого описания (FlexiLayout)

Проект гибкого описания содержит информацию о гибком описании FlexiLayout: блоках, элементах и их свойствах, тестовых изображениях и т.д.

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

Проект гибкого описания включает в себя:

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

Подробнее

Гибкое описание FlexiLayout

Работа с проектом


Проект классфикатора (Classificator)

Проект классификатора (Classificator)

Проект классификатора содержит набор элементов, предназначенный для быстрой идентификации страниц документов. Результат классификации записывается в свойства страницы в виде текстовой строки. Например, в свойства страницы может быть записано наименование гибкого описания (или его варианта), которое должно быть наложено на страницу.

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

Проект классификатора включает в себя:

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

Подробнее

Классификаторы

Работа с проектами


Работа с проектом

Работа с проектами

Работа с программой ABBYY FlexiLayout Studio начинается с создания нового или открытия существующего проекта.

Для того чтобы создать новый проект:

  1. Выберите меню File>New Project...
  2. В открывшемся диалоге Create New Project… введите имя проекта, укажите папку для хранения проекта и выберите тип проекта (ABBYY Classifier Project Files (*.fcp) или ABBYY FlexiLayout Project Files (*.fsp)).

Для того чтобы открыть существующий проект:

  1. Выберите меню File>Open Project…
  2. В открывшемся диалоге Open Project выберите файл проекта.

Для просмотра свойств проекта выберите меню File>Project Properties… . В открывшемся диалоге свойств проекта показываются пути к файлу проекта и пакету изображений. В этом же диалоге вы можете снабдить проект полезным комментарием.

Для того чтобы закрыть проект, выберите меню File>Close Project.


Пакет изображений

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

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

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

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

Подробнее

Добавление, просмотр и удаление изображений

Работа с изображениями


Добавление, просмотр и удаление изображений

Для того чтобы добавить изображение в пакет:

  1. Выберите в меню File (или локальном меню окна Batch) команду Add Images…
  2. В открывшемся окне выберите одно или несколько изображений.
     Совет. При выборе изображений можно выбрать многостраничный файл, тогда в пакет добавится несколько страниц. Файлы изображений могут иметь различное разрешение.
  3. Нажмите кнопку Image Preprocessing Settings и в открывшемся окне укажите параметры предобработки изображений.

Параметры предобработки изображений:

  • При добавлении изображений можно сразу определить принцип эталонной сборки изображений в документы. Вы можете создавать документ для каждого файла изображения, для этого отметьте опцию One document per file, или объединять в один документ указанное количество изображений, для этого отметьте опцию Group by page count и введите количество страниц в одном документе. Подробнее см. Эталонная сборка.
  • Опция Convert color and gray images to black and white позволяет автоматически конвертировать цветные изображения в черно-белые при добавлении в пакет.
  • Для выравнивания изображений можно использовать черные квадраты, для этого отметьте опцию Use black squares to correct skew, разделители, для этого отметьте опцию Use separators to correct skew, или текст, для этого отметьте опцию Use text to correct skew.

Совет. Вы также можете добавить изображение в пакет из Проводника Windows. Нажмите левой кнопкой мыши на файле с изображением, которое вы хотите добавить в пакет, и не отпуская кнопки, перетащите его на свернутое окно FlexiLayout Studio, затем, после того как окно программы откроется, перетащите файл в окно Batch.

Для того чтобы добавить изображения из папки:

  1. Выберите в меню File (или локальном меню окна Batch) команду Add Images from Folder…
  2. В открывшемся окне укажите путь к папке с изображениями. Для выбора папки нажмите
  3. Отметьте опцию Add images from subfolders, если вы ходите, чтобы изображения их подпапок также были добавлены в пакет.
    Замечание. В проекте классификатора при добавлении изображений из папок, содержащих проекты гибких описаний, классы могут быть созданы на основе этих проектов. Для этого отметьте опцию Create Classes based on FlexiLayout projects.

Для того чтобы открыть изображение страницы, в окне Batch дважды щелкните мышью на нужной странице.
Совет. Свойства открытого изображения показываются в окне Properties.

Для того чтобы удалить одну или несколько страниц пакета:

  1. В окне Batch выделите требуемые страницы.
  2. В меню Batch (или локальном меню пакета) выберите команду Delete Pages.

Для того чтобы перейти к странице с указанным номером:

  1. Выберите в главном меню пункт Image>Go to Page…
  2. Укажите номер страницы и нажмите кнопку OK.


Работа с изображениями

Для удобства работы с изображениями в программе FlexiLayout Studio предусмотрены следующие операции:

  • Поворот изображения (на 90° по часовой стрелке, на 90° по часовой стрелке и на 180°), а также автоматическое исправление ориентации изображений,
  • Получение зеркального отражения изображения (относительно горизонтальной или вертикальной прямой),
  • Инвертирование изображения,
  • Очистка изображения от мусора,
  • Изменение масштаба изображения.

Если нужное вам изображение открыто в окне Image, вы можете воспользоваться кнопками панели инструментов Image Tools, командами меню Image или командами контекстного меню страницы в окне Image:

Для того чтобы... | Нажмите кнопку | Выберите команду в меню Image
Автоматически исправить ориентацию изображений, |  | Image Operations> Correct Orientation
Повернуть изображение на 90° по часовой стрелке, |  | Image Operations> Rotate Clockwise
Повернуть изображение на 90° против часовой стрелки, |  | Image Operations> Rotate Counter Clockwise
Повернуть изображение на 180°, |  | Image Operations> Rotate Upside Down
Инвертировать изображение (заменить белые точки - черными и наоборот), |  | Image Operations> Invert
Удалить отдельно стоящие точки (мусор) на изображении, |  | Image Operations> Despeckle
Увеличить изображение в 2 раза, |  | Image Window Scale> Zoom In
Уменьшить изображение в 2 раза, |  | Image Window Scale> Zoom Out

Также возможна работа с изображениями нескольких страниц одновременно:

  • Выберите нужные страницы в окне Batch, а затем воспользуйтесь командами меню Batch>Image Operations или командами локального меню окна Batch.

Замечание. При операциях над изображением результаты предраспознавания и наложения FlexiLayout удаляются. При поворотах и зеркальных отражениях удаляется также и эталонная разметка (Reference Layout). Также можно удалить данные о странице с помощью команды меню Batch>Delete Page Data…


Сохранение изображений

Для того чтобы сохранить изображения выбранных страниц:

  1. В окне Batch выделите страницы, которые требуется сохранить.
  2. В контекстном меню страницы выберите команду Export Images to Files…
  3. В открывшемся окне укажите путь сохранения изображения.
  4. Нажмите кнопку Export options и в открывшемся диалоге выберите требуемые настройки сохранения.

Вы можете выбрать следующие настройки сохранения:

Опция | Описание
Name prefix | Первая часть имени файла
Name suffix Способ формирования второй части имени файла:
  • as page number - по номеру страницы
  • continuously - по порядку
Если выбран способ "continuously", укажите номер, с которого начинается нумерация.
Format Вы можете выбрать один из следующих форматов сохранения:
  • bmp
  • dcx
  • pcx
  • png
  • tif
Color type Выберите цветовой тип изображения:
  • Black and white - черно-белый
  • Color - цветной
  • Grey - серый
Rewrite existing files | Отметьте эту опцию, если вы хотите заменять имеющиеся файлы на новые в случае совпадения имен.


Удаление данных со страницы

В диалоговом окне Select Data to Delete вы можете удалить данные со страниц, выделенных в окне Batch. Открыть диалог можно, выбрав команду Delete Page Data…:

  • в меню Batch
  • контекстном меню пакета
  • контекстном меню страницы

Вы можете удалить следующие данные (сделанные изменения нельзя будет отменить!):

  • Extracted image objects - Позволяет удалить информацию об объектах изображения, выделенных при предраспознавании.
  • Matched layout - Позволяет удалить информацию, полученную в результате наложения гибкого описания, т.е. о найденных блоках и элементах.
  • Reference layout - Позволяет удалить информацию об эталонной разметке.
  • Training layout - Позволяет удалить информацию о разметке, созданной в результате обучения.


Гибкое описание FlexiLayout

Гибкое описание FlexiLayout - это формализованное описание структуры документа, позволяющее обнаружить на изображении документа области, соответствующие полям данных документа.

Гибкое описание FlexiLayout имеет древовидную структуру и состоит из ветви блоков и нескольких ветвей элементов. Каждая ветвь элементов соответствует варианту гибкого описания.

Блок гибкого описания позволяет вычислить положение поля документа, из которого в дальнейшем необходимо извлечь данные в системе обработки форм (ABBYY FlexiCapture 10). Расположение блоков может быть найдено или вычислено при помощи элементов, а также задано в виде абсолютных координат. Целью создания гибкого описания является задание алгоритма поиска блоков на изображении документа.

Элементы используются для поиска различных объектов изображения. Для каждого объекта или группы объектов, которые необходимо найти на изображении, в гибком описании создается элемент, свойства которого полностью описывают тип (текст, картинка, штрих-код и т.д.) искомого объекта, его характеристики (длина, ширина и т.д.) и область поиска, в которой предположительно находится объект.

Блоки описания не зависят друг от друга. Элементы можно группировать, формируя дерево любой степени вложенности, в котором элементы логически связаны друг с другом и могут искаться относительно друг друга. Иерархическая группировка элементов позволяет оптимизировать их поиск. Порядок расположения элементов в дереве соответствует порядку их поиска, т.е. при наложении описания на изображение программа будет искать элементы последовательно от верхних к нижним. При этом на изображении ищутся объекты, соответствующие элементам, а затем, ориентируясь на основании информации о найденных элементах, определяются координаты блоков.

Вновь созданный проект FlexiLayout Studio содержит гибкое описание с именем по умолчанию FlexiLayout и пустыми ветвями блоков и элементов.

Подробнее

Свойства гибкого описания

Обучение шаблона гибкого описания

Блоки

Элементы


Свойства гибкого описания FlexiLayout

При создании гибкого описания FlexiLayout нужно задать следующие свойства:

Name - имя описания. По умолчанию гибкое описание создается с именем FlexLayout;

Version - версия гибкого описания. Данный параметр позволяет создавать и впоследствии различать различные версии (редакции) одного и того гибкого описания;

Comment - комментарий пользователя (необязательно для заполнения). Данное поле может содержать любую текстовую информацию о гибком описании;

Замечание. При дальнейшей работе в ABBYY FlexiCapture свойство Comment гибкого описания доступно для просмотра при работе с определением документа в Редакторе определения документа ABBYY FlexiCapture. При создании определения документа ABBYY FlexiCapture на основе файла гибкого описания *.afl (экспортированного из программы FlexiLayout Studio) комментарий к гибкому описанию отображается в свойствах определения документа (в режиме "только для чтения"). Таким образом, может быть указана информация об авторе гибкого описания.

Pre-recognition parameters (Text languages, Text type, Mode, Extract 2d barcodes, Pre-recognition area) - данные параметры определяют режим предраспознавания форм.

Multi-page parameters (Minimum number of pages, Maximum number of pages) - определяют минимальное и максимальное количество страниц в документах.

Constants - глобальные константы, заданные для всего описания в целом, можно использовать при написании дополнительных условий поиска.

Для того чтобы выбрать или просмотреть свойства гибкого описания, выберите команду Properties… в меню FlexiLayout (или команду Properties… в локальном меню FlexiLayout).

Подробнее

Предраспознавание

Параметры предраспознавания

Обработка гибких форм в FlexiCapture и способы их идентификации

Глобальные константы


Варианты описания

При обработке документов может возникнуть ситуация, когда документы имеют общий набор параметров (блоков), одинаковые правила обработки и написаны на одном языке. Тем не менее расположение элементов в данных документах может различаться весьма сильно. Для удобства работы с подобными наборами документов можно создать гибкое описание, содержащее несколько вариантов. При этом каждый вариант описывает расположение элементов для какой-то определенной разновидности документов, а информация о параметрах предраспознавания (в том числе языках), правилах обработки, возможном количестве страниц и т. д. является общей.

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

Наименования вариантов описания (корневых элементов) должны быть уникальными. Рекомендуется выбирать их так, чтобы они отражали особенности разновидности документа.

При наложении гибкого описания варианты накладываются последовательно сверху вниз. При наложении нескольких вариантов используется первый из наложившихся.

Области изображения блоков указываются для каждого варианта гибкого описания (подробнее см. в разделе Блоки).

Для удобства отладки проекта можно выбрать один из вариантов гибкого описания и работать с ним. Выбор осуществляется с помощью пункта Pin Alternative контекстного меню элемента гибкого описания, либо с помощью пункта Select Alternative Layout контекстного меню гибкого описания.

Чтобы создать вариант описания:

  1. Выберите корневой элемент описания (по умолчанию он называется FlexiLayout1).
  2. В контекстном меню выберите Add FlexiLayout Alternative.
  3. Дважды кликните мышью по созданному варианту описания или выберите пункт Свойства... в контекстном меню варианта.
  4. В открывшемся диалоге задайте имя и свойства варианта.
    Замечание. Имя варианта описания должно начинаться с буквы или подчеркивания, за которым могут следовать буквы и цифры. В имени не должны использоваться пробелы и специальные символы: '.', ',', ':', '-', '\', '/', имя элемента не должно совпадать с зарезервированными словами.

Чтобы скопировать вариант описания:

Выберите вариант описания. Удерживая клавишу Ctrl и левую кнопку мыши, перетащите копию варианта описания на нужное место. Также скопировать вaриант описания можно с помощью команд Copy/Paste контекстного меню и сочетаний клавиш Ctrl+C/Ctrl+V.
Совет. Как правило, проще скопировать имеющийся вариант описания и внести необходимую правку, чем создавать вариант заново.

Чтобы импортировать варианты описания из другого проекта:

  1. Выберите корневой элемент описания (по умолчанию он называется FlexiLayout1).
  2. В контекстном меню выберите пункт Import FlexiLayout Alternatives….
  3. В открывшемся диалоговом окне выберите проект, из которого надо импортировать варианты описания, и нажмите кнопку Open.

Замечание. Из проекта копируются все варианты описания. При необходимости удалите лишние варианты.

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

Чтобы импортировать элементы и блоки из другого проекта:

  1. Выберите вариант описания, в который необходимо добавить элементы из другого проекта.
  2. В контекстном меню выберите пункт Import Alternative Elements….
  3. В открывшемся диалоговом окне выберите проект, из которого надо импортировать элементы описания и нажмите кнопку Open.

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

Чтобы удалить вариант описания:

  1. Щелкните правой кнопкой мыши по варианту описания (ветке элементов дерева FlexiLayout).
  2. Выберите в контекстном меню команду Delete или нажмите кнопку Del.

Совет. Вариант описания можно временно отключить. Для этого используйте команду Disable контекстного меню.

Чтобы изменить порядок вариантов описания:

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


Глобальные константы

Замечание. Глобальные константы могут использоваться для задания дополнительных условий (диалог свойств элемента, закладка Advanced, поля Advanced pre-search relations и Advanced post-search relations; диалог свойств блока, поле Expression).

Глобальные константы задаются для всего гибкого описания и доступны во всех разделах программного кода, задаваемого пользователем.

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

Константы могут быть любого типа, для которого в языке определен конструктор. Тип константы либо задается явно вызовом конструктора, либо определяется программой на основании заданного значения (например, тип String). При использовании константы в программном коде гибкого описания компилятор проверяет, что данный тип может быть использован в данном контексте. Такая проверка происходит при общей компиляции гибкого описания и при проверке корректности кода конкретной секции.

Константы могут быть заданы с использованием глобальных функций, а также других, уже определенных (т.е. заданных выше), глобальных констант.

Примеры задания глобальных констант:

Имя | Значение | Тип
RomanNumerals | "I V v X x" | String
SomeRect | Rect( 5mm, 10mm, 20mm, 50mm ) | Rect
FirstPageRect | Page( 1 ) .RectGlobal | Rect
UpperHalfOfFirstPage | Rect(FirstPageRect.Left, FirstPageRect.Top FirstPageRect.Right, FirstPageRect.Height / 2 ) | Rect
UpperHalfOfFirstPage 1 | Region( UpperHalfOfFirstPage ) | Region
TotalLineHeightOfFirstPage | Page( 1 ).AverageLineHeight() + Page( 1 ).AverageInterlineInterval() | Distance
Q_50_Percent | Quality( 0.5 ); | Quality

Добавление, изменение и удаление глобальных констант

Для задания глобальной константы:
  1. Выберите команду Properties… в меню FlexiLayout (или щелкните правой кнопкой мыши в окне FlexiLayout и выберите команду Properties… в локальном меню),
  2. В открывшемся диалоге Properties перейдите на закладку Constants.
  3. Щелкните по кнопке Add…
  4. В открывшемся диалоге введите имя и значение константы. Щелкните по кнопке OK.

Для редактирования глобальной константы:

  1. Выберите команду Properties… в меню FlexiLayout (или щелкните правой кнопкой мыши в окне FlexiLayout и выберите команду Properties… в локальном меню).
  2. В открывшемся диалоге Properties перейдите на закладку Constants и выберите константу из списка.
  3. Щелкните по кнопке Edit…
  4. В открывшемся диалоге введите новое имя и/или значение константы. Щелкните по кнопке OK.

Для того чтобы удалить глобальную константу:

  1. Выберите команду Properties… в меню FlexiLayout (или щелкните правой кнопкой мыши в окне FlexiLayout и выберите команду Properties… в локальном меню).
  2. В открывшемся диалоге Properties перейдите на закладку Constants и выберите константу из списка.
  3. Щелкните по кнопке Delete.

Замечание. Имя константы должно быть валидным идентификатором, т.е. состоять из символов "_ a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z" и цифр, причем первый символ имени должен быть нецифровым.


Обучение шаблона гибкого описания

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

Для того чтобы создать шаблон:

  1. Создайте новый проект или откройте проект, который уже содержит гибкое описание.
  2. Выберите в меню Training пункт Training Mode для перехода в режим обучения. При этом закладка FlexiLayout заменится на закладку Training, которая содержит списки статических элементов и соответствующих им полей. Для перехода к закладке Training, выберите пункт Training в меню View или нажмите сочетание клавиш Alt+2.
  3. Нажмите на стрелочку рядом с кнопкой Create New (Ctrl+Space) [image] и выберете команду Create Field или Create Static Element.

    Для переключения между этими режимами нажмите кнопку Create New (Ctrl+Space).

  4. С помощью мыши выделите область статического элемента или поля на странице. Соответствующий пункт добавится в список Static element name или Field name. Имена элементов и полей создаются автоматически на основе распознанного текста.
  5. В диалоге Training (Training > Show Dialog) или на закладке Training в меню Tools > Options… выберите режим перемещения по страницам. Вы можете перемещаться по страницам, содержащим любой неразмеченный элемент (any unmarked element), любое неразмеченное поле (any unmarked field), любой неразмеченный статический элемент (any unmarked static element) или неразмеченный выбранный элемент (unmarked selected element).
  6. Вы также можете отметить опцию Predict layout automatically on navigation, чтобы проверить правильность нахождения элементов при перемещении по страницам. Для удаления имеющихся областей при предварительной разметке отметьте опцию Replace existing boxes on batch prediction.

    Размеченные элементы, области которых найдены на странице, выделяются жирным. Неразмеченные элементы, названия которых не выделены, обозначают, что эти элементы не найдены на странице. Необходимо вручную разметить области для таких элементов.

  7. Перейдите на следующую страницу, используя диалог Training, и выделите на изображении области для тех элементов и полей, которые не были найдены автоматически. Для этого используйте инструмент Draw Location [image]. При необходимости добавьте новые элементы и поля.
  8. Вместо выделения областей вручную вы можете использовать области, размеченные в процессе предраспознавания страницы. Чтобы показать результаты предраспознавания, используйте следующие инструменты на панели: Show Recognized Words, Show Recognized Lines, Show Separators, Show Barcodes или Show Raw Objects. Дважды щелкните мышью по объекту на странице или нарисуйте область вокруг него. Размер нарисованной области будет автоматически скорректирован в соответствии с границами объекта.
  9. Если какой-либо элемент отсутствует на странице, нажмите кнопку Not Present в окне Training или выберите соответствующий пункт в локальном меню элемента. Название элемента в списке станет зачеркнутым.
  10. Если большая часть элементов и полей определяется правильно, то в окне Batch выделите страницы, которые вы хотите использовать для обучения, и в контектном меню выберите команду Predict Draft Layout.
  11. Проверьте, правильно ли найдены поля и элементы на всех выделенных страницах и при необходимости скорректируйте разметку. Страницы, при автоматической разметки которых были допущены ошибки, следует включить в обучающий набор.
  12. Для добавления страницы в обучающий набор поставьте галочку рядом с номером страницы на закладке Batch. В меню Batch вы можете указать, нужно ли использовать при обучении только полностью размеченные страницы, частично размеченные страницы или выделенные страницы. Для добавления страницы в группу обучения автоматически при переходе на другую страницу, отметьте соответствующую настройку на закладке Training меню Tools > Options…
  13. Нажмите кнопку Generate FlexiLayout Alternative для создания гибкого описания на основе данных, полученных в результате обучения. В открывшемся диалоговом окне FlexiLayout Alternative Generation введите имя нового варианта гибкого описания или выберите имеющийся вариант описания, который вы хотите заменить на новый.


Многостраничное гибкое описание

Программа FlexiLayout Studio 10 позволяет создавать гибкие описания для многостраничных документов. Весь документ рассматривается как одно целое и поиск элементов может производиться не зависимо от страницы, на которой элементы находятся.

В свойствах гибкого описания задается минимальное и максимальное число страниц. Точное количество страниц в документе можно указать с помощью функции SetPagesCount языка описания FlexiLayout.

Подробнее

Поиск начала и конца документа с помощью элементов Header и Footer

Наложение многостраничного гибкого описания

Возможности FlexiLayput Studio, связанные с многостраничностью


Поиск начала и конца документа с помощью элементов Header и Footer

Для определения начала и конца документа рекомендуется использовать специальные элементы гибкого описания: Header и Footer. Данные элементы являются групповыми и должны располагаться в начале ветви элементов. В дереве элементов Header отображается значком [image] , а Footer - значком [image].

Элемент Header располагается на первой странице документа и не должен повторяться на следующих страницах. Рекомендуется выбирать Header таким образом, чтобы он однозначно идентифицировал документы шаблона.

Элемент Footer располагается на последней странице документа и не должен повторяться на предыдущих страницах.

Элементы Header и Footer входят в состав гибкого описания, их гипотезы можно использовать для поиска других элементов.

При наложении многостраничного гибкого описания элементы Header и Footer используются для определения первой и последней страниц документа соответственно.

Совет.
Использование элементов Header и Footer позволяет значительно улучшить нахождение документов и сильно ускоряет процесс наложения гибкого описания. Применяйте их для всех шаблонов, где это возможно.

Подробнее

Элементы Header и Footer

Наложение многостраничного гибкого описания


Наложение многостраничного гибкого описания

Для наложения гибкого описания на группу страниц выделите их в окне пакета или в окне изображений и выберите пункт локального меню Match. Наложение гибкого описания осуществляется приложением следующим образом:

  1. Выполняется предраспознавание выбранных страниц. Для каждой страницы автоматически подбирается ориентация с учетом языка предраспознавания.
  2. Определяется первая страница документа.
  3. Определяется последняя страница документа.
  4. Шаблон накладывается на найденные страницы.
  5. Если удалось наложить шаблон, п.п. 2-4 выполняются для страницы, следующей за распознанным документом. Если наложить шаблон не удалось, действия выполняются со следующей страницы.

В качестве первой страницы первого документа выбирается первая страница из выбранных. Далее первой страницей документа считается следующая за последней страницей предыдущего.

Если шаблон имеет фиксированное количество страниц (возможное количество страниц указывается в свойствах гибкого описания), то последняя страница определяется исходя из указанного значения. Если количество страниц может меняться в интервале [MinPages, MaxPages], то проверяется наличие элемента Footer на минимально возможной последней странице (с номером MinPages). Если элемент найден, то данная страница считается последней страницей документа. В противном случае для каждой страницы, начиная со следующей (MinPages+1), последовательно проверяется выполнение следующих условий:

  1. Данная страница является лишней (ее номер в документе больше максимально возможного количества страниц MaxPages).
  2. Данная страница содержит Header (данная проверка осуществляется в том случае, если элемент Footer является необязательным).
  3. Данная страница содержит элемент Footer.

В первом и втором случаях в качестве последней выбирается предыдущая страница. В третьем случае в качестве последней выбирается текущая страница.

Порядок наложения в случае наличия нескольких шаблонов описан в справочной системе приложения FlexiCapture.


Возможности FlexiLayput Studio, связанные с многостраничностью

Возможности FlexiLayout Studio, связанные с многостраничностью

Многостраничное полотно и координаты

Множество всех страниц документа называется многостраничным полотном. Многостраничное полотно образуется при склеивании страниц документа сверху вниз, без стыков и зазоров, левые границы всех страниц лежат на одной прямой, проходящей через точку (0, 0). Порядок склейки страниц определяется порядком страниц в пакете.

Используется две системы координат – глобальная (сквозная) и локальная (координаты на некоторой странице). Глобальная система отличается от локальных одностраничных координат только параллельными переносами (сдвигами), причём сдвиг свой для каждой страницы.

Пример.

Пусть в документе есть 3 страницы, размерами 2500x3500, 2400x3400 и 2300x3300.
Тогда глобальные координаты страниц будут следующими: [0, 0, 2500, 3500], [0, 3500, 2400, 6900], [0, 6900, 2300, 10200] (в порядке [left, top, right, bottom] ).

В отношениях между элементами используется глобальная система координат, что позволяет правильно их интерпретировать (например, отношение "ниже").

Многостраничные гипотезы

Следующие элементы могут иметь гипотезы, располагающиеся на нескольких страницах:

  • Group
  • Repeatable Group
  • Table
  • Region
  • Object Collection

Элементы Region и Object Collection содержат все подходящие объекты в пределах области поиска.


Предраспознавание изображения

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

Предраспознавание является первым этапом анализа изображения как в программе FlexiLayout Studio, так и в системе потокового ввода форм. Поскольку процесс предраспознавания занимает заметное время, то FlexiLayout Studio предоставляет возможность выполнить этап предраспознавания отдельно, независимо от наложения гибкого описания. Таким образом, пользователь может сэкономить время и сконцентрировать свое внимание на создании и отладке гибкого описания.

Кроме того, результаты предраспознавания необходимо проанализировать перед тем, как создавать гибкое описание, чтобы оценить их качество. Качество предраспознавания зависит от качества тестовых изображений пакета, т.е. правильности настроек яркости, контраста, разрешения и пр., которые были выбраны при сканировании документов. Если результаты предраспознавания неудовлетворительны, возможно, следует изменить настройки сканера. По той же причине в FlexiLayout Studio допускается добавление в пакет изображений с различным разрешением, чтобы пользователь мог сравнить результаты предраспознавания и наложения гибкого описания для изображений с различным разрешением, после чего выбрать оптимальный режим сканирования.

Кроме того, качество предраспознавания можно выполнять в быстром или полном режиме (см. раздел Параметры распознавания). Для технологии анализа гибких документов необязательно иметь идеальные результаты распознавания. Практически любое поле можно найти при наличии нескольких ошибок в распознанном тексте. Часто бывает важно провести этап предраспознавания за возможно меньшее время, допуская при этом некоторые ошибки. При этом задача правильного и точного распознавания решается на следующем этапе обработки документов в системах потокового ввода форм, которые позволяют настроить отдельные параметры (типы данных) для распознавания каждого найденного поля.

В процессе предраспознавания на основе анализа взаимного расположения точек разного цвета программа выделяет на изображении и классифицирует по типам элементарные объекты изображения, а также объединяет текстовые объекты в слова и строки.

В ходе предраспознавания могут быть обнаружены объекты изображения следующих типов:

  • Text - текстоподобные объекты,
  • Picture - картинки,
  • Punctuation mark - отдельно стоящие знаки препинания,
  • Inverted text - светлый текст на темном фоне,
  • Separator - разделители,
  • Barcode - штрих-коды,
  • Checkmark - метки в черных квадратных рамках.

После выделения элементарных объектов выполняется распознавание объектов текстовых строк. Распознанный текст можно просмотреть в следующих режимах:

  • Recognized Words - распознанные слова,
  • Recognized Lines - распознанные строки,

Подробнее

Параметры распознавания

Запуск предраспознавания. Просмотр результатов

Анализ изображения


Параметры предраспознавания

Параметры предраспознавания входят в число свойств гибкого описания. Набор параметров распознавания используется для предраспознавания изображений данного типа форм, структура которого описана данным гибким описанием. Поэтому правильность выбора параметров распознавания важна не только для создания гибкого описания, но и для дальнейшей обработки форм данного типа.

Для создания гибкого описания необходимо задать значения следующих параметров распознавания:

Text type - способ печати бланка формы: типографский (Typographic), матричный принтер (Matrix printer), пишущая машинка (Typewriter). Для выбора значения данного параметра необходимо оценить тип и качество печати.

Mode - режим распознавания: быстрый (Fast), улучшенный (Balanced) или полный (Thorough). В быстром режиме цветные и полутоновые изображения перед распознаванием бинаризуются (переводятся черно-белые). Распознавание в быстром режиме занимает меньше времени (что ускоряет обработку форм), при этом для большинства форм распознавание в быстром режиме дает удовлетворительные результаты. В режиме Balanced распознавание осуществляется с учетом цвета. Распознавание в этом режиме происходит медленнее, чем в режиме Fast, но дает более высокие результаты. Полный режим рекомендуется других режимах приводит к большому количеству ошибок. По умолчанию используется режим Balanced.

Extract 2D barcodes: Data Matrix, Aztec, QR Code - отметьте эту опцию, если ваши изображения содержат штрих-коды указанных типов. Если эта опция не выбрана, штрих-коды типа Data Matrix, Aztec и QR Code не будут найдены на изображениях и эти типы штрих-кодов будут недоступны в свойствах элемента Barcode.

Text languages - языки, на которых написан текст документа формы. Из выпадающего списка необходимо выбрать один или несколько языков, на котором написан текст формы. Полный перечень языков см. в разделе Список OCR языков, поддерживаемых программой ABBYY FlexiLayout™ Studio.

Pre-recognition area - область предраспознавания. Можно указать отступы краев прямоугольника предраспознавания от краев страницы.

Для выбора параметров предраспознавания выберите команду Properties… в меню FlexiLayout (или команду Properties… в локальном меню FlexiLayout). Параметры предраспознавания находятся на закладке FlexiLayout / Classifier.

Показать диалоги выбора параметров распознавания


Запуск предраспознавания. Просмотр результатов

Для того чтобы запустить процесс предраспознавания:

  1. В окне Batch выберите в списке страниц пакета одну или несколько страниц.
  2. Выберите в меню Image (в локальном меню окна Batch или в локальном меню окна Image) команду Pre-Recognize.

Для того чтобы найденные и распознанные в процессе предраспознавания объекты изображения появились на самом изображении:

  1. Откройте изображение.
  2. Выберите один из режимов просмотра объектов изображения (меню Image>Show Image Objects):
  • Show All Objects ( или же выберите все кнопки панели инструментов Extracted Objects),
  • Recognized Words (или нажмите кнопку [image] на панели инструментов),
  • Recognized Lines (или нажмите кнопку [image] на панели инструментов),
  • Separators (или нажмите кнопку [image] на панели инструментов),
  • Raw Objects (или нажмите кнопку [image] на панели инструментов),
  • Barcodes (или нажмите кнопку [image] на панели инструментов).

Замечание. Для выбора объектов нескольких типов удерживайте клавишу Ctrl при нажатии кнопок панели инструментов или выбора пункта меню.

Свойства каждого объекта изображения можно посмотреть в окне Properties. Для этого выделите объект на изображении, в окне Properties будет отображаться список свойств выделенного объекта.


Анализ изображений

Цель предварительного анализа - определить объекты изображения, описание которых можно взять за основу гибкого описания, т.е. эти объекты должны присутствовать на всех изображениях и должны быть одинаковым образом распознаны программой.

Ещё одним важным решением, принимаемым во время предварительного анализа, является последовательность элементов в гибком описании, т.к. от этого зависит последовательность поиска элементов при наложении гибкого описания.

Проводя предварительный анализ изображений, придерживайтесь следующего сценария:

  1. Просмотрите изображения пакета, сгруппируйте похожие.
  2. Попробуйте визуально (на “глаз”) определить те объекты изображения, которые есть на большинстве изображений и встречаются на каждом изображении только один раз. Выделенные таким образом объекты можно принять за основу гибкого описания.
  3. Рекомендуется сначала подобрать на изображении объект(ы), который может служить идентификатором форм. Это может быть заголовок или иной объект, четко указывающий на принадлежность формы к данному типу документов. Объект-идентификатор должен присутствовать на всех формах и распознаваться, по возможности, без ошибок. Элемент, соответствующий идентификатору, рекомендуется сделать обязательным для нахождения. Если же при наложении гибкого описания такой объект не будет найден на форме, процесс наложения гибкого описания будет прерван. При этом можно будет говорить о том, что форма не относится к данному типу документов.
  4. Продумайте последовательность создания элементов и расположение их в дереве элементов. При наложении гибкого описания поиск объектов изображения выполняется в том порядке, в каком идут в дереве гибкого описания элементы, соответствующие искомым объектам.
  5. Подумайте пути нахождения каждого объекта, соответственно этому выбрать свойства элемента. Создание гибкого описания следует начинать с создания наиболее надежных элементов, т.е. элементов, которые есть практически на каждом изображении, причем число вариантов такого элемента на изображении минимально. В дальнейшем описании они будут использоваться как отправные точки для поиска элементов меньшей степени надежности, т.е в качестве опорных элементов.
    Нужно стремиться как можно строже задавать свойства элемента, чтобы найденная гипотеза была возможно более надежной.
    Во избежание резкого разрастания дерева гипотез не рекомендуется увеличивать заданное по умолчанию значение параметра Number of surviving hypotheses.
  6. Продумайте возможность объединения элементов в группы. Программа позволяет создавать составные элементы - группы элементов любой степени вложенности. Это удобно при отладке независимых частей гибкого описания. Например, все описание из 100 элементов может содержать всего 3 составных элемента первого уровня: заголовок, тело и нижнюю часть. Каждый из этих составных элементов в свою очередь будет содержать составные элементы, предназначенные для поиска небольших фрагментов данной логической части гибкого описания.
    Помимо сокращения перебора вариантов такая структура обеспечивает удобство отладки и редактирования гибкого описания в дальнейшем, т.к. различные части описания будет удобно дополнять и отлаживать независимо друг от друга.


Элементы

Элемент - это описание одного или нескольких объектов изображения (разделитель, статический текст, картинка, и т.д.), позволяющее задать условия поиска объекта(ов) в заданной области изображения. Элемент содержит информацию о типе искомого объекта изображения, свойствах этого объекта, области поиска и отношениях с другими элементами. По результатам поиска, выполненного с помощью свойств элемента, программа формирует регион найденного объекта изображения, т.е. область, состоящую из одного или нескольких прямоугольников, внутри которой находится найденный объект. С помощью элементов (опираясь на соответствующие описанию объекты изображения) определяется положение блоков гибкого описания.

Элементы делятся на простые (Static Text, Separator, White Gap, Barcode, Character String, Paragraph, Object Collection, Date, Phone, Currency, Region), не содержащие в себе других элементов, и составные (Group, Repeating Group, First Found, Labeled Field, Header, Footer). Приложение позволяет конвертировать элементы из одного типа в другой, но не превращать простые элементы в составные или наоборот. Элемент Table не относится ни к простым, ни к составным элементам и не может быть конвертирован в элемент другого типа. Конвертация осуществляется с помощью пункта Convert to контекстного меню элемента.

Отображение элемента может изменяться в зависимости от его свойств:

  • Отключенные элементы отображаются серым цветом;
  • Обязательные элементы помечены зеленой отметкой;
  • Запрещенные элементы помечены красной отметкой.

Элементы объединяются в варианты гибкого описания. В дереве проекта каждый вариант описания отображается значком [image] .

Подробнее

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска

Обучение элементов


Создание, копирование и удаление элементов

Для того чтобы создать элемент:

  1. Перейдите в окно FlexiLayout.
  2. Спуститесь по дереву элементов до уровня вложенности, на котором вы хотите создать элемент (для первого уровня выберите SearchElements).
  3. Выберите элемент нужного типа (меню FlexiLayout>Add Element>"Type").
  4. В открывшемся диалоге задайте имя и свойства элемента, область поиска и дополнительные условия поиска, если необходимо.
    Подробное описание каждого типа элементов и его свойства см. в соответствующем разделе.
    Замечание. Имя элемента должно состоять из букв (русских, латинских или латинских с диакритическими знаками), цифр и знака подчеркивания. Имя элемента должно начинаться с буквы или подчеркивания. В имени элемента не должны использоваться пробелы и специальные символы: '.', ',', ':', '-', '\', '/', имя элемента не должно совпадать с зарезервированными словами.

При просмотре результатов предраспознавания можно быстро создавать элементы на основании изображения. Это можно сделать следующими способами:

  1. Наведите курсор на распознанный объект и дважды нажмите левую клавишу мыши.
  2. В открывшемся диалоговом окне Select Element Type выберите тип элемента и подтвердите выбор кнопrой OK.

либо

  1. Нажмите кнопку [image] на панели инструментов для перехода в режим создания элементов.
  2. Наведите курсор мыши к углу прямоугольника, на основании которого будет создан элемент.
  3. Нажмите левую клавишу мыши и, удерживая ее, переместите курсор к противоположному углу. При перемещении приложение отображает прямоугольник, на основании которого будет создан элемент.
  4. Отпустите левую клавишу мыши.
  5. В открывшемся диалоговом окне Select Element Type выберите тип элемента и подтвердите выбор кнопкой OK.

Совет. Созданный элемент можно переместить на другой уровень ветви элементов FlexiLayout, для этого выделите его и перетащите с помощью мыши. Однако, следует помнить, что если в дереве проекта присутствуют элементы, в которых есть ссылка на данный элемент, или поле Expression в диалоге свойств какого-либо блока содержит ссылку на свойства этого элемента, то, после перемещения элемента, возможно, понадобится скорректировать значения соответствующих свойств. Программа FlexiLayout Studio автоматически пометит элементы, в которых в результате данного перемещения возникла ошибка.

Замечание. После создания составного элемента в него нужно добавить простые или составные элементы. Для того чтобы добавить элементы в составной элемент Group:

  1. Выделите в ветке элементов элемент, который нужно добавить в группу, и перетащите его мышью, или
  2. Щелкните по элементу Group и создайте в нем новые элементы нужных типов.

Для того чтобы скопировать элемент воспользуйтесь одним из перечисленных способов:

  1. Выделите элемент в ветке элементов. Удерживая клавишу Ctrl и левую кнопку мыши, перетащите элемент на нужный уровень дерева.
  2. Выделите элемент в ветке элементов. Для копирования используйте команды Copy/Paste меню Edit или аналогичные команды локального меню.
  3. Выделите элемент в ветке элементов. Для копирования используйте кнопки Copy/Paste панели инструментов.

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

Для того чтобы удалить элемент:

  1. Щелкните правой кнопкой мыши по элементу в ветке элементов дерева FlexiLayout,
  2. В контекстном меню ( или в меню Edit) выберите команду Delete, вы также можете воспользоваться кнопкой Del.

Подробнее

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска


Обзор свойств элементов FlexiLayout

Свойства элемента задаются в диалоге свойств элемента. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties… Все свойства элемента, кроме имени и комментария, служат для описания искомого объекта, т.е. параметров искомого объекта и области поиска. Свойства элемента делятся на следующие группы:

Общие свойства
Данные свойства не зависят от типа элемента и задаются на закладке General:

Name - имя элемента. Имя элемента должно состоять из букв (русских, латинских или латинских с диакритическими знаками), цифр и знака подчеркивания. Имя элемента должно начинаться с буквы или подчеркивания. В имени элемента не должны использоваться пробелы и специальные символы: '.', ',', ':', '-', '\', '/', имя элемента не должно совпадать с зарезервированными словами ни с предопределенными типами языка FlexiLayout.

Тип элемента - тип выбирается при создании элемента. Элементы делятся на простые и составные. Среди простых элементов выделяются: Static Text, Separator, White Gap, Barcode, Character String, Paragraph, Object Collection, Date, Phone, Currency, Table, Region. Гибкое описание FlexiLayout может включать в себя составные элементы - элементы типа Group и Repeatable Group, а также элемент Labeled Field.

Comment - комментарий или описание данного элемента, создаваемое пользователем.

Search Control - указание, является ли элемент обязательным, необязательным или недопустимым лементом. Подробнее см. в разделе Обязательные, необязательные и недопустимые -элементы.

Null hypothesis quality - качество нулевой гипотезы (доступно, если в блоке Search Control выбрано значение Optional element). По умолчанию равно 0,97.

Number of surviving hypotheses - данный параметр ограничивает число гипотез данного элемента, которые будут использоваться в дальнейшем поиске, т.е. при поиске следующего элемента. По умолчанию значение этого параметр равно 5 для простых элементов и 1 для групп.

Min number of found subelements - минимальное количество найденных подэлементов, при котором элемент считается найденным. Свойство относится только к групповым элементам (Group, Header, Footer, Repeating Group).

Свойства, описывающие физические параметры искомого объекта
Данные свойства задаются в диалоге свойств элемента на закладке с названием типа элемента. Каждый тип элементов характеризуется определенным набором свойств. Подробнее о выборе свойств каждого типа элементов см. в описании элемента соответствующего типа.

Свойства, задающие абсолютную область поиска объекта изображения
Данные свойства не зависят от типа элемента и задаются на закладке Search Constraints.

Свойства, задающие область поиска объекта изображения относительно других элементов
Данные свойства не зависят от типа элемента и задаются на закладке Relations.

Свойства, задающие дополнительные условия поиска, проверяемые во время и после поиска данного элемента.
Данные свойства задаются на закладке Advanced. Подробнее о задании дополнительных условий поиска см. в разделе Дополнительные условия поиска.

Определяемые пользователем свойства элемента
Определяемым пользователем свойством элемента называется типизированная переменная, принадлежащая элементу. Данные свойства задаются на закладке Advanced. Подробнее об определяемых пользователем свойствах см. в разделе Определяемые пользователем свойства элемента.

Совет.
Свойства каждого элемента отображаются в диалоге свойств, а также в окне Properties при выборе элемента в дереве FlexiLayout. Для того чтобы открыть диалог свойств элемента дважды щелкните мышью по элементу в ветви элементов FlexiLayout. После наложения шаблона (команда Match) для того чтобы открыть диалог свойств элемента, дважды щелкните мышью по элементу в дереве гипотез (окно Tree of Hypoteses).
Для удобства работы со свойствами элементов программа ABBYY FlexiLayout позволяет открывать одновременно несколько диалогов свойств. Программа FlexiLayout Studio позволяет скопировать свойства элемента в свойства другого элемента, но скопировать можно лишь свойства, присущие только данному типу элементов (нельзя, например, скопировать свойство Max width в свойства элемента Static Text). Также можно скопировать значение свойства объекта, показываемого в окне Properties, и вставить это значение в диалог свойств элемента.

Подробнее

Обязательные, необязательные и недопустимые элементы

Область поиска

Дополнительные условия поиска


Обязательные, необязательные и недопустимые элементы

Особенностью гибких документов является непостоянный состав полей на различных изображениях. Поэтому при создании элемента следует иметь в виду, что объект(ы), описываемый данным элементом может отсутствовать на некотором изображении, поэтому найти его не удастся. Также возможно повреждение изображения при сканировании, такое как зачернение или, наоборот, осветление отдельных участков изображения, приводящее к утере информации. В таком случае объект, соответствующий элементу, также не будет найден. Программа FlexiLayout Studio позволяет при отсутствии элемента на изображении продолжить поиск других элементов. Для того, чтобы разрешить наложение описания на изображение в случае, если некоторый объект не найден, нужно сделать его необязательным.

Объекты изображения, описанные с помощью обязательных элементов, должны присутствовать на изображении, и программа должна найти их при наложении гибкого описания. Если же такой объект не будет найден на изображении, процесс наложения описания прекращается.

Обязательные элементы следует использовать для поиска объектов, идентифицирующих форму. Наличие такого элемента-идентификатора предотвратит наложение гибкого описания на форму, не принадлежащую к данному типу форм. Также можно использовать обязательный элемент для описания объектов изображения, отсутствие которых на форме делает бессмысленным наложение гибкого описания и дальнейшее распознавание данных.

Во всех остальных случаях объекты изображения следует описывать опциональными элементами.

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

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

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

Таким образом, элементы могут использоваться для идентификации документа (обязательные), поиска блоков (обязательные и необязательные) и для отбрасывания неверных гипотез (недопустимые элементы).

Выбор варианта использования элемента осуществляется в диалоге свойств элемента (закладка General).

Изображения обязательных и недопустимых элементов выделяются следующим образом:

  • Обязательные элементы помечены зеленой отметкой: ;
  • Недопустимые элементы помечены красной отметкой: .


Static Text

Static Text - это элемент гибкого описания, позволяющий найти заранее известный текст. Текст может состоять из одного слова, а может содержать фразу, состоящую из нескольких слов. Фраза отличается от слова тем, что внутри нее есть хотя бы один пробел, при этом фраза может располагаться на нескольких строках.

В дереве элемент Static Text отображается значком [image].

При поиске элемента рассматриваются объекты Recognized Words и Recognized Lines, найденные при предраспознавании и находящиеся в области поиска элемента.

Как правило, на всех или многих изображениях пакета имеется статический текст. Например, это может быть название документа («Накладная») или пояснительные надписи к полям ввода информации, такие как «Дата», «Получатель». Такие объекты изображения определяются при предраспознавании как объекты Recognized Words и обычно служат отправной точкой для поиска введенного в соответствующие им поля произвольного текста (т.е. рядом со статическим текстом «Дата», обычно, справа, можно искать реальную введенную дату).

Свойства элемента, задающие параметры искомого объекта

Свойства, определяющие параметры искомого объекта, задаются в диалоге свойств элемента на закладке Static Text. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties….

Search text - текст, который будет искаться на изображении.

Если нужно найти фразу из нескольких слов, причем известно, что располагаться они всегда будут на одной строке, то лучше не учитывать пробелы при поиске, то есть не отмечать опцию Take spaces into account, это ускорит поиск. Можно сразу вводить фразу без пробелов, они в любом случае будут удалены, если не отмечена опция Take spaces into account.

Пример. Для поиска заголовка "Договор купли-продажи", располагающегося на всех формах на одной строке, нужно ввести ДОГОВОРКУПЛИ-ПРОДАЖИ.

Варианты слов разделяются вертикальной чертой (символом «|»).

Пример. На однотипных формах есть разные заголовки "Договор", "Контракт", "Соглашение", в этом случае для нахождения заголовка формы необходимо в качестве искомого текста следует указать: ДОГОВОР|КОНТРАКТ|СОГЛАШЕНИЕ.

Варианты фраз берутся в фигурные скобки и разделяются вертикальной чертой ({ }|{ }). Внутри фраз допустимо перечисление вариантов слов. (При этом должна быть отмечена опция Take spaces into account).

Пример. Если в поле Search text указать "{ДОГОВОР|КОНТРАКТ АРЕНДЫ|ЗАЛОГА}|{ЗАЯВЛЕНИЕ КЛИЕНТА|ПАРТНЕРА}, то будет выполнен поиск следующих фраз: договор аренды, договор залога, контракт аренды, контракт залога, заявление клиента, заявление партнера.

Совет. Для удобства ввода длинных строк воспользуйтесь отдельным окном, которое открывается при нажатии кнопки [image].

Search text from database - на изображении можно искать текст из базы данных. Поиск нужных полей в таблице базы данных производится с помощью SQL-запроса, начинающегося с команды SELECT. На изображении будет производиться поиск текста, содержащегося в найденном поле.

Введите строку соединения с базой данных в поле Connection string или воспользуйтесь кнопкой [image], чтобы открыть стандартный диалог настройки соединения с БД.

В поле Query text введите запрос. Для удобства ввода запроса воспользуйтесь отдельным окном, которое открывается при нажатии кнопки [image].

Search text from file - можно также производить поиск текста из файла. Укажите нужный файл, используя кнопку Browse….

Подробнее об использовании баз данных и файлов см. Использование баз данных и текстовых файлов в языке гибких описаний.

Max number of errors - максимально допустимое абсолютное число ошибок в слове. Данный параметр задается для отдельного слова фразы (если фраза разделена пробелами, в противном случае фраза считается одним словом). Если при наложении гибкого описания количество ошибок в найденном слове превышает максимально допустимое, то считается, что слово не удовлетворяет параметрам поиска. Число ошибок вычисляется как число операций удаления, вставки и замены символа в найденном тексте, требующиеся для того, что привести найденный текст к искомому (указанному в поле Search text).
По умолчанию значение данного свойства не ограничено.

Пример. Если в поле Search text введено слово "мама", а максимально допустимое количество ошибок в слове - 1, то при нахождении слова "папа" в области поиска количество ошибок в этом слове будут равно 2, и слово будет считаться ненайденным.

Max error percentage - максимально допустимое относительное число ошибок в слове (т.е. отношение числа ошибок в тексте гипотезы к числу букв в тексте гипотезы). Если относительное число ошибок в слове превышает максимально допустимое значение, слово считается ненайденным.
По умолчанию равно 30%.

Замечание. Из двух свойств, ограничивающих количество допустимых ошибок в слове, будет использовано то, которое задает более строгое ограничение на результаты поиска текста.

Max space length - позволяет указать максимально допустимую абсолютную длину пробела внутри найденного объекта.

Whole words only - при выборе данной опции будет выполнен поиск только целых слов.

Match case - при выборе данной опции поиск слов будет производиться с учетом регистра (будут различаться заглавные и строчные буквы).

Take spaces into account - выбор данной опции указывает на то, что при поиске должны учитываться пробелы. Если опция не отмечена, то пробелы будут удалены из искомого текста. Для ускорения поиска пробелы лучше не учитывать. Однако, если фраза может располагаться на нескольких строках, или вам необходимо допустить возможность пропуска слов, то искомая фраза должна быть введена с пробелами, а опция Take spaces into account - отмечена.

Следующие свойства в группе доступны, только если отмечена опция Take spaces into account:

Permit multiple lines - выбор данной опции делает допустимым переход фразы на новую строку.

Line break penalty - позволяет указать штраф за переход фразы на новую сроку. Значением свойства может быть число от 0 до 1. Качество гипотезы будет домножено на штраф столько раз, сколько раз фраза переходит на новую строку. Если же переход на новую строку допустим, то в качестве значения данного свойства следует выбрать 1, тогда умножение на штраф не будет приводить к ухудшению качества гипотезы.

Permit missing words - выбор данной опции делает допустимым отсутствие слова в фразе.

Missing word penalty - позволяет ввести штраф за отсутствие слова в фразе. Число от 0 до 1. Качество гипотезы будет домножено на штраф столько раз, сколько слов отсутствует во фразе. Если же отсутствие слова в фразе допустимо, то в качестве значения данного свойства следует выбрать 1, тогда умножение на штраф не приведет к ухудшению качества гипотезы.

Рекомендации по созданию элемента Static Text

Поскольку значение статического текста известно, элемент Static Text можно использовать в качестве опорного элемента для поиска других объектов изображений. При этом необходимо руководствоваться следующим:

  • Для того чтобы убедиться в том, что намеченный вами статический текст на всех тестовых изображениях распознается устойчиво, необходимо просмотреть результаты предраспознавания на всех изображениях (выбрав на панели инструментов кнопки [image] или [image] в зависимости от того, является ли статический текст словом или фразой).
  • Предпочтительно выбирать сравнительно крупный статический текст, чтобы практически при любом качестве отсканированного изображения его значение не менялось, или количество допустимых ошибок было бы более или менее предсказуемо.
  • Если на форме присутствует только мелкий статический текст, распознавание которого процедурой предраспознавания очень неустойчиво (т.е. количество и типы ошибок на разных изображениях значительно различаются), то такие участки текста имеет смысл искать не как элементы типа Static Text, а как элемент типа Object collection c отмеченными опциями Text, Punctuation mark, а возможно еще и Picture (это выявляется при просмотре результатов предраспознавания по нажатию кнопки [image] (Raw Objects) на панели инструментов и выделении курсором соответствующего объекта изображения). При этом тип объекта отображается в строке DataType в окне Properties.
  • Предпочтительно выбирать участки статического текста с уникальным значением, чтобы предотвратить его ошибочное нахождение, или свести к минимуму написание дополнительных условий, ограничивающих область поиска с целью предотвращения ошибочной локализации текста.
  • Если на изображении одновременно встречаются односложные заголовки (которые предполагается искать с помощью элементов типа Static Text) и, фразы, в составе которых встречаются те же слова, что и в односложных заголовках, то для исключения неопределенности (т.е. ситуаций, при которых односложные заголовки могут находиться в составе фраз, а не как самостоятельные заголовки) рекомендуется сначала определять элементы для поиска более сложных заголовков. А односложные заголовки искать уже на основе найденных фраз.

Рекомендации для иероглифических языков

Для строк на китайском, японском и корейском языках можно использовать специальный параметр поиска, влияющий на подсчет числа ошибок в найденной гипотезе по сравнению с заданным значением статического текста. При использовании этого параметра в операции вставки/удаления/замены символа, каждая из которых расценивается как одна ошибка, в качестве символов, с которыми разрешена замена, разрешается использование только символов (иероглифов) с похожим начертанием. Таким образом, замена символа на похожий символ будет расцениваться как одна ошибка, а замена на непохожий символ - как две ошибки, так как в этом случае выполняются две операции: удаление символа и вставка.

Использование этого режима поиска влияет только на поиск строк на китайском, японском и корейском языках.

Замечание. Поиск по целым словам для таких строк невозможен, так как в указанных языках часто отсутствует явное деление текста на слова.

Для использования описанного режима поиска введите следующий код на панели Advanced pre-search relations закладки Advanced:

SuggestOnlySimilarChars(Logic value = true);

По умолчанию параметр SuggestOnlySimilarChars имеет значение false.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента Static Text


Separator

Separator - элемент, представляющий собой описание вертикального или горизонтального разделителя.

В дереве элементов элемент Separator отображается значком [image].

Данный элемент предназначен для поиска разделителей. При этом рассматриваются объекты Separator, найденные при предраспознавании и находящиеся целиком в области поиска элемента или пересекающие ее.

Свойства элемента Separator, описывающие параметры искомого объекта

Свойства, определяющие параметры искомого объекта, задаются в диалоге свойств элемента на закладке Separator. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties….

Orientation - позволяет указать ориентацию искомого разделителя, т.е. искать вертикальный или горизонтальный разделитель.

Min length задает минимальную абсолютную длину разделителя. Целое число, выраженное в используемых единицах измерения. Объекты, имеющие меньшую длину, не будут рассматриваться. Длину разделителя можно оценить по свойствам объектов изображения - разделителей (данные свойства отображаются в окне Properties при выборе объекта на изображении).

Max length задает максимальную абсолютную длину разделителя. Целое число, выраженное в используемых единицах измерения. Объекты, имеющие большую длину, не будут рассматриваться.

Min relative length (%) задает минимальную относительную длину разделителя. Число от 0 до 100. Относительная длина разделителя вычисляется по горизонтали или вертикали в зависимости от типа разделителя как [длина разделителя]/[длина области поиска элемента в направлении разделителя]. Объекты меньше заданной относительной длины при поиске элемента не рассматриваются.

Замечание. Если заданы значения и для свойства Min length и Min relative length (%), то при поиске будет использоваться наиболее строгое условие.

Пример. Для элемента Separator заданы значения свойств Min length=300dot (1 дюйм или 2,54 см) и Min relative length=30%. Если при этом ширина области поиска составит 21,0 см (ширина листа формата А4), то в ней будут искаться разделители с длиной, превышающей 6,3 см.

Penalty limit for length - минимальный коэффициент, на который может быть умножено качество гипотезы, из-за штрафа за длину. При вычислении оценки качества гипотеза может получить штраф за длину разделителя. Чем длиннее объект-разделитель, тем выше качество гипотезы. Самое высокое качество, равное 1, имеет разделитель, длина которого равна длине области поиска. При уменьшении относительной длины разделителя от 1 до 0 качество гипотезы падает прямо пропорционально от 1 до Penalty limit for length.

Relative length = L/L0
[Quality] = ( 1 – [Penalty limit for length] ) * [Relative length] + [Penalty limit for length].

(Качество линейно меняется от 1 при относительной длине 1 до [Penalty limit for length] при относительной длине 0.)

Fits entirely within search area - данная опция указывает на то, что искомый разделитель должен полностью находиться в области поиска. Для нахождения разделителей, пересекающих область поиска (см. рис. ниже), необходимо отменить выбор данной опции.

Группа свойств Space

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

Свойства группы Space позволяют задать условия, при которых несколько отдельных разделителей будут объединены в одну гипотезу.

Max length - максимально допустимая абсолютная длина пробела между двумя фрагментами разделителя, при которой отдельные объекты-разделители, являющиеся продолжением друг друга, будут объединены в одну гипотезу.

Max relative length (%) - максимально допустимая относительная длина пробела между двумя фрагментами разделителя, позволяющая объединить в один объект отдельные объекты-разделители, являющиеся продолжением друг друга. Относительную длину пробела внутри разделителя вычисляется как [длина пробела]/[длина разделителя].

Замечание. Если заданы оба свойства Max length и Max relative length (%), то при поиске будут использоваться более строгое условие.

Orthogonal shift - максимально допустимое абсолютное расстояние между разделителями (в направлении, перпендикулярном направлению разделителя), позволяющее объединить в одну гипотезу отдельные объекты-разделители, идущие параллельно друг другу.

Рекомендации по созданию элемента Separator

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

Если же разделители все-таки используются в качестве опорных элементов, необходимо обращать внимание на то, как они находятся процедурой предраспознавания. Для того чтобы убедиться в том, что выбранный разделитель на всех тестовых изображениях распознается устойчиво, необходимо после предраспознавания на панели инструментов выбрать кнопку [image], позволяющую увидеть разделители, найденные при предраспознавании. Затем необходимо просмотреть все тестовые изображения, обращая внимание на подсветку соответствующего объекта на изображении. Это особенно важно, когда разделители очень тонкие, в этом случае их обнаружение зависит от настроек сканирования (качества полученного изображения).

Замечание. При создании элемента Separator нужно обращать внимание на то, сколько гипотез может оказаться в заданной области поиска разделителя. Следует избегать ситуации, при которой в области поиска имеется несколько объектов-разделителей, и в гибком описании задано несколько элементов типа Separator внутри одной группы. В таком случае при наложении гибкого описания появляется опасность возникновения комбинаторного взрыва числа гипотез, поскольку на основе каждого объекта может быть построена гипотеза, и программе придется перебрать все сочетания гипотез разделителей друг с другом. Поэтому нужно стараться минимизировать число гипотез данного элемента, ограничив, насколько возможно, его область поиска.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска


White Gap

White Gap - элемент гибкого описания, представляющий собой описание прямоугольной области изображения, практически не содержащей объектов.

Поиск просветов выполняется с помощью построения гистограммы объектов. При построении гистограммы объектов, находящихся в области поиска, ищется сумма проекций всех объектов на горизонтальную ось (для вертикального просвета) или на вертикальную ось (для горизонтального просвета). Если сумма проекций объектов меньше заданного уровня, то считается, что в данной области имеется просвет.

Построение гистограммы объектов для вертикального просвета

Подробнее о гистограммах объектов см. в разделе Формирование и оценка гипотез для элемента White Gap.

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

В дереве элементов элемент White gap отображается значком [image].

Свойства элемента White Gap, задающие параметры искомого просвета

Свойства, определяющие параметры искомого просвета, задаются в диалоге свойств элемента на закладке White Gap. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties…

Свойство Orientation позволяет задать направление искомого просвета.

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

Свойство Min width/height позволяет задать минимальную абсолютную длину/ширину (меняется при переключении ориентации) просвета в направлении, перпендикулярном направлению Orientation. Просветы меньшей ширины/длины рассматриваться не будут. Значение данного свойства указывается в используемых единицах измерения. По умолчанию свойство имеет значение 20dot.

Свойство Search among objects of type позволяет определить, среди объектов какого типа следует искать просвет. Нужные типы объектов следует отметить галочками.

Свойства, задающие уровень гистограммы объектов, которые могут находиться в области поиска

Свойство Threshold coefficient (%) позволяет вычислить максимально допустимый уровень гистограммы просвета. Гипотезы просвета будут найдены в областях изображения, на которых гистограмма объектов оказалась ниже вычисленного уровня. По умолчанию свойство имеет значение 20.

Свойства Lower threshold limit и Upper threshold limit задают абсолютные ограничения на вычисленный уровень сверху и снизу, страхуя от выбора заведомо неверных значений.

Значение свойства Lower threshold limit указывается в используемых единицах измерения. По умолчанию свойство имеет значение 37dot, что соответствует характерной высоте строки печатного текста. Таким образом, при поиске горизонтального просвета данное значение допускает наличие внутри просвета одной строки случайного текста (мусора).

Значение свойства Upper threshold limit указывается в используемых единицах измерения. По умолчанию свойство имеет значение 150dot, что соответствует характерной высоте 4-х строк печатного текста. Таким образом, при поиске горизонтального просвета данное значение запрещает наличие внутри просвета более 4-х строк случайного текста (мусора).

Замечания.

  1. Значения свойств Lower threshold limit, Upper threshold limit и Threshold coefficient (%) подбираются методом проб и ошибок. Подбор значений рекомендуется начинать со значений по умолчанию, если же поиск со значениями по умолчанию приводит к неудовлетворительным результатам, тогда следует подобрать такие значения свойств, которые позволят найти искомый просвет на всех тестовых изображениях.

  2. Если свойство Threshold coefficient (%) имеет значение, меньшее значения, выбранного для свойства Lower threshold limit, то для поиска просвета будет использовано значение свойства Lower threshold limit. Если же значение свойства Threshold coefficient (%) превышает значение свойства Upper threshold limit, то для поиска просвета будет использовано значение Upper threshold limit, т.е. всегда используется значение, задающее более строгое ограничение.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента White Gap

Формирование и оценка гипотез для элемента White Gap


Barcode

Barcode - элемент гибкого описания, представляющий собой описание штриховых знаков, кодирующих цифровую информацию посредством чередующихся областей черного и белого цвета различного размера.

В дереве элементов элемент Barcode отображается значком [image].

Данный элемент предназначен для поиска штрих-кодов тех типов, распознавание которых поддержано в программе ABBYY FlexiLayout™ Studio. При этом при поиске рассматриваются объекты Barcode, найденные при предраспознавании и находящиеся в области поиска элемента.

Свойства элемента Barcode, задающие параметры искомого объекта

Свойства, определяющие параметры искомого объекта, задаются в диалоге свойств элемента на закладке Barcode. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties…

Barcode type - тип штрих-кода.

Замечание. Для того чтобы были доступны типы штрих-кода QRCode, Aztec и DataMatrix, в свойствах FlexiLayout / Classifier нужно отметить опцию Extract 2D barcodes: Data Matrix, Aztec, QR Code.

Orientation позволяет выбрать ориентацию штрих-кода:

  • Left-to-Right,
  • Bottom-to-Top,
  • Right-to-Left,
  • Top-to-Bottom.

Замечание. Возможен выбор нескольких вариантов.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента Barcode


Character String

Character String - элемент, представляющий собой описание последовательности символов, расположенных на одной строке друг за другом слева направо. Цепочки символов составляются из текстовых объектов - например, из целых слов, либо из одного/нескольких фрагментов текстовых объектов.

В дереве проекта элемент Character String отображается значком [image].

Данный элемент предназначен для поиска текста неизвестного содержания. При этом рассматриваются объекты Recognized Words, найденные при предраспознавании и находящиеся в области поиска элемента.

Обычно цепочка символов ищется поблизости от уже найденного статического текста. Например, чтобы найти инвентарный номер документа, нужно сначала найти статический текст «Инвентарный номер», а потом в той же строке правее найденного статического текста либо в строке над ним искать последовательность символов, состоящую, например, только из цифр.

Описание искомого текста

Свойства, описывающие искомый текст, задаются в диалоге свойств элемента на закладке Character String. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties….

Текст, который необходимо найти на изображении, может быть описан двумя способами.

Описание искомого текста с помощью регулярного выражения

Регулярное выражение определяет возможные комбинации символов, их взаимное расположение (тем самым определяется структура искомого текста). При задании регулярного выражения поиск ведется точно, т.е. гипотеза должна строго удовлетворять регулярному выражению. Обычно этот способ поиска подразумевает, что изображения документов имеют хорошее качество и распознаются без ошибок.

Для того чтобы описать искомый текст регулярным выражением, выберите опцию Regular expression и введите выражение в поле, расположенное рядом с этой опцией. Для удобства ввода регулярного выражения справа от поля для ввода находится кнопка [image], нажав на которую вы можете выбирать пункты выпадающего меню (например, Any Letter, Character from Set) и соответствующее регулярное выражение будет автоматически подставлено в поле.

Алфавит, используемый в регулярных выражениях
Название в списке | Условное обозначение в поле | Пример использования
Любой символ | * | “к”*“т” – допускает слова типа кит, кот и т.п.
Буква | С | С”от” – допускает слова типа Рот, рот, кот, Кот, мот и т.д.
Заглавная буква | А | A”от” – допускает слова типа Рот, Кот, Мот, Дот и т.п.
Строчная буква | а | а”от” – допускает слова типа рот, кот, мот, дот и т.п.
Буква или цифра | Х | X – допускает любую одиночную цифру или букву.
Цифра | N | N“-й” допускает слова типа 5-й, 4-й, 1-й и т.п.
Строка | “” | “кот”
Или | | | “пл”(“о”|“а”)“т” – допускает слова “плот” и “плат”.
Символ из группы | [] | [тм]“от” – допускает слова тот и мот.
Символ не из группы | [^] | [^т]“от” – допускает слова “кот”, “лот” и т.п., но не допускает слова “тот”.
Любое число повторений (распространяется на стоящее слева выражение или подвыражение) | {-} | [АБ74]{-} – допускает любые комбинации символов А, Б, 7, 4 произвольной длины.
Количество повторений n | {n} | N{2}“-й” допускает слова типа 25-й, 84-й, 11-й и т.п.
От n до m повторений | {n-m} | N{1-3}“-й” допускает слова типа 5-й, 84-й, 111-й и т.п.
От 0 до n повторений | {-n} | N{-2}“-й” допускает слова типа -й, 84-й, 1-й и т.п.
От n и больше повторений | {n-} | N{2-}“-й” допускает слова типа 25-й, 834-й, 311-й, 34576-й и т.п.
Подвыражение | () |

Описание искомого текста с помощью алфавита

Алфавит - перечисление символов, допустимых в составе цепочки. Этот способ используется, если формат цепочки символов невозможно описать регулярным выражением, или качество изображения недостаточно хорошее, и, как следствие, текст распознается с ошибками. Для элемента Character String можно задать несколько допустимых наборов символов (алфавитов). Если формат текста неизвестен, то допустимые алфавиты не задаются и тогда при поиске элемента рассматриваются все символы.

Для того чтобы описать искомый текст с помощью алфавита:

  1. Выберите режим формирования гипотез. Для того чтобы из цепочки символов, находящейся в области поиска, были сформированы все возможные гипотезы, в том числе пересекающиеся и вложенные, выберите опцию Allow embedded hypotheses. Для того чтобы получить гипотезы максимальной длины, отмените выбор опции Allow embedded hypotheses.

  2. Создайте один или несколько алфавитов.

    Подробнее о создании, редактировании и удалении алфавита

    Для того чтобы создать алфавит:

    1. Щелкните по кнопке Add….

    2. В открывшемся диалоге Add New Alphabet из выпадающего списка Code page выберите кодовую страницу,

    3. Из таблицы символов выберите символы, присутствующие в искомом тексте. Выбранные символы и их количество отображаются в поле Selected on screen/selected in all.

    4. В поле Percentage of alphabet characters задайте долю (число от 0 до 100) символов алфавита, присутствующих в искомом тексте.

    Замечание.
    Возможно задание нескольких алфавитов, но алфавиты не должны пересекаться, т.е. содержать одинаковые символы.

    Для того чтобы удалить алфавит, выберите алфавит в таблице Alphabets и щелкните по кнопке Delete.

    Для того чтобы добавить или удалить символы из алфавита, выберите алфавит в таблице Alphabets и щелкните по кнопке Edit….

  3. В поле Percentage of non-alphabet characters укажите максимально допустимую долю (число от 0 до 100) символов цепочки, которые могут не принадлежать ни к одному из заданных алфавитов.

Вне зависимости от того, каким способом описан искомый текст, можно также задать следующие свойства:

  1. Отметьте опцию Whole words only, чтобы производился поиск только целых слов.

  2. Укажите способ разбиения строки на слова с помощью опции Detect words by interword space. Для автоматического поиска слов отключите данную опцию. При включении данной опции разбиение строки будет производиться там, где промежуток между соседними символами больше или равен значения, указанного в поле Min interword space.

    Замечание. При автоматическом поиске конец слова определяется наличием пробела или прочих символов, разделяющих слова (например, «,», «;», «/», «?», конкретный набор зависит от выбранного языка предраспознавания), или по другим признакам. Для проверки разбивки на слова строк тестовых примеров просмотрите текстовые объекты изображения (меню Image>Show Image Objects> Recognized Words).

  3. В поле Word count укажите количество слов внутри цепочки символов. Количество слов задается с помощью нечеткого интервала. По умолчанию задан интервал {-1,-1,INF,INF} (ищутся гипотезы из любого количества слов).

  4. В поле Max space length укажите максимально допустимую абсолютную длину пробела внутри найденного объекта. Значение данного свойства указывается в используемых единицах измерения. Оценить длину пробела можно с помощью координат соседних объектов, отображаемых в строке состояние при наведении курсора мыши на объект изображения. При поиске текста символы добавляются в цепочку до тех пор, пока расстояние между соседними символами не превышает значения Max space length.

  5. В поле Character count задайте длину цепочки символов (количество символов в цепочке). Параметр задается с помощью нечеткого интервала и оценивает качество гипотезы в зависимости от ее длины.

    Для того чтобы задать нечеткие интервалы в отдельном окне с помощью удобного и наглядного инструмента, воспользуйтесь кнопками [image].

Подробнее о нечетком интервале

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента Character String


Paragraph

Paragraph - элемент, представляющий собой описание абзаца. При поиске рассматриваются все текстовые объекты, пересекающие область поиска.

В дереве элементов элемент типа Paragraph отображается значком [image].

Данный элемент предназначен для поиска абзацев неизвестного содержания. При этом рассматриваются объекты Recognized Words и Recognized Lines, найденные при предраспознавании и находящиеся в области поиска элемента.

Свойства элемента Paragraph, задающие параметры искомого объекта

Свойства, определяющие параметры искомого объекта, задаются в диалоге свойств элемента на закладке Paragraph. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties….

Min line count - минимальное количество строк в абзаце. Задается нечетким интервалом.

Max line count - максимальное количество строк в абзаце. Задается нечетким интервалом.

Alignment - тип выравнивания.

Max disalignment - максимальное отклонение выравнивания. Указывается в используемых единицах измерения.

Allow first line indent - значение отступа в начале абзаца. Указывается в используемых единицах измерения.

Allow "hanging" line - включать ли "висячую" строку в абзац.

Max space in line - максимально допустимая абсолютная длина пробела внутри найденного объекта. Значение данного свойства указывается в используемых единицах измерения. При поиске текста символы добавляются в цепочку до тех пор, пока расстояние между соседними символами не превышает значения Max space in line.

Max interline space - максимальное расстояние между строками. Указывается в используемых единицах измерения.

Max relative interline space - максимальное расстояние между двумя строками по отношению к высоте верхней строки. Если расстояние между строками превышает данное значение, вторая строка не попадает в гипотезу.

Min line height - минимальная высота строки (размер шрифта). Задается нечетким интервалом.

Max line height - максимальная высота строки. Задается нечетким интервалом.

Min line width - минимальная ширина строки. Задается нечетким интервалом.

Max line width - максимальная ширина строки. Задается нечетким интервалом.

Whole words only - определяет, нужно ли включать в гипотезу части слов, которые пересекают границу области поиска. Чтобы не включать в гипотезу обрывки слов, необходимо отметить данную опцию.

Ignore separators - игнорирование сепараторов при поиске абзаца. Если абзацы должны ограничиваться сепараторами, отключите данную опцию.

Remove stamp. Одной из возможных проблем при распознавании текста платежных документов является поставленная сверху на текст печать. Обычно она располагается в правой нижней части текста. Результатом распознавания области изображения закрытой печатью будет большое количество бессмысленных обрывков фраз, т.к. текст на таких участках изображения практически не читается.

Во избежание таких трудностей целесообразно часть текста, закрытую печатью, не включать в блок, а текст, не попавший в блок ввести с изображения вручную (при этом не придется предварительно удалять неверно распознанный текст).

Если свойство Remove stamp выбрано, то при поиске программа проанализирует правый нижний угол области поиска. При обнаружении обрывков текстовых объектов, которые могут свидетельствовать о наличии печати, программма удалит их.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента Paragraph


Object Collection

Object Collection - это элемент, представляющий собой описание совокупности объектов изображения различных типов, каждый из которых удовлетворяет условиям поиска.

В дереве элементов элемент Object Collection отображается значком [image] .

Элемент Object Collection обычно используется для поиска таких объектов, которые нельзя найти при помощи остальных элементов. Элемент Object Collection позволяет найти отдельно стоящие знаки препинания, не объединенные в строки и не выделенные как текстовые объекты, текст, нераспознанный вследствие большого количества мусора. При помощи данного элемента можно искать также нетекстовые объекты, например, картинки и метки.

Свойства элемента Object Collection, задающие параметры искомого объекта

Свойства, определяющие параметры искомого объекта, задаются в диалоге свойств элемента на закладке Object Collection. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties….

Type - позволяет указать тип искомых объектов: Text, Punctuation mark, Picture, Inverted text, Checkmark, Separator, Barcode. При наложении гибкого описания в области поиска будут найдены объекты указанных типов, объекты других типов будут проигнорированы.

Object size - данный набор свойств позволяет ограничить размеры искомых объектов с помощью задания максимальных и минимальных длины и ширины. Указывается длина и ширина объектов, выраженная в используемых единицах измерения. Для выбора значений данных свойств необходимо просмотреть размеры объектов изображений, отображаемых в окне Properties.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента Object Collection


Date

Date - элемент, представляющий собой описание даты. В дереве проекта элемент типа Date отображается значком [image] .

Дата может быть записана в различных форматах, при этом день и год всегда должны быть написаны цифрами, а месяц может быть написан как цифрами, так и словом. Формат записи даты определяется пользователем.

Свойства элемента Date, задающие параметры искомого объекта

Свойства, определяющие параметры искомого объекта, задаются в диалоге свойств элемента на закладке Date. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties…

Группа свойств Format

Date - порядок, в котором день, месяц и год в составе даты следуют друг за другом:

  • Day, month, year,
  • Month, day, year,
  • Year, day, month,
  • Year, month, day.

Замечание. Возможен выбор нескольких вариантов.

Day - данное свойство позволяет указать количество цифр, которое должно быть использовано для указания числа в дате.

Примеры. Если выбрана опция Allow single digit, то при поиске даты будут найдены и 1.09.2005 и 01.09.2005.

Если выбрана опция Two digits only, то при поиске даты будет найдено только 01.09.2005.

Month - количество цифр, которые использованы для задания месяца даты.
Примеры. Если выбрана опция Allow single digit, то при поиске даты будут найдены и 1.9.2005 и 01.09.2005.

Если выбрана опция Two digits only, то при поиске даты будет найдено только 1.09.2005.

Если выбрана опция Word, то месяц может быть указан словом.
Замечание. При выборе данной опции необходимо указать язык, на котором написано название месяца.

Year - количество цифр, которые использованы для задания года даты.

Примеры. Если выбрана опция Two digits, то при поиске даты будут найдены даты, в которых год указан двумя цифрами. Например, 01.09.95.

Если выбрана опция Four digits, то при поиске даты будут найдены даты, в которых год указан четырьмя цифрами. Например, 01.09.1995.

Если выбраны обе опции, то будут найдены и 01.09.95. и 01.09.1995.

Date interval - ограничение даты: from - снизу, to - сверху.

Пример Если в поле from выбрано значение 01.09.1995, а в поле to -значение 1.09.2005, то дата 105.1945 будет проигнорирована при поиске.

Language - язык, использованный для написания месяца даты. Возможные языки - русский, английский, испанский, итальянский, немецкий, французский.
Замечание. Свойство доступно, если для свойства Month выбрано значение Word (указывать месяц словом).

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

Пример .,/

Max space length - позволяет указать максимально допустимую абсолютную длину пробела внутри найденного объекта. Значение данного свойства указывается в используемых единицах измерения. При поиске текста символы добавляются в цепочку до тех пор, пока расстояние между соседними символами не превышает значения Max space length.

Рекомендации по созданию элемента Date

При наложении гибкого описания на изображения выполняется строгий поиск дат, т.е. даты не должны содержать ошибок, лишних символов и т.д., т.е. поиск дат возможен только при условии хорошего качества изображения. Исключение составляют те случаи, когда месяц указывается словом. В этом случае допускается до 20% ошибок в названии месяца.

Совет. Если месяц в дате указан не на русском или английском языке, то для поиска даты можно создать три элемента:

Static Text - в качестве искомого текста (свойство Search Text) указать все названия месяцев, разделив их символом «|», при этом нужно также указать все возможные грамматические формы (январь, января и т.д.).

Два элемента Character String - для них в качестве алфавита указать цифры, в качестве области поиска - области, расположенные, например, справа и слева от элемента Static Text, соответствующего месяцу, в дополнительных условиях поиска следует указать, что искать эти элементы Character String нужно, только если найден элемент Static Text, соответствующий месяцу.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента Date


Group (cоставной элемент)

Составной элемент (группа элементов) - объединение нескольких элементов (называемых подэлементами). Подэлементы могут быть в свою очередь как простыми, так и составными.

В дереве проекта элемент типа Group отображается значком [image].

Замечание. Составными элементами также являются: Header, Footer, FirstFound и Repeatable Group. Header и Footer предназначены для поиска начала и конца документа и могут встретиться в документе только один раз. Repeatable Group - повторяющийся составной элемент. Элемент Labeled Field также может быть представлен в виде группового элемента.

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

Составной элемент, как и обычный, может быть обязательным, необязательным и недопустимым. Если необязательный составной элемент включает обязательный подэлемент, то неналожение подэлемента приводит к формированию нулевой гипотезы составного элемента. Наложение гибкого описания при этом продолжается.

Не рекомендуется оставлять пустые составные элементы (не содержащие подэлементов). В случае обнаружения пустого составного элемента при компиляции шаблона приложение выдаст предупреждение. Если в шаблоне не используются составные элементы Header и Footer, добавляемые по умолчанию, удалите их.

Составной элемент используется для:

  • объединения элементов в группу. Это удобно при отладке независимых частей гибкого описания. Например, все гибкое описание из 100 элементов может содержать всего 3 составных элемента: заголовок, тело и нижнюю часть. Каждый из этих составных элементов в свою очередь будет содержать составные элементы, предназначенных для поиска небольших фрагментов данной логической части гибкого описания. Помимо сокращения перебора вариантов такая структура позволяет обеспечивает удобство отладки и редактирования гибкого описания в дальнейшем, т.к. различные группы будет удобно дополнять и отлаживать независимо друг от друга.
  • обеспечения логической иерархии элементов в дереве, что облегчает навигацию по гибкому описанию.
  • уменьшения числа возможных гипотез элемента, что ускоряет поиск результирующей гипотезы всего FlexiLayout. Объединение элементов в составной элемент, позволяет при поиске последующих элементов рассматривать этот набор подэлементов как единое целое, имеющее собственную завершенную гипотезу (реально состоящую из гипотез подэлементов), а значит, и оценку качества всей группы в целом. Перебор возможных сочетаний гипотез подэлементов между собой происходит внутри группы, а в дальнейшем поиске последующих элементов участвует только заданное число лучших гипотез группы. Число лучших гипотез составного элемента, участвующих в дальнейшем поиске, ограничивается параметром по умолчанию 1.
    Замечание. Не рекомендуется увеличивать максимальное число гипотез, так как это может привести к неконтролируемому росту количества построенных гипотез, и как следствие, к невозможности наложить гибкое описание на изображение.
  • Составной элемент позволяет написать ограничение на область поиска, общее для всех подэлементов. Область поиска конкретного подэлемента будет вычисляться как пересечение области поиска, заданной в самом подэлементе, и области поиска всей группы, в составе которой подэлемент находится.
    Замечание. Возможны случаи, когда пересечение области поиска составного элемента и одного из его подэлементов может при вычислении оказаться пустым, и подэлемент не будет найден. Нужно иметь это в виду при настройке гибкого описания и стараться задавать для составного элемента только простые отношения, например, “Above: PageRect.Top + PageRect.Height/2;” (искать элемент в верхней половине изображения), или не задавать их вовсе.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска


Phone

Phone - элемент гибкого описания, представляющий собой описание номера телефона, который может сопровождаться префиксом ("тел.", "дом. тел." и т.п.) и кодом города/региона, который отделяется от номера скобками (см. рис. ниже). Номер телефона и префикс должны располагаться в одной строке.

В дереве элементов элемент Phone отображается значком [image] .

Свойства элемента Phone, задающие параметры искомого объекта

Свойства, определяющие параметры искомого объекта, задаются в диалоге свойств элемента на закладке Phone. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties….

Для нахождения номера телефона необходимо задать следующие свойства элемента Phone:

Prefixes for phone numbers - позволяет указать возможные префиксы искомого телефонного номера. В качестве префикса телефонного номера допустимы не только слова, но и словосочетания. В префиксе телефонного номера допускается 20% ошибок (т.е. одна ошибка на 5 символов). Для того чтобы:

  • Добавить префикс в список, щелкните мышью по кнопке Add…. В открывшемся диалоге Add Phone Prefix введите префикс телефонного номера;

  • Изменить префикс номера телефона, щелкните по кнопке Edit…. В открывшемся диалоге Edit Phone Prefix, внесите необходимые изменения в префикс телефонного номера;

  • Удалить префикс из списка, щелкните по кнопке Delete.

Missing prefix penalty - позволяет ввести коэффициент (число от 0 до 1), на который будет домножено качество гипотезы, если при наложении гибкого описания префикс телефонного номера не будет найден.

Possible digit separators - в этом поле необходимо указать символы, которые использованы для разделения цифр телефонного номера. Разделитель должен состоять из одного символа. По умолчанию в список допустимых разделителей входит пробел, т.е. цифры номера могут быть разделены пробелами. При вводе символов разделители можно не разделять пробелами или запятыми.

Minimum number of digits - позволяет указать наименьшее допустимое количество цифр в телефонном номере. Гипотезы, содержащие меньшее количество цифр, рассматриваться не будут.

Maximum number of digits - позволяет указать наибольшее допустимое количество цифр в телефонном номере. При поиске телефонного номера будут сформированы только гипотезы, содержащие наибольшее допустимое количество цифр, лишние цифры будут отброшены.

Max space length - позволяет указать максимально допустимую абсолютную длину пробела внутри найденного объекта. Значение данного свойства указывается в используемых единицах измерения. При поиске текста символы добавляются в цепочку до тех пор, пока расстояние между соседними символами не превышает значения Max space length.

Area code/city code brackets - данное свойство допускает присутствие в номере телефона скобок, которыми обычно отделяется код города/региона. Для того чтобы:

  • Ввести символы открывающей и закрывающей скобки, щелкните мышью по кнопке Add…. В открывшемся диалоге Add Phone Code Brackets в поле Opening symbol укажите открывающий символ, в поле Closing symbol - закрывающий;

  • Изменить символы скобок, щелкните по кнопке Edit…. В открывшемся диалоге Edit Phone Code Brackets, внесите необходимые изменения в поля Opening symbol и Closing symbol;

  • Удалить символы скобок из списка, щелкните по кнопке Delete.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента Phone


Currency

Currency - элемент гибкого описания, предназначенный для поиска числовых значений, дробная часть которых содержит две цифры или отсутствует. По умолчанию допускается символ-заменитель дробной части (-), т.е. допустим формат записи: 12.-, такое числовое значение будет распознано как 12.00. Целая часть искомого числа может быть разделена на разряды, по умолчанию в качестве разделителей разрядов целой части допускаются следующие символы: .,' и пробел. Искомое числовое значение может сопровождаться префиксом или суффиксом, т.е. текстовым элементом, предшествующим или следующим за искомым числовым значением. Префикс должен располагаться в той же строке что и искомое числовое значение.
Такой формат обычно имеют денежные суммы, в качестве префикса в них выступает название валюты.

В дереве элементов элемент Currency отображается значком [image].

Свойства элемента Currency, задающие параметры искомого объекта

Свойства, определяющие параметры искомого объекта, задаются в диалоге свойств элемента на закладке Currency. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties….

Для нахождения числового значения необходимо задать следующие свойства элемента Currency:

Currency names - содержит список допустимых названий валют. Название валюты может быть задано, как прописью (словом или словосочетанием), так и условным символом ($, ¥). Для того чтобы:

  • Добавить название валюты в список, щелкните мышью по кнопке Add…. В открывшемся диалоге Add Currency Name введите название валюты;

  • Изменить название валюты, щелкните по кнопке Edit…. В открывшемся диалоге Edit Currency Name, внесите необходимые изменения название валюты;

  • Удалить название валюты из списка, щелкните по кнопке Delete.

Замечание. При поиске названия валюты ошибки не допускаются.

Missing name penalty - позволяет ввести коэффициент (число от 0 до 1), на который будет домножено качество гипотезы, если при наложении гибкого описания название валюты не будет найдено.

Minimum value- позволяет указать наименьшее допустимое значение для искомого числового значения.

Maximum value - позволяет указать наибольшее допустимое значение для искомого числового значения.

Possible fractional part separators - позволяет указать символы, допустимые для разделения целой и дробной части искомого числового значения. Разделитель целой и дробной части должен состоять из одного символа. По умолчанию список допустимых разделителей включает в себя следующие символы: , . и пробел. При вводе символов- разделителей не нужно разделять их какими-либо символами или пробелами.

Max space length - позволяет указать максимально допустимую абсолютную длину пробела внутри найденного объекта. Значение данного свойства указывается в используемых единицах измерения. При поиске текста символы добавляются в цепочку до тех пор, пока расстояние между соседними символами не превышает значения Max space length.

Currency name position - позволяет задать положение названия валюты относительно искомого числового значения: слева (Left of value) и/или справа (Right of value) от него.

Allow missing fractional part - позволяет указать, обязательно ли числовое значение должно содержать дробную часть. Если данная опция выбрана, при наложении гибкого описания на изображении могут быть найдены числовые значения вида будут найдены "12." и "12.-".

Allow missing separator - позволяет указать, обязательно ли в сумме должен присутствовать разделитель дробной и целой части. Если данная опция выбрана, при наложении гибкого описания на изображении могут быть найдены целые числа, не содержащие разделителей.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента Currency


Table

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

В ветви элементов дерева FlexiLayout элемент Table обозначается значком [image].

Подробнее о том как создавать гибкие описания документов, содержащих таблицы см. раздел Работа с таблицами.

См. также

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска

Элемент Table


Repeatable Group (повторяющаяся группа)

Repeatable Group (повторяющаяся группа) - данный элемент предназначен для поиска повторяющихся групп элементов, число повторений может быть заранее неизвестно. Группа может повторяться как на протяжении одной страницы, так и на многостраничном полотне.

В дереве проекта элемент типа Repeatable Group отображается значком [image].

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

Примеры использования такого элемента:

  • Поиск колонтитула на каждой странице многостраничного документа.
  • Поиск неизвестного числа повторяющихся информационных данных (например, таблиц со сложной структурой строки).

Отличия повторяющегося элемента от обычного составного элемента заключаются в дополнительных параметрах поиска и в параметрах повторения.

Свойства элемента Repeatable Group, задающие параметры искомого объекта

Свойства, определяющие параметры искомого объекта, задаются в диалоге свойств элемента на закладке Repeating Group. Для того чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties….

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

Если повторяющаяся группа содержит обязательный элемент, он служит идентификатором наложения экземпляра. Например, если заголовок повторяющейся группы является обязательным элементом, будет создано столько экземпляров группы, сколько заголовков будет найдено.

Качество нулевой гипотезы указывается для одного экземпляра, а не для совокупности всех экземпляров повторяющейся группы. Этот параметр также служит критерием наложения экземпляра: если качество сформированной гипотезы оказывается меньше, чем качество нулевой, экземпляр считается не наложенным.

Чтобы выбрать режим поиска экземпляров по всему документу, отметьте опцию Document mode и задайте следующие свойства:

  • Min repetitions - минимальное число экземпляров группы в документе;

  • Max repetitions - максимальное число экземпляров группы в документе.

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

Для выбора постраничного режима поиска отметьте опцию Page mode. В этом режиме каждый экземпляр может находиться только на одной странице. Например, этот режим можно использовать при поиске колонтитула страницы. При его использовании поиск производится сверху вниз, начиная с первой возможной страницы до последней возможной страницы. В данном режиме доступны следующие параметры поиска:

  • Min repetitions on page – задает минимальное число экземпляров на страницу. Если минимально допустимое число экземпляров на текущей странице не найдено, повторяющаяся группа не считается найденной.
  • Max repetitions on page – задает максимальное число экземпляров на страницу. Если найдено нужное число экземпляров на текущей странице, то поиск на текущей странице заканчивается, поиск переходит на следующую страницу.

Расположение экземпляров элемента

На экземпляры элемента накладывается условие: никакие 2 экземпляра не пересекаются. Это достигается путем принудительного исключения (Exclude) уже ранее найденных экземпляров. Можно задавать ограничение на поиск очередного экземпляра с помощью уже найденных экземпляров на закладке Relations.

Например, можно указать программе, что каждый следующий экземпляр нужно искать ниже предыдущего. Для этого нужно на закладке Relations для повторяющейся группы задать условие, что нужно "искать ниже предыдущего экземпляра":

Замечание: Для какого-либо подэлемента повторяющейся группы при этом рекомендуется задать отношение Nearest к верхнему краю страницы. Иначе выбор следующего экземпляра группы будет произведен программой, как обычно, по критерию лучшего качества экземпляра из всех, попавших в область поиска (ниже последнего найденного экземпляра). А следующий за найденным экземпляр будет искаться уже ниже данного, лучшего по качеству, таким образом, может оказаться, что экземпляры с более низким качеством, расположенные выше лучшего, вообще не будут найдены.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска

Дополнительные условия поиска для Repeatable Group


FirstFound

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

В дереве проекта элемент типа First Found отображается значком [image].

Элемент First Found можно использовать для последовательного поиска одного и того же блока сначала более надежными, а затем менее надежными средствами.

Пример использования такого элемента:

  • Поиск даты на изображении, при котором сначала ищется элемент типа Date, а затем, если элемент типа Date не найден, ищется элемент типа Character String.

Отличие элемента First Found от обычного составного элемента заключается в том, что для элемента First Found не требуется вручную определять условия прекращения поиска и поиска следующего элемента в случае ненахождения предыдущего. Вам требуется лишь поместить нужные подэлементы в групповой элемент First Found в правильном порядке. Условия продолжения и прекращения поиска будут выполнены автоматически.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента First Found


Labelled Field

Labeled Field

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

  • Static Text , содержащий заголовок поля. Данный элемент является вспомогательным и предназначен для поиска элемента, содержащего значение поля;
  • White Gap , описывающий просвет между заголовком и значением поля. Данный элемент является вспомогательным и предназначен для поиска элемента, содержащего значение поля;
  • Элемент, содержащий значение поля. Тип данного элемента определяется значением поля. Данный элемент является основным и предназначен для извлечения значения поля.

В дереве элемент Labeled Field отображается значком [image].

При необходимости можно представить элемент Labeled Field в виде группы.

При поиске заголовка рассматриваются объекты Recognized Words и Recognized Lines, найденные при предраспознавании и находящиеся в области поиска элемента. После нахождения заголовка осуществляется поиск поля, содержащего значение элемента.

Свойства заголовка элемента

Заголовок является элементом типа Static Text и имеет соответствующие свойства.

Свойства заголовка указываются на закладке Label диалога свойств элемента. Чтобы открыть диалог свойств элемента, щелкните правой кнопкой мыши по элементу в окне FlexiLayout и выберите в контекстном меню команду Properties….

Расположение поля относительно заголовка

Расположение поля относительно заголовка элемента указывается на закладке Field Position.

Field position - расположение поля относительно заголовка (справа, слева, сверху или снизу).

Field aligment - выравнивание области поиска поля относительно прямоугольника заголовка. Варианты значений зависят от значения поля Field position:

  • если поле расположено справа или слева, то возможно выравнивание по верхнему или нижнему краю и по середине;
  • если поле расположено выше или ниже, то возможно выравнивание по правому или левому краю и по середине.

Search area width - ширина области поиска поля (в выбранных единицах измерения).

Search area height - высота области поиска поля (в выбранных единицах измерения).

Min indent - минимальный промежуток между заголовком и полем (в выбранных единицах измерения).

Detect indent size - признак использования для определения расстояния между полем и заголовком элемента White Gap. Если опция отключена, область поиска значения начинается с расстояния, указанного в поле Min indent. В противном случае начиная с этого расстояния формируется вспомогательный элемент White Gap, и область поиска начинается после него.

Параметры поиска поля

Параметры поиска поля указываются на закладке Field Position.

Content type - тип поля. В зависимости от типа поля закладка Field Position может содержать дополнительные параметры:

Fixed variants

Данный тип совпадает с типом Static Text и имеет соответствующие свойства.

Number

Данный тип имеет следующие свойства:

Minimum number of digits - минимальное количество цифр.

Maximum number of digits - максимальное количество цифр.

Max error percentage - максимально допустимый процент ошибок.

Allow separators - признак наличия в числах разделителей. При поиске к цифровому алфавиту добавляется алфавит разделителей с долей 30%.

Currency

Данный тип имеет свойство Currency names. Это свойство полностью совпадает с одноименным свойством типа Currency.

Phone

Данный тип имеет свойства Min number of digits и Max number of digits, совпадающие с одноименными свойствами типа Phone.

Regular expression

Данный тип имеет следующие свойства:

Regular expression - выражение, задающее шаблон поиска. Данное свойство совпадает с одноименным свойством типа Character String.

Min length - минимальная длина строки.

Max length - максимальная длина строки.

См. также

Создание и удаление элементов

Обзор свойств элементов FlexiLayout

Область поиска

Дополнительные условия поиска элемента Labeled Field


Region

Region - элемент гибкого описания, представляющий собой область на изображении без ограничений на ее содержимое. Область элемента может состоять из нескольких несвязанных регионов. В дереве элемент Region отображается значком [image].

Элемент применяется в гибких описаниях для вычисления регионов вне зависимости от содержащихся в них объектов.

См. также

Создание и удаление элементов
Обзор свойств элементов FlexiLayout
Область поиска
Дополнительные условия поиска элемента Region


Элементы Header и Footer

Элементы Header и Footer предназначены для определения начала и конца многостраничных документов. Они представляют собой групповые элементы и обладают такими же свойствами, но в отличие от составного элемента могут встречаться в гибком описании только один раз.

В дереве элементов Header отображается значком [image], а Footer - значком [image]. Header и Footer располагаются в начале дерева элементов.

Чтобы добавить элемент Header/Footer, выберите пункт Header/Footer локального меню элементов гибкого описания.

Составной элемент можно превратить в Header или Footer с помощью команд локального меню элементов гибкого описания Convert Element to... > Header или Footer. В свою очередь, Header и Footer можно сделать обычными составными элементами с помощью команды Convert Element to... > Group.

Подробнее

Многостраничное гибкое описание

Поиск начала и конца документа с помощью элементов Header и Footer


Область поиска элемента

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

Область поиска может быть абсолютной, т.е. задаваться координатами на изображении, или относительной, т.е. задаваться относительно других элементов. При задании области поиска относительно других элементов можно использовать все элементы любого типа, находящиеся в дереве элементов выше данного элемента, т.к. объект изображения, соответствующий данному элементу, может быть найден на основе информации об уже найденных объектах, соответствующих предыдущим элементам.

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

Задание абсолютных координат области поиска

Абсолютная область поиска задается на закладке Search Constraints диалога свойств элемента.

Для многостраничных документов можно выбрать диапазон страниц, на которых будет производиться поиск элемента. Область поиска на странице может быть задана с помощью абсолютных локальных координат. Это позволяет сделать свойство Region.

Исключение элемента из области поиска

Свойство Exclude elements позволяет исключить из области поиска регион найденной гипотезы элемента. Если гипотеза исключенного элемента не найдена, то данное условие не повлияет на область поиска элемента.

Задание области поиска относительно другого элемента

Относительная область поиска задается на закладке Relations диалога свойств элемента. Чтобы задать относительную область, надо указать опорный элемент (Reference element), относительно которого будет задана граница, и определить условия типа "левее", "правее", "выше", ниже" (свойство Relation). Для любого элемента можно задать любое количество областей поиска. Положение всех границ области поиска можно задать относительно разных элементов. Если относительная область поиска не задана, то поиск объекта изображения выполняется по всему изображению. Каждое из условий задает полуплоскость, пересечение которой с областью всего изображения дает прямоугольник области поиска. Пересечение всех условий дает область поиска данного элемента.

Положение границы области поиска можно задать точнее с помощью свойств Element boundary и Offset.

Свойство Element boundary позволяет задать границу области поиска относительно границы элемента: верхней, нижней, правой или левой. По умолчанию это свойство имеет значение <whole>.

При вычислении относительной области поиска в процессе наложения гибкого описания возможна ситуация, когда опорный элемент, выбранный в свойстве Reference element, не найден на изображении. Рассмотрим алгоритм вычисления относительной области поиска для ситуаций, когда гипотеза опорного элемента найдена, и когда она не найдена. Если опорный элемент необязателен, для него в случае отсутствия на изображении подходящих под описание объектов будет сформирована нулевая гипотеза. При этом регион нулевой гипотезы опорного элемента будет совпадать с описывающим прямоугольником его собственной области поиска. В случае найденной гипотезы опорного элемента регион гипотезы строится на основе регионов найденных объектов, вошедших в гипотезу, и располагается внутри его области поиска.

Если гипотеза опорного элемента найдена, и в условии, задающем относительную область поиска, свойство Element boundary имеет значение <whole>, то условие вида Right of означает "правее правой границы опорного элемента", условие вида Left of означает "левее левой границы опорного элемента" и т.д., т.е. правее, левее, ниже или выше всей (<whole>) найденной гипотезы. Если гипотеза опорного элемента не найдена, это означает, что она с равной вероятностью могла бы располагаться в любом месте области поиска опорного элемента (но не могла бы находиться за пределами этой области). Таким образом, условие Right of, т.е "правее" относительно ненайденной гипотезы, означает "правее любой области, где могла бы располагаться гипотеза опорного элемента". Математически это интерпретируется как "правее левой границы области поиска опорного элемента". Аналогично условие вида Left of относительно ненайденной гипотезы означает "левее правой границы области поиска опорного элемента", условие вида Below означает "ниже верхней границы области поиска опорного элемента", Above - "выше нижней границы области поиска опорного элемента".

Если же в условии, задающем относительную область поиска, свойство Element boundary имеет одно из конкретных значений "Left", "Top", "Right" или "Bottom", то область будет вычисляться относительно указанной границы гипотезы опорного элемента как для найденной, так и для ненайденной гипотезы. Например, для ненайденной гипотезы условие вида Right of при значении свойства Element boundary, равном "Right", означает "правее правой границы области поиска опорного элемента".

Свойство Offset позволяет сместить границу области поиска на некоторое расстояние. Положительное значение параметра Offset означает смещение границы области поиска в направлении, совпадающем с направлением, заданным в свойстве Relation. Отрицательное значение сдвигает границу в направлении, противоположном направлению, заданному в свойстве Relation.

Пример.
В гибком описании создан элемент YourPlanetName типа Static Text, позволяющий найти на изображении заголовок поля YOUR PLANET NAME:. Требуется найти текст, введенный в это поле при заполнении (в данном случае "MARS (satellite Phobos)"). Создадим элемент Planet типа Character String и зададим область поиска правее элемента Planet, т.е. для свойства Element boundary выберем значение Right of. Положение границы области поиска см. на рис. ниже.

Сдвинем границу области поиска вправо, т.е. в направлении, совпадающем с направлением, заданном в отношении Right of. Для этого выберем положительное значение свойства Offset, например, 200. Новое положение границы показано на рис. ниже.

Сдвинем границу области поиска влево, т.е. в направлении, противоположное направлению, заданному в отношении Right of. Для этого выберем положительное значение свойства Offset, например, -200. Это положение границы области поиска показано на рис. ниже.

Выбор элемента, наиболее близко расположенного к указанному объекту

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

Просмотр области поиска

При редактировании отношения или выборе отношения в таблице Relations выбранное отношение отображается в окне изображения. При выборе нескольких отношений отображается область поиска, общая для всех выбранных отношений. В режиме эталонной разметки вы также можете изменять границу отступа непосредственно в окне изображения, передвигая границу отступа с помощью мыши.
При наложении гибкого описания программа сначала вычисляет область поиска элемента, исходя из всех условий, заданных для данного элемента. Затем выполняется проверка соответствия объектов изображения, находящихся в области поиска, свойствам, задающим параметры искомого объекта. Если при наложении гибкого описания на изображении найден неверный объект, то возможность просмотра области поиска помогает понять причину этого.

Для того чтобы увидеть область поиска элемента после наложения гибкого описания, щелкните правой кнопкой мыши по гипотезе, соответствующей элементу, и выберите в локальном меню команду Show Search Area. Область поиска будет показана в окне Image.

Подробнее

Задание абсолютной области поиска

Задание области поиска относительно других элементов

Выбор экземпляров повторяющейся группы в качестве опорного или исключаемого элемента

Дополнительные условия поиска


Задание области поиска

Абсолютная область поиска задается на закладке Search Constraints диалога свойств элемента. Диалог свойств элемента открывается при создании нового элемента.

Для того чтобы открыть диалог свойств уже существующего элемента:

  • щелкните правой кнопкой мыши по элементу в ветви элементов дерева FlexiLayout и выберите в контекстном меню команду Properties…, в открывшемся диалоге перейдите на закладку Search Constraints или
  • дважды щелкните мышью по элементу в ветви элементов дерева FlexiLayout, в открывшемся диалоге перейдите на закладку Search Constraints.

Задание абсолютных координат области поиска

В диалоге свойств элемента на закладке Search Constraints выберите опцию Absolute search area constraints.

Для многостраничных документов можно выбрать диапазон страниц, на которых будет производиться поиск элемента. Выберите одно из значений в выпадающем списке Pages: All, Even, Odd, Last или Range. Если выбрано значение Range, задайте номера страниц через запятую или интервал через дефис, например, 2, 4, 6-8, 15.

Область поиска на странице может быть задана с помощью абсолютных координат. Это позволяет сделать свойство Region. Введите координаты области в формате [left, top, right, bottom]. В данном поле можно задать координаты нескольких прямоугольников. Можно также оставить значение <whole page> для поиска элемента на всей области страниц из указанного диапазона. Для вычисления абсолютных координат поиска объектов можно воспользоваться инструментом Циркуль.

После задания свойств области поиска нажмите кнопку Add. Область появится в списке Search areas. Чтобы отредактировать область поиска задайте новые значения в списке Pages или в поле Region, нажмите кнопку Replace. Если в поле Region ничего не задано, поиск элемента осуществляется на всей области страниц из указанного диапазона, как если бы значение поля было <whole page>.

Исключение элемента из области поиска

Свойство Exclude elements позволяет исключить из области поиска регион найденной гипотезы элемента. Если гипотеза исключенного элемента не найдена, то данное условие не повлияет на область поиска элемента.

Замечание. Исключение из этого правила составляют ситуации, когда пользователь задал дополнительные условия на отдельные границы гипотезы исключаемого элемента в секции Advanced pre-search relations. Тогда в случае ненахождения исключаемого элемента из области поиска будет исключен внутренний прямоугольник области поиска этого элемента. Подробнее о внутреннем прямоугольнике см. Нечеткий прямоугольник.

Для исключения из области поиска региона элемента щелкните по кнопке Add…, расположенной рядом с группой Exclude elements. В открывшемся диалоге Select Element to Exclude выберите элемент, регион которого необходимо исключить из области поиска.

Подробнее

Задание области поиска относительно других элементов

Дополнительные условия поиска


Относительная область поиска элемента

Область поиска относительной других элементов задается на закладке Relations диалога свойств элемента. Диалог свойств элемента открывается при создании нового элемента. Чтобы добавить новое отношение, нажмите кнопку Add. Откроется диалог Add New Relation....

Для редактирования ранее созданного отношения нажмите Edit.

Нажмите кнопку Duplicate, если вы хотите создать копию выбранного отношения.

Для удаления выбранного отношения используйте кнопку Remove.

Для того чтобы открыть диалог свойств уже существующего элемента:

  • щелкните правой кнопкой мыши по элементу в ветви элементов дерева FlexiLayout и выберите в контекстном меню команду Properties…, в открывшемся диалоге перейдите на закладку Relations или
  • дважды щелкните мышью по элементу в ветви элементов дерева FlexiLayout, в открывшемся диалоге перейдите на закладку Relations.

Выбор границы области поиска относительно другого элемента

В диалоге добавления или редактирования отношения укажите параметры отношения:

  1. В поле Type выберите тип отношения: Left of, Right of, Above, Below.
  2. Выберите Reference element: нажмите на кнопку [image] справа от поля и в открывшемся диалоге выберите элемент, относительно которого будет задана граница области поиска. О том, как задать область поиска относительно подэлементов повторяющейся группы, см. "Выбор повторяющейся группы в качестве опорного элемента".
  3. В поле Reference boundary выберите границу региона элемента, относительно которой будет определено положение границы области поиска.
  4. Задайте величину смещения границы области поиска в поле Offset.
  5. Нажмите кнопку Add Relation для добавления нового отношения или Save Changes для сохранения измениний после редактирования существующего отношения. Все созданные отношения отображаются в таблице Relations.

Вы также можете выбрать тип отношения, границу региона и тип смещения области поиска (нулевое, положительное или отрицательное), используя наглядные изображения в диалоговом окне Choose relation parameters by picture. Чтобы открыть этот диалог, отметьте опцию Use preview to adjust relation и нажмите кнопку Choose… в правой части окна. На закладках Left of, Right of, Above и Below наглядно показано взаимное расположение элемента и области поиска и изменение области поиска при различных вариантах расположения границы региона и смещении границы области поиска на положительную или отрицательную величину.

Показать диалог

Замечание. Элементы, выбранные в качестве опорных элементов, а также элементы, исключенные из области поиска должны быть расположены выше по дереву элементов, чем элемент, для которого задается это условие.

Совет
Для удобства работы со свойствами элементов программа ABBYY FlexiLayout позволяет открывать одновременно несколько диалогов свойств. Для того чтобы скопировать свойство, задающее границу области поиска, выделите его в таблице Relations и перетащите в диалог свойств другого элемента, также возможно копирование условий, заданных на закладке Advanced.

Визуализация отношений

При редактировании отношения или выборе отношения в таблице Relations выбранное отношение отображается в окне изображения. Опорный элемент в окне изображения выделяется жирной рамкой, область поиска выделяется зеленым фоном.

Показать диалог

При изменении границы региона и значения отступа происходит синхронное изменение области поиска в окне изображения.

В режиме эталонной разметки (Reference layout) вы также можете изменять границу отступа непосредственно в окне изображения, передвигая границу отступа с помощью мыши. В режиме Matched layout отношение в окне изображения доступно только для просмотра без возможности редактирования отступов.

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

Показать пример

Выбор элемента, наиболее близко расположенного к указанному объекту

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

Для того, чтобы при поиске элемента производился выбор элемента, наиболее близкого к указанному объекту, отметьте опцию Nearest и выберите объект из выпадающего списка поля To объект, наиболее близко к которому должен быть расположен искомый элемент: Element, X coordinate, Y coordinate, Point, Page top edge, Page bottom edge, Page left edge, Page right edge. Если вы выбрали Element, то введите его название в поле Reference element. Для объектов X coordinate и Y coordinate задайте соответствующую координату, для объекта Point задайте координаты точки.

Замечание. Элемент, наиболее близкий к данному элементу, выбирается по наименьшему расстоянию между центрами.

См. также Использование функций Nearest и FuzzyQuality для поиска элементов.

Подробнее

Задание абсолютной области поиска

Дополнительные условия поиска


Выбор экземпляров повторяющейся группы в качестве опорного или исключаемого элемента

Выбор экземпляров повторяющейся группы в качестве опорного, исключаемого или Source элемента

Диалог выбора элемента используется при выборе:

  • опорного элемента на закладке Relations в диалоге свойств элемента;
  • исключаемого элемента на закладке Search Constraints в диалоге свойств элемента;
  • Source element в диалоге свойств блока.

Для обычного элемента используется его имя. Для элемента Repeatable group вместо имени элемента при построении отношений используется ссылка на гипотезу повторяющейся группы с учетом номера экземпляра.

Одному элементу типа Repeatable group в дереве элементов в процессе наложения шаблона будут соответствовать несколько экземпляров гипотез этой повторяющейся группы, так что при вычислении отношений других элементов с Repeatable group необходимо задавать, с каким именно экземпляром мы хотим вычислить отношение. Ссылка отличается от полного имени тем, что после имени Repeatable group через точку стоит описание экземпляра группы, к которому нужно обращаться.

Экземпляр может быть:

  • LastFound - последний найденный на момент генерации гипотезы данного подэлемента экземпляр Repeatable group);
  • AllInstances - все найденные экземпляры Repeatable group;
  • Instance(#) - конкретный номер экземпляра;
  • CurrentInstance - текущий экземпляр, используется при построении отношений некоторого подэлемента Repeatable group для обращения к текущей гипотезе самой этой группы, т.е. ее уже найденным подэлементам, расположенным по дереву выше данного подэлемента.

Синтаксис ссылки в диалоге выбора элемента аналогичен синтаксису, используемому в языке в коде Advanced - секций для обращения к экземплярам Repeatable group и их подэлементам. Пример ссылки:

SearchElements.RepeatableGroup.LastFound.RepeatableGroup1.Instance(1). StaticText.

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

При выборе CurrentInstance для дочерней группы, у вышестоящих групп автоматически выставляется CurrentInstance. При изменении у верхней группы CurrentInstance на что-либо другое, у всех дочерних групп экземпляры сбросятся на значение по умолчанию (LastFound).

При выборе AllInstances для вышестоящей группы, у всех дочерних групп выставляется AllInstances. При изменении у дочерней группы AllInstances на другое значение, у вышестоящих групп AllInstances сбросится на значение по умолчанию (LastFound).

При написании ссылок вручную в коде Advanced нужно тоже иметь в виду, что CurrentInstance можно ставить только родительской группе, и если стоит CurentInstance то у всех групп выше должен тоже стоять CurrentInstance. А если у группы стоит AllInstances, то у всех нижестоящих тоже должен быть AllInstances. При выборе экземпляров групп из диалога такое поведение достигается автоматически.

Подробнее

Задание абсолютной области поиска

Задание области поиска относительно других элементов

Дополнительные условия поиска


Генерация отношений элемента

Помимо задания отношений элемента вручную, вы также можете обучить отношения элемента на основе эталонной разметки страниц, выбранных для обучения.

Для чтобы отношения элемента можно было обучить автоматически:

  • эталонная разметка (Reference layout) должна содержать элементы, с которыми нужно создать отношения;
  • напротив страниц, на которых будет проводиться обучение, должна стоять галочка в поле Used For Training на закладке Batch.

Для генерации отношений элемента:

  1. В контекстном меню элемента выберите пункт Train Element > Generate Element Relations. Откроется диалоговое окно Select Element.
  2. Выберите элементы, с которыми нужно создать отношения и добавьте их в правую часть окна с помощью кнопки [image] (для добавления выбранного элемента) или [image] (для добавления всех элементов) или двойным щелчком мыши по выбранному элементу. В правой части окна выбранные элементы выделяются жирным.The selected elements are highlighted bold on the left side of the window.
  3. Нажмите OK. Откроется диалоговое окно Element Relations Selection.
  4. Это диалоговое включает список Reference elements, содержащий элементы, с которыми были созданы отношения, список New Relations, содержащий отношения, полученные в результате обучения, и список Old Relations, содержащий ранее созданные отношения.

  5. Выберите отношения из списка, чтобы увидеть его отображения в окне изображения. Опорный элемент в окне изображения выделен жирной рамкой, область поиска выделена зеленым фоном.

    Замечание. При выборе нескольких отношений отображается пересечение этих отношений. Область пересечения отношений выделена зеленым фоном, части отношений за границами пересечения выделены голубым фоном.

  6. Используйте кнопки [image] и [image], чтобы посмотреть визуализацию отношений на предыдущей или следующей выбранной для обучения странице соответственно. Для перехода на страницу с указанным номером, нажмите кнопку Go to Page….
  7. Поставьте галочку напротив отношений, которые вы хотите использовать, и нажмите кнопку Save Changes.

Замечание. Элементы, с которыми создаются отношения, должны быть расположены выше по дереву элементов, чем обучаемый элемент. Все элементы должны быть неповторяющимися.


Обучение отступов отношений

При задании относительной области поиска элементов или генерации отношений элементов определяется значение отступа для области поиска. Вы можете скорректировать отступы отношений на основе эталонной разметки страниц, выбранных для обучения. Отступы рассчитываются для всех использующих (отмечен флаг Enabled) отношений с неповторяющимися элементами.

Для того чтобы отступы отношений можно было обучить автоматически:

  • эталонная разметка (Reference layout) должна содержать элементы, для которых необходимо обучить отступы отношений.
  • напротив страниц, на которых будет проводиться обучение, должна стоять галочка в поле Used For Training на закладке Batch.

Для обучения отступов отношений:

  1. В контекстном меню элемента выберите пункт Train Element > Correct Relations Offsets. Откроется диалоговое окно Element Parameters Selection.
  2. В этом диалоговом окне отображается список обученных отношений, а также новые и старые значения отступов для этих отношений.

  3. В выпадающем списке Show выберите modified relations only для отображения только тех отношений, значения которых изменились, или all relations для отображения всех отношений элемента.
  4. Поставьте галочку слева от имени отношения, чтобы использовать результат обучения отношения. Вы также можете поставить галочку рядом с заголовком Relation для выбора всех измененных отношений.
  5. Выберите отношения из списка, чтобы увидеть его отображения в окне изображения. Опорный элемент в окне изображения выделен жирной рамкой, область поиска выделена зеленым фоном. При выборе нескольких отношений отображается пересечение этих отношений. Область пересечения отношений выделена зеленым фоном, части отношений за границами пересечения выделены голубым фоном.

    Замечание: Если галочка рядом с именем отношения отмечена, отображается новое значение отступа. Если галочка не отмечена, отображается старое значение.

  6. Используйте кнопки [image] и [image], чтобы посмотреть визуализацию отношений на предыдущей или следующей выбранной для обучения странице соответственно. Для перехода на страницу с указанным номером, нажмите кнопку Go to Page….
  7. Нажмите кнопку Apply Changes, чтобы сохранить новые значения отступов для выбранных отношений.


Дополнительные условия поиска

Свойства элементов можно также задавать с помощью выражений, написанных на языке описания FlexiLayout.

Дополнительные условия поиска можно задать на закладке Advanced диалога свойств элемента.

Замечание. Для элемента Repatable Group предусмотрена также закладка Advanced for All Instances, см. Дополнительные условия поиска для Repeatable Group.

Для задания дополнительных условий поиска в программе предусмотрен удобный редактор для ввода кода, который обладает возможностью подсвечивать разным цветом разные типы лексем, предлагать возможные методы и свойства (подсказка по точке), а также производить поиск и замену любых строк.

Подсказка по точке

Технология подсказки по точке применяется в программе FlexiLayout Studio 10 при написании пользователем макросов на специально разработанном объектно-ориентированном языке описания FlexiLayout. Технология предназначена для облегчения ввода имен методов и полей для объектов различных типов, предусмотренных в языке.

Если написанное пользователем выражение является именем объекта, то при вводе после имени объекта символа точка (.) пользователю показывается выпадающий список, содержащий имена методов и полей данного объекта.

Если пользователь начинает вводить символы с клавиатуры, то выделение в списке автоматически перемещается на то имя, которое имеет в качестве префикса введенный после точки текст (т.е. начинается с этого текста).

Нажатие на клавиши Пробел, Tab, Enter, а так же ввод символов разделителей (~!#%^&*()-=+\|/?><{}[];:.,'"), которые не могут быть частью имени метода или поля, приводит к замене введенного пользователем после точки текста на имя метода или поля, выделенного в списке. Также подстановка происходит при двойном щелчке мышью по имени в списке.

Нажатие клавиш «вправо», «влево», Insert, Delete, Home, End, Page Up, Page Down и Escape, а также клик мышью вне списка и использование клавиатурных ускорителей (например, Ctrl+V для команды Paste) приводит к закрытию списка без подстановки имени в текст.

Клавиши «вверх» и «вниз» перемещают выделение по списку.

С помощью клавиши Backspace можно стирать введенные после точки символы, при этом список не исчезает. Если, однако, стереть саму точку, то список закроется.

Дополнительные условия поиска делятся на два вида:

  1. Advanced pre-search relations - задание параметров поиска элемента и построение области поиска.
  2. Advanced post-search relations - возможность оштрафовать сформированную гипотезу в зависимости от свойств элемента.

Определяемые пользователем свойства

Определяемое пользователем свойство - типизированная переменная, принадлежащая элементу. Данные свойства задаются в разделе User-defined properties на закладке Advanced и используются в дополнительных условиях поиска. Изменение значения такого свойства возможно только в рамках элемента, которому он принадлежит. Использовать значение свойства можно в дополнительных условиях поиска самого элемента и элементов, расположенных в дереве ниже него. Подробная информация об определяемых пользователем свойствах элементов приведена в разделе Определяемые пользователем свойства элемента.


Advanced pre-search relations

Advanced pre-search relations - условие, задающее область поиска и свойства элемента с помощью выражения написанного на языке описания FlexiLayout. Данное свойство задается в диалоге Свойства каждого элемента, на закладке Advanced.

Программный код, задающий условия Advanced pre-search relations, выполняется непосредственно перед поиском объекта изображения, соответствующего элементу. Перед наложением гибкого описания на изображение свойства элементов, заданные в диалогах свойств на всех закладках (кроме Advanced) транслируются программой в исполняемый программный код. Этот код можно увидеть, нажав на кнопку Code на закладке Advanced. Дополнительный код, записанный в секции Advanced pre-search relations, выполняется перед поиском гипотез элемента сразу после кода, полученного при трансляции свойств из диалога. Поэтому, если диалог и код задают один и тот же параметр, то при поиске будет использоваться значение параметра из кода. Если в разделе Advanced Relations некоторый параметр поиска не упоминается, значит, используется его значение из диалога.

Замечание. Дополнительные условия, заданные на закладке Advanced в разделе Advanced pre-search relations должны ссылаться только на элементы, описанные в дереве элементов выше данного. Исключение составляют подэлементы одной и той же повторяющейся группы (Repeatable Group), которые могут ссылаться на предыдущие экземпляры подэлементов, находящихся в той же группе ниже данного.

Примеры использования условий Advanced pre-search relations:

Задание различных значений для одного и того же параметра.

Иногда в зависимости от различных обстоятельств (например, размера изображения, информации о том, какие гипотезы каких элементов уже сформированы, свойств сформированных гипотез других элементов и т.п.) одному и тому же параметру необходимо присвоить различные значения. Сделать это можно, применяя, оператор условного перехода.
Например:

if Element1.IsNull then {
MaxErrors: 3, 0.25;
} else {
MaxErrors: 5, 0.5;
}

Ограничение области поиска элемента.

Область поиска может быть задана при помощи любых типов, описывающих область на изображении: Rect, RectArray, Region. В том числе ее можно ограничить при помощи вычисляемого выражения, возвращающего любой из этих типов. Результат вычисления выражения передается в качестве аргумента в функцию RestrictSearchArea().
Например:
  1. RestrictSearchArea( Rect(Rect( Page( 1 ).RectGlobal.Left, Page( 1 ).RectGlobal.Top+20*mm, Element1.Left.Start, Element2.Ycenter.Start ) );
  2. let rect1 = Element1.Rect;
    let rect2 = Element2.Rect;
    RestrictSearchArea( rect1 or rect2 );
Отмена поиска объекта, соответствующего элементу.

Существуют документы, на которых наличие одного объекта на изображении исключает существование другого. Возможны и другие ситуации, в которых искать объект, соответствующий элементу, нужно только при выполнении определенных условий. Подобная функциональность обеспечивается существованием в разделе Advanced Pre-Search Relations команды DontFind(). После выполнения этой команды объект, соответствующий элементу, не ищется, и для него сразу создается единственная нулевая гипотеза.
Например:

if Element1.IsNull() then DontFind().

Выбор гипотезы.

Часто встречается ситуация, когда несколько объектов изображения подходят под описание элемента. Иногда бывает нужно из всех гипотез элемента оставить лишь ту, которая наиболее близко располагается к некоторому другому объекту или некоторой точке изображения. Выбрать такую гипотезу позволяют функции Nearest, NearestX, NearestY.
Например:

Nearest( [имя элемента] ) - задает имя элемента, ближайшую гипотезу к которому нужно выбрать.

Nearest( x1, y1 ) - задает координаты точки пространства, ближайшую гипотезу к которой нужно выбрать.

NearestX( x1 ) - задает X-координату вертикальной прямой, ближайшую гипотезу к которой нужно выбрать.

NearestY( y1 ) - задает Y-координату горизонтальной прямой, ближайшую гипотезу к которой нужно выбрать.

Замечание. Невозможно использовать несколько функций Nearest одновременно.

Использование условий Advanced pre-search relations для многостраничных документов.

Многостраничный документ рассматривается в программе как одно целое и поиск элементов может производиться не зависимо от страницы, на которой элементы находятся.
Например:
  1. Чтобы задать, что элемент находится в нижней половине страницы (но неизвестно какой):
    Below: PageRect.Top + PageRect.Height / 2; (см. описание функции PageRect)
  2. Чтобы задать, что элемент находится на последней странице документа (можно написать только в основной части шаблона, после элементов Header и Footer, если они есть):
    RestrictSearchArea( Page( PagesCount ).RectGlobal );
  3. Чтобы задать, что элемент находится на странице, где начинается элемент SearchElements.OtherElement:
    if SearchElements.OtherElement.IsFound then RestrictSearchArea( WholePage, SearchElements.OtherElement.Pages.Start );
  4. Чтобы задать, что элемент на каждой странице может располагаться ниже экземпляров гипотез повторяющейся группы SearchElements.RepeatableGroup:
    Below: SearchElements.RepeatableGroup.AllInstances.PageAreaGlobal( PageNumber ).Region.Bottom;
  5. Чтобы задать, что элемент на каждой странице может располагаться ниже тела каждой подтаблицы таблицы SearchElements.Table:
    Below: SearchElements.Table.AllSubTables.Body.PageAreaGlobal( PageNumber ).Bottom;

См. такжее

Язык описания FlexiLayout


Advanced post-search relations

Advanced post-search relations - условие, позволяющее оштрафовать сформированную гипотезу в зависимости от свойств элемента, то есть задача данного условия - откорректировать качество сформированной гипотезы.

Внимание!

Принципиальное отличие условий Advanced post-search relations от условий Advanced pre-search relations заключается в том, что его выполнение происходит после формирования гипотезы данного элемента.

Замечание. При написании кода условий Advanced post-search relations, имя данного элемента не пишется. Например, обращение к свойству Width элемента Element1 условий Advanced post-search relations элемента Element1 выглядит как Width.

Условие Advanced post-search relations выполняется для каждой сформированной гипотезы элемента независимо от других. Различные гипотезы одного и того же элемента нельзя сравнивать между собой, можно лишь повлиять на оценку качества конкретной рассматриваемой гипотезы, изучив ее свойства и наложив на нее определенные условия.

Любая команда, условия Advanced post-search relations возвращает оценку качества гипотезы данного элемента. Оценки, полученные при выполнении разных условий, перемножаются между собой.

Замечание. Дополнительные условия, заданные на закладке Advanced в разделе Advanced post-search relations должны ссылаться только на сам элемент и на элементы, описанные в дереве элементов выше данного. Если в ходе проверки найдено несоответствие данному требованию, то программа укажет некорректный элемент.

С помощью данного раздела можно накладывать следующие ограничения на гипотезу элемента:

Ограничения на свойства гипотезы

Например:
Условие Width > 5*cm для гипотезы длиной 3cm вернет оценку 0, что приведет к завершению формирования данной цепочки гипотез для элемента и его подэлементов.

Проверка свойств гипотезы

Например:
Следующее условие проверяет высоту гипотезы и в зависимости от результата ограничивает ширину гипотезы или не изменяет ее.
if Height > 3*cm then Width > 5*cm;

Управление качеством гипотезы

В разделе Advanced post-search relations можно при необходимости корректировать качество данной гипотезы данного элемента. Это делается при помощи вызова функции Quality(q), где q - переменная типа Quality. При выполнении данной команды качество гипотезы будет домножено на q.

Внимание!
Без необходимости пользоваться данной возможностью не рекомендуется.


Дополнительные условия поиска для Repeatable Group

В диалоге свойств элемента Repeatable Group есть две закладки для задания дополнительных условий – Advanced и Advanced for All Instances. На закладке Advanced можно задать дополнительные условия поиска для отдельных экземпляров группы, а на закладке Advanced for All Instances - для всей коллекции.

В разделе Pre-search relations можно использовать все методы, доступные обычной группе. В том числе можно описывать отношения с уже найденными экземплярами, например:

// Каждый следующий экземпляр ниже предыдущего

if SearchElements.RepeatableGroup.HasInstances then {

Below: SearchElements.RepeatableGroup.LastFound, 0 * dot;

}

В разделе Pre-search relations for all instances можно использовать методы:

  • MinRepetitions

  • MaxRepetitions

  • PaginalMode

  • MinRepetitionsOnPage

  • MaxRepetitionsOnPage

В разделе Post-search relations можно давать оценку очередному экземпляру группы, а в разделе Post-search relations for all instances - всем найденным экземплярам.

Пример для Post-search relations:

// Проверка гипотез подэлементов StaticText1 и StaticText2 внутри повторяющейся группы. Используется последний найденный экзмеляр.

if StaticText1.Width() < 200dt and StaticText2.Width() < 200dt then Quality: 0.98;

Пример для Post-search relations for all instances:

if InstancesCount() < 5 and LastFound.Pages.End <= 2 then Quality: 0.98;

Обращение к экземплярам элемента

Для обращения к экземплярам элемента используются следующие предопределенные названия:

  • LastFound - последний найденный экземпляр;

  • CurrentInstance - текущий экземпляр при поиске внутри повторяющегося элемента;

  • Instance( n ) – экземпляр номер n;

  • AllInstances - все экземпляры.

Обращение к подэлементам Repeatable Group возможно, даже если подэлемент ниже по дереву.Для работы с экземплярами в языке описания FlexiLayout также используются методы:

  • HasInstances - проверка, нашлись ли уже экземпляры;

  • InstancesCount - количество найденных экземпляров.

Условие окончания поиска экземпляров элемента

Поиск экземпляров прекращается (в данной ветке перебора), если мы наталкиваемся на пустую гипотезу группы (т.е. группы, имеющую пустой регион) или мы не можем сгенерировать больше гипотезу (в области поиска нет гипотез вообще). В случае использования постраничного режима это правило применяется к поиску на одной странице, после окончания поиска на очередной странице, переходим на следующую страницу. На генерацию гипотез также влияют MinRepetitionsOnPage, MaxRepetitionsOnPage, MinRepetitions, MaxRepetitions.

Можно вмешаться в стандартную схему следующими способами:

  1. Последний найденный экземпляр должен быть последним:

    2. if SearchElements.RepeatableGroup.HasInstances and <condition for SearchElements.RepeatableGroup.LastFound> then DontFind;

    Условие пишется в Advanced pre-search relations.

  2. Последний найденный экземпляр (для которого и пишем отношения) "плохой", и предыдущий экземпляр должен быть последним (если не найдется другого "хорошего" варианта).

    If <condition for SearchElements.RepeatableGroup.LastFound> then Quality: 0;

    Условие пишется в Advanced post-search relations.

См. также

Язык описания FlexiLayout


Поиск и замена строк в коде на закладках Advanced

Свойства элементов можно также задавать с помощью выражений, написанных на языке описания FlexiLayout.

Дополнительные условия поиска можно задать на закладке Advanced диалога свойств элемента.

Поиск и замена осуществляются в коде текущего элемента и всех его подэлементов. Таким образом, чтобы осуществить поиск и замену по коду всех элементов, надо выбрать гибкое описание (корневой элемент дерева). Если необходимо обработать только один вариант описания, выберите его в дереве.

Эта возможность очень удобна, например, в случае замены имени элемента: пользователю не нужно открывать все закладки Advanced в свойствах различных элементов, достаточно выполнить автоматическую замену для всего кода.

Чтобы произвести поиск и замену в коде:

  1. Выберите элемент, в пределах которого нужно осуществить поиск.
  2. Откройте диалог Find in Advanced Code (меню Tools>Find in Advanced Code… или пункт Find in Code контекстного меню элемента).
  3. Введите строку для поиска в поле Find what и строку для замены в поле Replace with. Отметьте опцию Match case если при поиске необходимо учитывать регистр.
  4. Нажмите кнопку Find All для осуществления поиска или Replace All для замены. Результат поиска будет отображен в поле Results.


Единицы измерения объектов

В программе FlexiLayout Studio 10 можно использовать различные единицы измерения объектов: миллиметры, сантиметры, дюймы, dots (1/300 дюйма), точки (1/72 дюйма). Задавать размеры объектов, интервалы, нечеткие интервалы и т.д. можно в выбранных единицах. Программа пересчитывает все размеры в dots и использует их при наложении гибкого описания. Поэтому точность всех измерений равна 1 dot.

Выбрать предпочтительную единицу измерения можно в диалоге Options… (меню Tools>Options…). При смене единицы измерения все указанные размеры пересчитываются и отображаются в указанных единицах.

Используемая в программе единица измерения отображается справа с строке состояния.


Нечеткий интервал

Нечеткий интервал - инструмент, позволяющий оценивать качество гипотезы в зависимости от ее длины. Нечеткий интервал может измеряться в единицах расстояния (dots, миллиметры и т. д.) или символах (для строк). Нечеткий интервал задается с помощью четырех значений, которые определяют оптимальный и допустимый диапазоны значений.

Пусть задан нечеткий интервал {f1,f2,f3,f4}, а длина найденной цепочки в символах (или длина найденного пробела в dot) равна L. Если длина L находится в диапазоне от f2 до f3 (т.е. L>=f2 AND L<=f3), то множитель равен 1. При попадании длины в диапазон от f1 до f2 множитель изменяется линейно от 0 до 1 (Quality(f1) = 0, Quality(f2) = 1). Аналогично при попадании длины в диапазон от f3 до f4 множитель изменяется линейно от 1 до 0 (Quality(f3) = 1, Quality(f4) = 0). При непопадании длины в диапазон от f1 до f4 (т.е. при L<f1 OR L>f4) множитель равен нулю (Quality(L) = 0). Качество найденной гипотезы умножается на результат вычисления функции, оценивающей попадание длины гипотезы в нечеткий интервал, заданный свойством Character count.

Замечание. Качество любой цепочки, состоящей из гипотез нескольких элементов, вычисляется путем перемножения оценок качества гипотез элементов, входящих в цепочку. Если цепочка достаточно длинная (т.е. ветвь элементов SearchElements гибкого описания содержит много элементов), а оценки качества входящих в нее гипотез, вследствие задания слишком жестких условий, низкие, то итоговая оценка качества цепочки всех элементов дерева может оказаться крайне низка.

Таким образом, нужно стремиться к тому, чтобы выбираемая гипотеза имела по возможности более высокую оценку качества. С другой стороны, нужно иметь возможность отличать гипотезы по качеству, чтобы выбрать лучшую. Поэтому нечеткие интервалы, представляющие собой математические функции для оценки качества гипотезы, следует настраивать так, чтобы приемлемые гипотезы штрафовались не очень сильно.

Допускается также использовать отрицательные значения для левой границы нечеткого интервала (хотя в реальности, конечно, строки с отрицательной длиной не существуют). Это может быть полезно для того, чтобы сделать более пологой прямую зависимости качества на интервале от 0 до 1, и таким образом уменьшить штраф, налагаемый на качество гипотезы. Если при этом нужно строго ограничить нижнюю границу данного параметра (например, длина строки не может быть меньше 10 символов, при этом нечеткий интервал для длины строки {-10,20,30,40}), то такое условие нужно написать дополнительно явным образом на закладке Advanced диалога свойств элемента в поле Advanced post-search relations, указав Value.Length >= 10.

Вообще не рекомендуется задавать слишком жесткие границы интервала. Особенно это актуально при обработке изображений, среди которых могут попадаться изображения с разным качеством. Например, возможны ситуации, когда из-за неудовлетворительного качества исходного документа или из-за настроек сканирования в буквах встречаются пробелы. В этом случае один символ может восприниматься, как несколько, что при задании слишком жестких границ интервала может привести к резкому ухудшению оценки качества гипотезы, которая, по сути, является правильной, и выбору иной гипотезы. Поэтому, если важно делать окончательный выбор между гипотезами строк на основе их длин, это лучше делать, налагая дополнительные условия в поле Advanced post-search relations.

Редактор нечетких интервалов

Для упрощения задания нечеткого интервала в программе предусмотрен наглядный редактор нечеткого интервала. Редактор можно открыть из диалога свойств элемента Character String (закладка Character String, кнопки [image]), а также из главного меню программы Tools>Fuzzy Interval Editor….


Использование баз данных и текстовых файлов в языке гибких описаний

Использование баз данных и текстовых файлов

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

Обращение к базам данных происходит с использованием интерфейса ADO (Microsoft ActiveX Data Objects). База данных и ее свойства задаются с помощью стандартной строки соединения (Connection String) – набора разделенных точкой с запятой аргументов, определяющих параметры, необходимые для подключения. Такими параметрами являются: поставщик данных (Provider), размещение источника данных (Data Source) и другие.

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

Обращение к текстовому файлу производится по имени файла, которое указывается относительно каталога проекта FlexiCapture Studio. Каждый вариант текстовой строки для поиска должен быть определен на новой строке. Пустые строки игнорируются.

При экспорте гибкого описания для последующего подключения к определению документа ABBYY FlexiCapture 10 текстовые файлы копируются в папку с именем <FileName>Res, где FileName - наименование файла с гибким описанием или классификатором. Папка располагается в том же каталоге, что и экспортированный файл. В дальнейшем при импорте описания ABBYY FlexiCapture 10 автоматически размещает текстовые файлы. Подробнее о месторасположении текстовых файлов см. справку ABBYY FlexiCapture 10.

Текстовые файлы могут быть как в формате ANSI, так и в формате Unicode. В начале файла в формате Unicode должен находиться стандартный заголовок, состоящий из специального двухбайтного Unicode символа 0xFEFF. Для перевода файла в формате ANSI в формат Unicode используется текущая системная кодовая страница.

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

Замечание. Для ускорения наложения по умолчанию используется первая тысяча строк файла. Если необходимо использовать большее количество строк, укажите это в разделе Advanced pre-search relations на закладке Advanced, явно указав количество строк в параметрах команды SearchTextFromFile.


Обучение параметров элемента

Обучение элементов используется для упрощения и автоматизации процесса создания гибкого описания. Вы можете быстро обучить новый элемент или скорректировать значения параметров ранее созданного элемента.

Для чтобы параметры элемента можно было обучить автоматически:

  • для элемента, который требуется обучить, необходимо наличие правильной эталонной разметки (Reference layout) или результата наложения описания (Matched layout) на нескольких страницах;
  • напротив страниц, на которых будет проводиться обучение, должна стоять галочка в поле Used For Training на закладке Batch.

Замечание: Можно создать новый элемент и его область на изображении при помощи инструмента Create New (Ctrl+Space) [image], либо выделить область на изображении для уже существующего в дереве элемента при помощи инструмента Draw Location [image].

Для того чтобы обучить элемент:

  1. В контекстном меню элемента выберите пункт Train Element > Train Element Parameters. Откроется диалоговое окно Element Parameters Selection.
  2. В этом диалоге отображаются параметры обученного элемента и их значения.

  3. Из выпадающего списка Show выберите modified parameters only для отображения только тех параметров, значения которых изменились, или all parameters для отображения всех параметров элемента.
  4. Поставьте галочку слева от имени параметра, чтобы использовать результат обучения параметра. Вы также можете поставить галочку рядом с заголовком Parameter name для выбора всех измененных параметров.
  5. Нажмите кнопку Apply Changes, чтобы сохранить новые значения измененных параметров.


Браузер зависимостей элементов

Браузер зависимостей элементов позволяет осуществлять поиск элементов и отображает зависимости для найденных элементов.

Чтобы открыть закладку Element references browser, выберите соответствующий пункт в меню Вид или используйте сочетание клавиш Ctrl+Alt+R.

Для просмотра зависимостей элемента:

  • Введите название элемента или выберите элемент в списке ранее введенных элементов.
    Используйте кнопку aBc для включения/отключения чувтвительности к регистру.
  • Найденные элементы будут выведены в список результатов поиска. Нажмите на нужный элемент, чтобы увидеть зависимости для этого элемента в списках Dependences и References справа.

    Список Dependences содержит ссылки на данный элемент из других элементов. Список References содержит ссылки из данного элемента на другие элементы.

  • Разверните списки для просмотра всех зависимостей. При двойном щелчке по ссылке откроется диалогое окно со свойствами соответствующего элемента.
    Например, если зависимость имеет тип "отношение", свойства элемента откроются на закладке Relations и соответствующее отношение будет выделено.

Если ссылка находится в группе Pre-search relations или Post-search relations, то на открывшейся закладке Advanced будет выделен соответствующий участок кода.


Блоки

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

В дереве проекта ветка блоков гибкого описания отображается значком [image] .

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

  • Text, отображается в дереве значком [image] - позволяет извлечь текстовые данные.
  • Barcode, отображается в дереве значком [image] - позволяет распознавать штрих-коды.
  • Checkmark, отображается в дереве значком [image] - служит для распознавания меток.
  • Picture, отображается в дереве значком [image] - позволяет обрабатывать объекты, которые при предраспознавании не были распознаны как текстовые.
  • Table, отображается в дереве значком [image] - позволяет извлекать данные из таблиц.
  • Group, отображается в дереве значком [image] - служит только для логической группировки блоков.
  • Checkmark group, отображается в дереве значком [image] - служит для создания группы меток. В такую группу могут быть добавлены только блоки метки, создавать и переносить в группу меток блоки других типов нельзя.
  • Repeatable group, отображается в дереве значком [image] - позволяет объединять блоки в группу, допускающую повторения.
  • Unrecognizable, отображается в дереве значком [image] - позволяет исключить область из распознавания.

Блоки, для которых хотя бы в одном варианте описания не указана область изображения, помечаются пустым квадратиком в верхнем правом углу значка: . Если выбрано одно гибкое описание (с помощью пункта Pin Alternative контекстного меню элемента гибкого описания или раздела FlexiLayout / Classifier, либо с помощью пункта Select Alternative Layout контекстного меню гибкого описания), то наличие области изображения проверяется только в нем.

Замечание. Распознавание и извлечение данных из блоков выполняется в системе потокового ввода (FlexiCapture).

Свойства блока

Name - имя блока. Имя блока должно состоять из букв (русских, латинских или латинских с диакритическими символами), цифр и знака подчеркивания. Имя блока должно начинаться с буквы или подчеркивания. Пробелы и специальные символы в именах не допускаются.

Тип блока - выбирается при создании блока. Тип блока должен соответствовать объекту(ам) изображения, находящемуся в области изображения, описываемой данным блоком.

Comment - комментарий, который может указать пользователь. Наличие комментария необязательно.

Has repeating instances - данное свойство указывает на то, что блок будет состоять из нескольких экземпляров. Например, это свойство следует отметить, если в качестве области блока будут использоваться все экземпляры элемента Repeatable Group.

Instance sort order - данное свойство позволяет задать порядок объединения экземпляров группы в блок. Свойство активно только при отмеченной опции Has repeating instances. Возможные значения:
Top to bottom - экземпляры объединяются в блок в зависимости от их расположения на изображении, сверху вниз.
Left to right - экземпляры объединяются в блок в зависимости от их расположения на изображении, слева направо.
Right to left - экземпляры объединяются в блок в зависимости от их расположения на изображении, справа налево.
In order of finding - экземпляры объединяются в блок в порядке формирования гипотез. Гипотезы формируются в порядке убывания качества, а если пользователь задал дополнительные условия поиска экземпляров, то в определенном пользователем порядке. Таким образом, если нужен не предусмотренный программой порядок, его можно задать с помощью дополнительных условий.

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

For Layout - позволяет выбрать вариант описания, в котором указывается область изображения.

Source element - позволяет задать область, совпадающую с регионом элемента. При наложении гибкого описания на изображении будет найден объект (или несколько объектов), соответствующих выбранному элементу. Именно из этих объектов и будут извлекаться данные при обработке форм. Для повторяющейся группы можно выбрать один из экземпляров или использовать все экземпляры (AllInstances).

Expression - данное свойство позволяет задать область изображения, несовпадающую ни с один регионом элементов гибкого описания. Например, можно объединить регионы элементов и пространство между ними в один блок, расширить регион элемента на заданную величину или задать месторасположение блока на основе абсолютных координат, не привязываясь к элементам. В этом случае регион блока можно описать на специальном языке описания FlexiLayout.

Замечание.
Регион блока является неразрывным. Это значит, что даже если регион создается на основе несоприкасающихся прямоугольников, в результате они будут связаны тонкими дополнительными прямоугольниками до неразрывной области.
Однако, блок может состоять из нескольких регионов, если в качестве опорного элемента используются все экземпляры повторяющейся группы.
Регион группового блока вычисляется на основе регионов дочерних блоков, также как и для региона гипотез. При этом для лучшего восприятия получившийся регион немного расширяется.

Группа меток и обычная группа блоков не имеют никаких параметров, кроме имени и комментария.

Параметры повторяющейся группы блоков такие же, как у других, не групповых, блоков. При этом опция Has repeating instances у них всегда включена. Дочерние блоки могут как иметь опцию Has repeating instances, так и не иметь, но для них всегда создается переменная "Output instances". Если блок внутри повторяющейся группы блоков имеет опцию Has repeating instances, это значит, что он может повторяться внутри каждого экземпляра родительского блока.

Задание региона блока с помощью экземпляров повторяющейся группы

Если блок задается с помощью нескольких экземпляров, область блока будет состоять из отдельных регионов. В случае использования конкретного экземпляра повторяющейся группы (например, LastFound), регион блока задается также, как и для любого другого элемента. Однако, можно использовать все найденные экземпляры (AllInstances). Для использования нескольких экземпляров необходимо включить опцию Has repeating instances.

Также можно написать вручную код для блока с использованием предопределенной переменной OutputInstances, например:
OutputInstances = SearchElements.PageHeader.AllInstances.UnionRect;

В программе FlexiCapture 10 блоки, у которых отмечена опция Has repeating instances, обрабатываются следующим образом:

  • для нетабличных блоков заданные экземпляры будут экземплярами соответствующего поля;
  • для табличного блока заданные экземпляры будут считаться одним экземпляром поля, т.е. в программе FlexiCapture 10 такой блок будет обрабатываться как поле типа Таблица, с разрывным регионом.

Правила задания ссылок на элементы для повторяющейся группы блоков

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

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

Пример: Если повторяющийся групповой блок ссылается таким образом: SearchElements..RepGr1.Instance(1).RepGr2.AllInstances, то его дочерние блоки могут сослаться на элемент RepGr1..RepGr2.Element только так: SearchElements.RepGr1.Instance(1).RepGr2.AllInstances.Element.

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

Примеры:

Есть признак HasRepeatableInstances

SearchElements.RepGr1.Instance(1).RepGr2.AllInstances.RepGr3.AllInstaces.Element

SearchElements.RepGr1.Instance(1).RepGr2.AllInstances.RepGr3.AllInstaces.RepGr4.AllInstances.Element

Нет признака HasRepeatableInstances

SearchElements.RepGr1.Instance(1).RepGr2.AllInstancess.Gr3.SubElement (здесь Gr3 – простая группа) SearchElements.RepGr1.Instance(1).RepGr2.AllInstances.SubElement

Замечание. Если ссылки выставлены через Source element, то проверка осуществляется во время компиляции шаблона, а если через Advanced Code, то ошибка обнаружится во время наложения гибкого описания.

Примеры задания региона блока с помощью языка описания FlexiLayout
Для задания региона блока используется поле Expression. В зависимости от типа блока и от состояния опции Has repeating instances для формирования региона блока используется одна из предопределенных переменных: OutputRegion (типа Region), OutputTable (типа TableHypothesis) и OutputInstances (типа HypothesisInstances либо TableHypothesisInstances). Подробнее о предопределенных переменных, используемых в поле Expression, см. п. "Язык описания FlexiLayout. Предопределенные переменные."

Получение и расширение региона элемента на 3 мм по ширине и на 5 мм по высоте

Например:
OutputRegion = SomeElement.Rect;
OutputRegion.Inflate( 3*mm, 5*mm );
Объединение описывающих прямоугольников регионов двух элементов и возвращение описывающего прямоугольника от объединения

Например:
Rect outputRect;
outputRect = Element1.Rect.ExternalRect Or Element2.Rect;
OutputRegion = outputRect;
Формирование точного региона из описывающих прямоугольников регионов двух элементов

Например:
RectArray outputRects;
outputRects = RectArray( Element1.Rect.ExternalRect );
outputRects.Add: Element2.Rect.ExternalRect;
OutputRegion = Region( outputRects );
Формирование точного региона из регионов объектов изображения, соответствующим двум различным элементам

Например:
RectArray outputRects;
outputRects = Element1.Rects;
outputRects.Add( Element2.Rects );
OutputRegion = outputRects.Region;
Формирование точного региона из регионов объектов изображения, входящих в регион элемента Element1, с удалением регионов объектов, входящих в регион элемента Element2

Например:
OutputRegion = FormRegion( Element1.Rects, Element2.Rects );
Задание табличного блока с помощью табличного элемента

Например:
OutputTable = SearchElements.TableElement;
Задание не табличного блока с помощью экземпляров гипотез некоторого элемента

Например:
OutputInstances = SearchElements.RepeatableGroup.AllInstances.TemplateElement;
Задание табличного блока с помощью экземпляров гипотез некоторого элемента

Например:
OutputInstances = SearchElements.RepeatableGroup.AllInstances.TableElement;

Для описания региона блока может также использоваться предопределенная переменная IsNull, которая сигнализирует о том, найден ли регион блока при наложении гибкого описания. Значение false означает, что регион найден, true - не найден.

Переменная IsNull предварительно инициализирована значением false, т.е. регион блока считается найденным. Однако, иногда бывает нужно сначала проверить некоторые условия, на основе которых затем сделать вывод, найден ли регион блока.

Примеры использования переменной IsNull
  1. Считать регион блока найденным, если ширина региона элемента, выбранного в качестве исходного элемента для данного блока, превышает 50 dot. Для этого в поле Region Expression необходимо ввести такой код:
    if Element1.Width < 50dt then IsNull = true;
  2. Считать регион блока найденным, если найден элемент Element1. Для этого в поле Region Expression необходимо ввести такой код:
    IsNull = Element1.IsNull
  3. Ищем блок на базе элементов Element1 и Element2, таким образом, что левая и верхняя границы элемента Element1 и правая и нижняя границы элемента Element2 будут искомыми границами блока. Если хотя бы один из элементов Element1 или Element2 не найден, делаем текущий блок не найденным
    Rect outputRect;
    Let FieldLeft = Element1.Rect.Left;
    Let FieldRight = Element2.Rect.Right;
    Let FieldTop = Element1.Rect.Top;
    Let FieldBottom = Element2.Rect.Bottom;
    outputRect = Rect( FieldLeft, FieldTop, FieldRight, FieldBottom);
    if ((Element1.IsNull == True) or (Element2.IsNull == True) ) then {IsNull = true;}
    OutputRegion = outputRect;
    Замечание. Этот код будет работать корректно только в случае, когда область поиска Element1 лежит выше и левее области поиска элемента Element2.В данном примере для простоты опустили проверку соблюдения этого условия. В реальном коде такая проверка должна быть сделана и при необходимости должны быть скорректированы значения переменных FieldLeft, FieldRight, FieldTop, FieldBottom, иначе при обращении к функции Rect будет ошибка.


Создание, редактирование, удаление блоков

Для того чтобы создать блок гибкого описания:

  1. Перейдите в окно FlexiLayout.
  2. Выберите ветку Blocks в дереве FlexiLayout.
  3. Выберите в меню FlexiLayout команду Add Block>"Тип блока" или в локальном меню блоков выберите New>"Тип блока".
  4. В открывшемся диалоге задайте его область поиска:
  • Выберите в списке For layout вариант описания, в котором указывается область поиска.
  • Если регион блока будет совпадать с регионом элемента, выберите опцию Source element и щелкните по кнопке [image]. В открывшемся диалоге Select Element укажите элемент, с регионом которого должен совпадать регион блока. Если в качестве опорного элемента вы выбираете повторяющуюся группу, то выберите её экземпляр в выпадающем списке Repeating instance. Выбирая значение AllInstances, не забудьте отметить опцию Has repeating instances в свойствах блока, т.к. в этом случае регион блока может быть разрывным.
    Замечание. Для улучшения последующего распознавания регион текстового блока устанавливается на 1 dot больше в каждом направлении по сравнению с регионом элемента-источника.
  • Для задания региона блока, не совпадающего с регионом элемента, выберите опцию Expression и введите код в поле Expression. Для проверки правильности кода щелкните по кнопке Check.

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

Для того чтобы отредактировать свойства блока:

  1. Перейдите в окно FlexiLayout.
  2. Выберите требуемый блок.
  3. Выберите в локальном меню блока команду Properties…
    Замечание. Также диалог Свойства блока можно открыть двойным щелчком мыши на блоке.
  4. В открывшемся диалоге внесите необходимые изменения.
    Замечание. Изменить можно имя и регион блока, его тип изменить нельзя.

Для того чтобы удалить блок:

  1. Перейдите в окно FlexiLayout.
  2. Выберите требуемый блок.
  3. В локальном меню блока выберите команду Delete.


Работа с таблицами

Программа FlexiLayout Studio позволяет создавать гибкие описания документов, содержащих таблицы различной структуры, включая специфические таблицы, встречающиеся на финансовых документах. Вообще говоря, программа позволяет находить любые данные, имеющие табличную структуру, т.е. упорядоченные по какой-либо, пусть и невидимой, сетке. Ограничение на структуру таблицы состоит в том, что таблица не должна содержать объединенных (слитых) ячеек. Таблицы со слитными ячейками можно описать с помощью элемента Repeatable Group.

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

Для удобства создания гибкого описания в таблице выделяются три части: заголовочная часть (header), тело таблицы и итоговая часть (footer). Тело таблицы содержит данные, которые необходимо распознать и извлечь из документа.

Заголовочная и итоговая части таблицы выполняют вспомогательную функцию: они ограничивают тело таблицы сверху и снизу. Кроме того, заголовочная часть содержит заголовки столбцов таблицы, и поэтому используется при делении тела таблицы на столбцы.

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

Для создания описания таблицы необходимо:

  • Создать блок Table, в котором задать перечень возможных столбцов таблицы.

  • Создать элемент Table, в котором необходимо:

  • Выбрать блок Table, соответствующий данному элементу Table.

  • Задать параметры поиска каждого столбца таблицы.

  • Указать последовательность столбцов таблицы.

  • Задать параметры поиска заголовочной части таблицы.

  • Задать параметры поиска итоговой части таблицы.

  • Задать условия деления таблицы на строки.

  • Задать область поиска всей таблицы.

  • При необходимости задать дополнительные условия поиска.


Блок Table

Блок Table используется для передачи в FlexiCapture координат обнаруженных на изображении таблиц, при это данные из таблиц извлекаются в программе FlexiCapture. Особенностью блока Table является то, что в результатом поиска такого блока является не только описывающий регион всего блока, но и описывающие прямоугольники ячеек таблицы. В отличие от блоков других типов блок Table имеет дополнительное свойство: перечень возможных столбцов таблицы. Список столбцов табличного блока определяет, что может искать данный блок. В гибком описании можно создать один или несколько элементов типа таблица, в которых описать, где и как именно необходимо искать заданный в блоке набор колонок.

Замечание.

  1. При создании табличного элемента необходимо будет "привязать" элемент к уже созданному табличному блоку. Необходимо начать с создания блока. Вы можете задать временные параметры его местоположения, потом создать один (или несколько) элементов для его поиска, и только после этого задать окончательные параметры расположения блока на изображении, опираясь на эти элементы типа Table.
  2. Можно создать несколько элементов, которые описывали бы различные алгоритмы поиска одного и того же табличного блока. В качестве результат поиска блока блока можно выбрать тот из табличных элементов, который наложится оптимальным образом. Проверить результат наложения табличных элементов и выбрать наиболее подходящий можно при помощи выражений секции Region expression.

В ветви блоков Flexilayout блок Table отображается значком [image].

Для создания блока Table:

  1. Перейдите в окно FlexiLayout.

  2. Выберите ветку Blocks в дереве FlexiLayout.

  3. Выберите в меню FlexiLayout команду Add Block>Table или в локальном меню блоков выберите New>Table.

  4. В открывшемся диалоге задайте его свойства.

  5. На закладке Table block задайте:

  • имя блока;

  • введите комментарий (опционально);

  • если регион блока и разбиение таблицы на колонки и строки будет совпадать с регионом результатом наложения некоторого табличного элемента, выберите опцию Source element и щелкните по кнопке щелкните по кнопке [image]. В открывшемся диалоге Select Element укажите табличный элемент, с регионом которого должен совпадать регион блока на основе которого нужно создать результат наложения табличного блока, щелкните по кнопке OK.

  • для выбора результата наложения табличного блока из нескольких табличных элементов задания региона блока, не совпадающего с регионом элемента, выберите опцию Region expression и введите код в поле Region expression. Для проверки правильности кода щелкните по кнопке Check.

  6. На закладке Columns укажите столбцы, которые могут присутствовать в блоке. Для этого нажмите кнопку Add… и в открывшемся диалоге введите имя столбца. В качестве имени столбца таблицы удобно использовать заголовок колонки, встречающийся на тестовых изображениях. В выпадающем списке укажите тип столбца. Можно создать столбец одного из следующих типов: Text, Barcode, Checkmark, Picture или Non-Recognized Block. Для того чтобы изменить имя или тип столбца, нажмите кнопку Edit…, в открывшемся диалоге Edit Table Column измените требуемые параметры. С помощью кнопок [image] (Вниз) и [image] (Вверх) задайте последовательность столбцов, соответствующую порядку столбцов таблицы, в котором они должны отображаться в системе ввода документов.

Пример задания результата наложения табличного блока с помощью языка описания FlexiLayout

Для задания региона блока используется предопределенная переменная OutputTable типа TableHypothesis.

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

let T1 = SearchElements.TableElement1;

let T2= SearchElements.TableElement2;

if T1.RowsCount > T2.RowsCount then OutputTable = T1; else OutputTable = T2;

Замечание. Табличные элементы SearchElements.TableElement1 и SearchElements.TableElement2, упомянутые в примере, должны ссылаться на один и тот же табличный блок, в секции Region expression которого используется код примера.


Элемент Table

Table

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

В ветви элементов дерева FlexiLayout элемент Table обозначается значком [image].

  1. Перейдите в окно FlexiLayout.

  2. Спуститесь по дереву элементов до уровня вложенности, на котором вы хотите создать элемент (для первого уровня выберите SearchElements).

  3. Выберите элемент нужного типа (меню FlexiLayout>Add Element>Table).

  4. В открывшемся диалоге задайте свойства элемента:

  • на закладке General введите имя элемента, комментарий (по желанию), укажите, обязателен ли элемент для поиска (свойство Optional element);
    Замечание. Имя элемента должно начинаться с буквы или подчеркивания, за котором могут следовать буквы и цифры. В имени элемента не должны использоваться пробелы и специальные символы: '.', ',', ':', '-', '\', '/', имя элемента не должно совпадать с зарезервированными словами.

  • на закладке Columns укажите табличный блок, связанный с данным элементом. После того, как будет выбран табличный блок в поле Columns of selected table block появится список всех колонок выбранного табличного блока. Для каждой колонки задайте свойства - параметры поиска;

  • на закладке Order укажите последовательности, в которых колонки могут располагаться в таблице на изображении;

  • на закладке Header укажите свойства заголовочной части таблицы, которые будут использованы для ее поиска;

  • на закладке Footer укажите свойства итоговой части таблицы, которые будут использованы для ее поиска;

  • на закладке Rows задайте свойства, которые будут использованы для выделения строк таблицы;

  • на закладках Search Constraints и Relations укажите область поиска всей таблицы, включая тело таблицы, заголовочную и итоговую части;

  • при необходимости задайте дополнительные условия поиска на закладке Advanced.

Подробнее

Свойства элементов Flexilayout

Область поиска

Дополнительные условия поиска


Выбор табличного блока и задание параметров поиска столбцов таблицы

Выбор табличного блока, связанного с данным табличным элементом, выполняется в диалоге свойств элемента на закладке Columns.

Выбор табличного блока

Каждый элемент Table должен соответствовать некоторому табличному блоку, для поиска которого он предназначается.
Для выбора табличного блока щелкните по кнопке Select. В отрывшемся диалоге выберите табличный блок, соответствующий данному табличному элементу. После того, как будет выбран табличный блок, в поле Columns of selected table block появится список имен всех столбцов выбранного табличного блока. Для каждого столбца задайте свойства - параметры поиска.

Замечание.

  1. Список колонок блока, отображаемый на закладке Columns табличного элемента, доступен только для просмотра. Отредактировать данный список, т.е. изменить состав и названия колонок, можно только в диалоге свойств самого блока.
  2. Чтобы понять, как связаны между собой табличный блок и элемент, можно использовать следующую аналогию: блок играет роль интерфейса гибкого описания к системе ввода документов, в то время как элемент играет роль реализации данного интерфейса. Табличный элемент задает алгоритм поиска табличного блока. Подобно тому, как для любого заданного интерфейса можно создать несколько различных программных реализаций, так и для табличного блока можно создать несколько табличных элементов (но не наоборот).

При выборе табличного блока на закладке Columns табличного элемента программа по умолчанию использует названия и последовательность столбцов табличного блока чтобы установить границы поиска для каждого столбца (см. Задание параметров поиска столбцов) и стандартную фиксированную последовательность столбцов таблицы (см. Последовательность столбцов таблицы)

Исключение столбца из поиска

В процессе отладки гибкого описания может потребоваться исключить столбец из поиска, не удаляя его из описания. Тогда в проекте будет сохранена вся информация об столбце и его свойствах, но при наложении описания этот столбец будет проигнорирован. Для того чтобы исключить столбец из поиска, в поле Columns of selected table block выберите столбец, который нужно временно исключить, затем нажмите кнопку Disable. Галочка, расположенная около имени столбца, исчезнет. Для того чтобы разблокировать столбец, выберите его имя в списке столбцов и щелкните мышью по кнопке Enable.

Замечание. При исключении столбца из поиска он автоматически исключается из всех вариантов последовательности колонок, заданных на закладке Order.

Задание параметров поиска столбцов

Параметры поиска столбцов таблицы задаются в диалоге свойств столбцов. Для того чтобы открыть диалог, выделите имя столбца в поле Columns of selected table block и щелкните по кнопке Properties…, расположенной справа от поля.

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

Поиск заголовков столбцов по ключевым словам

Для того чтобы поиск заголовка столбца выполнялся по ключевым словам выберите опцию Detect by keyword in name. Затем в поле, расположенном ниже, введите ключевые слова (словосочетания), которые встречаются в заголовке данного столбца на тестовых изображениях. После ввода каждого ключевого слова нажмите клавишу Enter.

Для того чтобы при поиске заголовка столбца ключевое слово икалось только по целым текстовым объектам (словам), отметьте опцию Whole words only.

Довольно часто слово в заголовке узкой колонки может иметь перенос на следующую строку в середине слова. Опция Multi-line name позволит Вам найти даже такой заголовок.

Поскольку на разных изображениях один и тот же столбец может иметь различные заголовки, список ключевых слов (словосочетаний) должен включать в себя все возможные варианты. Однако, на некоторых изображениях столбец таблицы может вообще не иметь заголовка, или просто отсутствовать. Поэтому заголовок столбца является необязательной частью таблицы, что допускает возможность того, что заголовок столбца не будет найден при наложении гибкого описания. Если ключевое слово не будет найдено в заголовочной части таблицы (из-за его отсутствия или из-за низкого качества изображения), гипотеза заголовка будет оштрафована, т.е. домножена на качество нулевой гипотезы ключевого слова. В поле Missing keyword penalty указывается штрафующий коэффициент, на который будет домножено качество гипотезы выделения столбца, если ключевое слово не будет найдено. По умолчанию свойство Missing keyword penalty имеет значение 0,97.

Использование региона другого элемента для выделения заголовка столбца

Для выделения заголовка столбца таблицы может быть использован другой, уже найденный элемент. Использование другого, предварительно найденного элемента, позволяет наложить на ключевое слово заголовка дополнительные условия поиска. Кроме того, этот способ позволяет искать заголовок столбца не в виде статического текста, а, например, в виде строки, заданной определенным алфавитом, в виде инвертированного текста или просто в виде некоторого региона. Используемый элемент может быть любого типа. В этом случае заголовком столбца будут считаться регион этого элемента.

Для того чтобы выделить заголовок столбца с помощью уже найденного элемента, отметьте опцию Use found element as column name. Затем щелкните по кнопке [image], в открывшемся диалоге Select Element выберите элемент, регион которого будет считаться регионом заголовка столбца.

Замечание. Элемент, используемый для поиска заголовка столбца, должен располагаться в ветви элементов FlexiLayout выше описываемого табличного элемента. При описании многостраничной таблицы рекомендуется использовать для поиска заголовка столбца повторяющиеся элементы (подробнее о многостраничных таблицах см. "Особенности поиска многостраничных таблиц").

Проверка правильности выделения столбца

Помимо ключевых слов из заголовка в процессе выделения столбцов таблицы также учитывается содержимое найденного столбца. Если известно, что столбец должен содержать определенным образом отформатированные данные, то указание этой информации позволит программе выбрать наилучший вариант деления таблицы на столбцы из возможных. При этом выполняется проверка типа данных, попавших в выделенный столбец таблицы. Для того чтобы программа FlexiLayout Studio выполнила такую проверку, необходимо отметить опцию Check content type. Затем в поле Type of column content укажите тип данных, которые должны присутствовать в столбце:

  • Text;

  • Currency;

  • Date;

  • Regular expression;

  • Number.

Если для для проверки содержимого найденного столбца выбран тип Regular expression, в поле Regular expression необходимо ввести регулярное выражение, описывающее данные, присутствующие в столбце таблицы.

Алфавит, используемый в регулярных выражениях
Название в списке | Условное обозначение в поле | Пример использования
Любой символ | * | “к”*“т” – допускает слова типа кит, кот и т.п.
Буква | С | С”от” – допускает слова типа Рот, рот, кот, Кот, мот и т.д.
Заглавная буква | А | A”от” – допускает слова типа Рот, Кот, Мот, Дот и т.п.
Строчная буква | а | а”от” – допускает слова типа рот, кот, мот, дот и т.п.
Буква или цифра | Х | X – допускает любую одиночную цифру или букву.
Цифра | N | N“-й” допускает слова типа 5-й, 4-й, 1-й и т.п.
Строка | “” | “кот”
Или | | | “пл”(“о”|“а”)“т” – допускает слова “плот” и “плат”.
Символ из группы | [] | [тм]“от” – допускает слова тот и мот.
Символ не из группы | [^] | [^т]“от” – допускает слова “кот”, “лот” и т.п., но не допускает слова “тот”.
Любое число повторений (распространяется на стоящее слева выражение или подвыражение) | {-} | [АБ74]{-} – допускает любые комбинации символов А, Б, 7, 4 произвольной длины.
Количество повторений n | {n} | N{2}“-й” допускает слова типа 25-й, 84-й, 11-й и т.п.
От n до m повторений | {n-m} | N{1-3}“-й” допускает слова типа 5-й, 84-й, 111-й и т.п.
От 0 до n повторений | {-n} | N{-2}“-й” допускает слова типа -й, 84-й, 1-й и т.п.
От n и больше повторений | {n-} | N{2-}“-й” допускает слова типа 25-й, 834-й, 311-й, 34576-й и т.п.
Подвыражение | () |

Если тип данных в найденном столбце не совпадет типом, указанным в поле Type of column content, такая гипотеза столбца будет оштрафована. В поле Missing content penalty указывается штрафующий коэффициент, на который будет домножено качество гипотезы выделения столбца при несовпадении обнаруженного и заданного типа содержимого. По умолчанию свойство имеет значение 0.98.

Задание абсолютных координат области поиска

Область поиска столбца таблицы может быть ограничена справа и слева с помощью абсолютных координат. Это позволяет сделать свойство Absolute area constraints. Для этого в поля Left boundary и Right boundary необходимо указать координаты левой и правой границ области, в которой может располагаться столбец.


Последовательность столбцов таблицы

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

Замечание.

  1. Фиксированные порядки могут задавать противоречивые последовательности столбцов. Например, допустимо задать два фиксированных порядка следующим образом: "Column1; Column2; Column3" и "Column3; Column2; Column1". При наложении гибкого описания программа выберет порядок, наиболее подходящий к данному изображению.
  2. При описании порядков следования столбцов при помощи правил задавать противоречивые правила нельзя. При наложении гибкого описания программа подберет порядок следования столбцов, удовлетворяющий всем указанным правилам. Таким образом, наличие противоречивых правил следования столбцов (например, "Column1 << Column2 << Column3" и "Column3 << Column2 << Column1"), приведет к "неналожению" табличного элемента.

Описание последовательности столбцов табличного элемента выполняется в диалоге свойств элемента Table на закладке Order.

Фиксированная последовательность столбцов

Если во всем наборе тестовых изображений в описываемой таблице столбцы всегда следуют друг за другом в определенной последовательности, то такая последовательность называется фиксированной. Например, таблица содержит три столбца: Date, Quantity и Price, - и эти столбцы всегда расположены в таблице именно в этом порядке. В этом случае последовательность столбцов может считать фиксированной.

Возможно также ситуация, при которой на тестовых изображениях можно выделить несколько последовательностей столбцов. Например, на части изображений столбцы таблицы идут в порядке "Date, Quantity, Price", и при этом в пакете есть изображения, на которых столбцы идут в порядке "Date, Price, Quantity". В этом случае обе последовательности можно назвать фиксированными и использовать их для поиска столбцов данной таблицы.

В общем случае количество фиксированных последовательностей столбцов не ограничено.

Для задания фиксированной последовательности столбцов выберите опцию Fixed column order. По умолчанию при создании табличного элемента создается одна фиксированная последовательность столбцов, состоящая из полного списка столбцов табличного блока, порядок столбцов таблицы соответствует порядку столбцов, выбранному пользователем при создании табличного блока. Данная последовательность имеет имя по умолчанию Standard.

Пользователь может внести изменения в последовательность Standard в соответствии с имеющимися тестовыми изображениями. Он может также создать собственные фиксированные последовательности и удалить ненужные.

Для того чтобы изменить фиксированную последовательность столбцов:

  1. Выберите последовательность из списка и щелкните мышью по кнопке Edit…
  2. Откроется диалог Edit Fixed Column Order.
  3. В этом диалоге в поле Order name укажите новое имя фиксированной последовательности столбцов. Имя последовательности столбцов играет служебную роль и отображается в свойствах гипотезы табличного элемента. Имя последовательности позволяет пользователю понять, какая именно из заданных последовательностей была выбрана программой при поиске.
  4. Левое поле диалога содержит список имеющихся столбцов таблицы Available columns. В данном поле выберите нужный столбец и нажмите кнопку [image]. Выбранный столбец будут добавлен в список Selected columns. Кнопка [image] позволяет добавить в список выбранных столбцов все имеющиеся столбцы таблицы. Кнопка [image] позволяет удалить столбец из списка выбранных столбцов, кнопка [image] позволяет удалить все столбцы из этого списка. Кнопки [image] и [image] позволяют перемещать столбцы таблицы в списке Selected columns на один уровень вверх (вниз). С помощью этих кнопок задайте нужную последовательность столбцов. Щелкните по кнопке OK.

Для того чтобы создать новую последовательность столбцов:

  1. Щелкните мышью по кнопке Add…
  2. Откроется диалог Add Fixed Column Order.
  3. В этом диалоге в поле Order name укажите имя фиксированной последовательности столбцов.
  4. Левое поле диалога содержит список имеющихся столбцов таблицы Available columns. В данном поле выберите нужный столбец и нажмите кнопку [image]. Выбранный столбец будут добавлен в список Selected columns. Кнопка [image] позволяет добавить в список выбранных столбцов все имеющиеся столбцы таблицы. Кнопка [image] позволяет удалить столбец из списка выбранных столбцов, кнопка [image] позволяет удалить все столбцы из этого списка. Кнопки [image] и [image] позволяют перемещать столбцы таблицы на один уровень вверх (вниз). С помощью этих кнопок задайте нужную последовательность столбцов. Щелкните по кнопке OK.

Для того чтобы удалить фиксированную последовательность столбцов, щелкните по кнопке Delete.

Правило последовательности столбцов

Если при просмотре тестовых изображений в таблице не удается выделить один или несколько фиксированных последовательностей столбцов, т.е. на всех изображениях столбцы идут в разном порядке, или же пакет тестовых изображений содержит слишком много изображений, и обнаружение и описание всех фиксированных порядков затруднительно, последовательность столбцов можно описать с помощью правила.

Правило последовательности столбцов - это утверждение типа "Столбец Date всегда предшествует столбцу Item" или "Столбец Price всегда следует за столбцом Item. При невозможности указать фиксированную последовательность столбцов правила последовательности столбцов позволяют облегчить поиск столбцов, сузив область поиска каждого столбца и число вариантов их взаимного расположения.

Для того чтобы при поиске столбцов таблицы использовалось правило последовательности столбцов, выберите опцию Rules for column order.

Для того чтобы создать правило последовательности столбцов:

  1. Щелкните мышью по кнопке Add…
  2. Откроется диалог Edit Column Order Rule.
  3. Левое поле диалога содержит список имеющихся столбцов таблицы Available columns. В данном поле выберите нужный столбец и нажмите кнопку [image]. Выбранный столбец будут добавлен в список Selected columns. Затем выберите столбец, который в таблице расположен всегда следом (но не обязательно рядом) с первым выбранным столбцом.
    Кнопка [image] позволяет добавить в список выбранных столбцов все имеющиеся столбцы таблицы. Кнопка [image] позволяет удалить столбец из списка выбранных столбцов, кнопка [image] позволяет удалить все столбцы из этого списка. Кнопки [image] и [image] позволяют перемещать столбцы таблицы на один уровень вверх (вниз). С помощью этих кнопок задайте нужную последовательность столбцов. Щелкните по кнопке OK.
  4. В поле Rules for column order будет показан созданное правило. Знак << указывает на то, что один столбец всегда предшествует другому.

Для того чтобы создать правило последовательности столбцов:

  1. Щелкните мышью по кнопке Edit…
  2. Откроется диалог Edit Column Order Rule.
  3. С помощью кнопок [image], [image], [image], [image] и [image] задайте нужную последовательность столбцов. Щелкните по кнопке OK.

Для того чтобы удалить правило последовательности столбцов, щелкните по кнопке Delete.


Заголовочная часть таблицы

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

Для поиска заголовочной части необходимо задать ее свойства.

Опция Look for header указывает, следует ли искать заголовочную часть таблицы при наложении гибкого описания на изображение. По умолчанию опция выбрана, и заголовочная часть будет искаться при наложении гибкого описания.

Опция Header is optional указывает на то, что заголовочная часть таблицы может отсутствовать на изображении, но при этом гибкое описание все же будет наложено на изображение, что позволит найти другие элементы и разметить блоки. По умолчанию опция выбрана.

Поле Null hypothesis quality указывает качество, которое будет присвоено нулевой гипотезе заголовочной части таблицы, если заголовочная часть не будут найдена. По умолчанию свойство имеет значение 0,95.

В поле Number of hypotheses указывается максимальное число гипотез, которые будут построены при поиске заголовочной части таблицы. По умолчанию свойство имеет значение 1.

Header is on each page указывает на то, что заголовочная часть многостраничной таблицы повторяется на каждой странице. По умолчанию опция выбрана.

Опция Absolute area constraints позволяет ограничить область поиска заголовочной части таблицы областью изображения, указанной с помощью абсолютных координат. В поле, расположенной рядом с опцией Absolute area constraints введите значения абсолютных координат в формате [left, top, right, bottom]. В данном поле можно задать координаты одного прямоугольника.


Итоговая часть таблицы

Итоговая часть выполняет вспомогательную функцию, поскольку помогает найти нижнюю границу тела таблицы. Эта часть таблицы не требует последующего извлечения данных в системе ввода документов. Поскольку итоговая часть таблицы может отсутствовать на части или всех изображениях, по умолчанию она не ищется. Для поиска итоговой части таблицы могут использованы ключевые слова (словосочетания). Итоговая часть таблицы также может быть найдена с помощью отдельного элемента, регион этого элемента будут считаться регионом итоговой части таблицы.

Для поиска итоговой части необходимо задать ее свойства.

Опция Look for footer указывает, следует ли искать итоговую часть таблицы при наложении гибкого описания на изображение. По умолчанию опция не выбрана.

Опция Footer is optional указывает на то, что итоговая часть таблицы может отсутствовать на изображении, но при этом гибкое описание все же будет наложено на изображение, что позволит найти другие элементы и разметить блоки. По умолчанию опция выбрана.

Поле Null hypothesis quality указывает качество, которое будет присвоено нулевой гипотезе, если заголовочная часть не будут найдена. По умолчанию свойство имеет значение 0,97.

Выбор способа поиска итоговой части таблицы

Опция Search by keyword позволяет выполнить поиск итоговой части таблицы по ключевым словам (словосочетания). Для того чтобы выполнить поиск итоговой части таблицы с помощью ключевых слов (словосочетаний) выберите эту опцию, а затем введите ключевые слова в поле, расположенное рядом с ней. После ввода каждого ключевого слова (словосочетания) нажмите клавишу Enter.
Совет. Для того чтобы ограничить условия поиска итоговой части таблицы, отметьте опцию Whole words only. В этом случае при поиске итоговой части таблицы будут рассматриваться только ключевые слова (словосочетания) целиком, например, если было задано ключевое слово "Pages", слово "Page" рассматриваться не будет.

Опция Use found element as footer позволяет найти итоговую часть таблицы с помощью отдельного элемента, а затем использовать найденный регион в качестве итоговой части таблицы. Этот элемент может быть любого типа. Например, можно отдельно найти горизонтальный просвет и использовать его в качестве нижнего ограничителя тела таблицы.
Выберите эту опцию, а затем щелкните по кнопке [image], в открывшемся диалоге Select Element выберите элемент, регион которого будет считаться регионом заголовка столбца.

Замечание. Элемент, используемый для поиска заголовка столбца, должен располагаться в ветви элементов FlexiLayout выше описываемого табличного элемента.

Footer is on each page указывает на то, что итоговая часть многостраничной таблицы повторяется на каждой странице. Если опция не выбрана, то это означает, что итоговая часть таблицы должна быть только на последней странице и после нахождения итоговой части дальнейший поиск частей таблицы будет прекращен. По умолчанию опция не выбрана.

Опция Absolute area constraints позволяет ограничить область поиска итоговой части таблицы областью изображения, указанной с помощью абсолютных координат. В поле, расположенной рядом с опцией Absolute area constraints введите значения абсолютных координат в формате [left, top, right, bottom]. В данном поле можно задать координаты одного прямоугольника.


Строки таблицы

После выделения столбцов таблицы выполняется разбивка таблицы на строки. Выделение строк может производится автоматически, т.е. по имеющимся во всех столбцах таблицы черным разделителям и белым просветам. Если же количество строк в ячейках таблицы, принадлежащих одной строке, изменяется от столбца к столбцу, то выделение строк таблицы может быть выполнено по одному (или нескольким) столбцам. Зачастую в таблицах встречаются столбцы, содержащие длинный описательный текст, такие как, например, наименование товара. Содержимое одной строки такого столбца может не умещаться в одной строке текста и переноситься на другую текстовую строчку, поэтому учитывать просветы между строками текста в таком столбце при делении таблицы на строки нежелательно. Программа позволяет задать столбцы таблицы, содержимое которых является определяющим для деления таблицы на строки. Тогда содержимое других столбцов при делении таблицы на строки учитываться не будет.

Выбор способа разбивки таблицы на строки и задание свойств строк табличного элемента выполняется в диалоге свойств элемента Table на закладке Rows.

Автоматическое выделение строк

Для того чтобы выделить строки таблицы автоматически, необходимо выбрать опцию Detect rows automatically. При этом строки будут размечены по имеющимся во всех столбцах таблицы черным разделителям и белым просветам.
Для того чтобы для каждой строки текста была размечена отдельная строка таблицы, выберите опцию One line of text corresponds to one row.

Выделение строк таблицы по строкам определяющего столбца

Если в таблице имеются столбцы, содержимое которых является определяющим для деления таблицы на строки, то необходимо выбрать опцию Use master columns to detect rows и указать эти столбцы в списке так называемых определяющих столбцов (Master columns). Из всего списка определяющих столбцов для деления таблицы на строки будет использован первый столбец из списка, найденный на изображении.

Создайте список столбцов, по ячейкам которых будут размечены строки таблицы. Так так состав столбцов на разных тестовых изображениях может быть разным, и выбранный вами столбец может отсутствовать на некоторых изображениях, список столбцов должен содержать все имена столбцов, по которым должна производиться разметка строк. Для создания списка столбцов:

Щелкните по кнопке [image], расположенной слева от опции Use master columns to detect rows.

В открывшемся диалоге Select Master Columns поле Available columns полный перечень столбцов данного табличного элемента. Выберите нужные столбцы и щелкните по кнопке [image]. Имена выбранных столбцов отобразятся в списке Selected columns. Используя кнопки [image] и [image] разместите столбцы в порядке приоритета. Разбиение на строки будет производиться по самому верхнему столбцу в списке, найденному на изображении.

Щелкните по кнопке OK. Список выбранных столбцов будет показан в поле Use master columns to detect rows.

Для того чтобы внести изменения в список выбранных столбцов, щелкните по кнопке [image]. Затем в открывшемся диалоге с помощью кнопок [image], [image], [image], [image] и [image] внесите изменения в список выбранных столбцов (Selected columns).

Чтобы указать способ выравнивания текста в ячейке столбцов, по которымосуществляется разметка, используйте список Master column text alignment. Для выравнивания по верхнему краю, выберите значение Top, по нижнему - Bottom.

Для того чтобы для каждой строки текста в выбранном столбце таблицы была размечена отдельная строка, выберите опцию One line of text corresponds to one row.

Слова и словосочетания, для которых не нужно выделять строки таблицы

Иногда в таблицах встречаются узкие столбцы, содержащие числовые данные с указанием единиц измерения этих данных (например, денежные суммы в указанием названия валюты). Нередко единицы измерения не умещаются в той же строке текста, что и числовые данные, и переносятся на другую строку. Таким образом, в столбце появляются текстовые строки, содержащие вспомогательную, а не основную информацию. Для того чтобы избежать выделения такого текста в отдельные строки, необходимо указать эти слова (словосочетания или предложения) в поле Words not to be treated as a separate line of text.

Для того чтобы создать список слов (словосочетаний), которые не должны выделяться в отдельные строки таблицы, введите нужные слова в поле Words not to be treated as a separate line of text, после каждого слова (словосочетания) нажмите клавишу Enter.

Замечание. Слова, указанные в поле Words not to be treated as a separate line of text, учитываются как при автоматическом делении таблицы на строки, так и при делении на строки по заданным столбцам таблицы.


Элемент Table

Особенности поиска многостраничных таблиц

Что такое многостраничная таблица

FlexiLayout Studio 10 поддерживает поиск многостраничных таблиц, т.е. таблиц, начинающихся на одной странице и продолжающихся на последующих страницах. Особенностью таких таблиц является преемственность структуры табличных столбцов на последующих страницах, т.е. совпадение их количества и последовательности на всех страницах. Ширина и положение одного и того же столбца может несколько различаться на различных страницах. По умолчанию допускается отличие положения столбца по сравнению с предыдущими страницами не более, чем на 1 дюйм.

Часть многостраничной таблицы, располагающуюся на некоторой странице, будем для краткости называть одностраничной подтаблицей.

Заголовок и итоговая часть многостраничной таблицы

Многостраничные таблицы могут иметь заголовок, повторяющийся на каждой странице, а могут иметь его только на первой странице. Поиском таких заголовков управляет опция Header is on each page. В случае, если опция выключена, заголовок будет искаться только для первой одностраничной подтаблицы.

То же самое относится и к итоговой части многостраничной таблицы, которая может находиться как в конце каждой одностраничной подтаблицы, так и один раз в конце всей многостраничной таблицы. Поиском итоговой части многостраничной таблицы управляет опция Footer is on each page. В случае, если опция выключена, итоговая часть будет искаться только у последней одностраничной подтаблицы.

Поиск многостраничной таблицы

Поиск многостраничной таблицы ведется, начиная с первой страницы заданной области поиска, и на каждой последующей странице. Поиск многостраничной таблицы завершается при достижении одного из следующих условий:
  1. Если итоговая часть таблицы должна присутствовать только на последней странице, и она найдена.
  2. Если закончилась заданная область поиска таблицы.
  3. Если на очередной странице не нашлась одностраничная подтаблица, т.е. не нашлось ни заголовка, ни итоговой части, ни тела таблицы.

Использование региона другого элемента для выделения заголовка столбца многостраничной таблицы

При поиске многостраничных таблиц заголовочную и итоговую части таблицы и ее подтаблиц можно по-прежнему искать двумя основными способами: либо задавая ключевые слова для поиска (т.е. используя опцию Detect by keyword), либо же параметризуя заголовок или итог уже найденным ранее элементом (т.е. используя опцию Use found element as...). В первом случае, аналогично поиску одностраничных таблиц, программа будет самостоятельно искать заданные ключевые слова на тех страницах, где это разрешено опциями Header/Footer is on each page. В случае же, когда особенности обрабатываемых изображений не позволяют стабильно находить заголовки табличных столбцов при помощи установленных по умолчанию параметров поиска ключевых слов, рекомендуется пользоваться уже найденными элементами.

Если при поиске многостраничной таблицы заголовок и итоговая часть таблицы ищутся только на первой и последней страницах соответственно, то в таком случае можно, как и прежде, воспользоваться уже найденными простыми элементами. Такой подход используется в примере 3 (проект данного примера находится в %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Invoice). Однако в случае, когда заголовок или итог нужно искать на каждой странице, рекомендуется использовать в качестве уже найденных подэлементов заголовка элементы, расположенные внутри повторяющейся группы (т.е. подэлементов предварительно найденного элемента типа Repeatable group). При помощи повторяющейся группы можно отыскать заголовок таблиц на каждой странице, описав его один раз в составе повторяющейся группы, а также указав допустимые параметры повторений экземпляров такой группы. Если табличный элемент описан ниже по дереву, чем повторяющаяся группа, то при создании ссылок заголовков табличных колонок на повторяющуюся группу используйте все экземпляры (AllInstances) нужных подэлементов повторяющейся группы (пример такого проекта находится в %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Invoice with Repeatable Groups).

Замечание: если используемая повторяющаяся группа имеет несколько экземпляров на странице, то в качестве заголовка табличной колонки будет выбран первый из экземпляров.

Особенности поиска таблиц, имеющих несколько экземпляров на странице

Документ может содержать на одной странице несколько таблиц с одинаковой структурой, т.е. одинаковым расположением и последовательностью столбцов. При этом возможна ситуация, что последняя такая таблица продолжается на следующей странице и т.д. Между такими таблицами может располагаться различная текстовая и графическая информация, например, подзаголовки таблиц или сопроводительный текст.

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

При необходимости параметризовать поиск заголовка столбца предварительно найденным вспомогательным элементом (опция Use found element as...), удобно разместить этот элемент внутри той же повторяющейся группы выше табличного элемента. Тогда, выбирая вспомогательный элемент для поиска заголовка столбца, следует ссылаться на текущий экземпляр (CurrentInstance) вспомогательного элемента в составе повторяющейся группы. Таким образом, при поиске каждого экземпляра табличного заголовка столбца будет использоваться свой соответствующий экземпляр вспомогательного элемента (пример такого проекта см. %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Prices).

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.


Гипотезы

Гипотеза - предположение, что найденный объект(ы) изображения соответствует элементу, т.е. удовлетворяет заданным свойствам и условиям поиска данного элемента.

Замечание. В области поиска элемента может находиться несколько объектов, соответствующих данному элементу. В этом случае в области поиска будет сформировано несколько гипотез элемента.

Основной характеристикой гипотезы является Качество гипотезы.

Качество гипотезы - оценка, показывающая, насколько хорошо найденный объект соответствует данному элементу (его свойствам и условиям поиска).

Качество гипотезы представляет собой число от 0 до 1. Качество гипотезы для составного элемента вычисляется перемножением качеств гипотез для всех его подэлементов.

Качество гипотезы получается в результате перемножения качеств [Pre-search quality] и [Post-search quality], где

  • Pre-search quality - качество свойств элемента, заданных в диалоге свойств на закладке General, закладке типа элемента, закладке Search Constraints, закладке Relations и на закладке Advanced в разделе Advanced pre-search relations;
  • Post-search quality - является результатом применения условий, заданных на закладке Advanced в разделе Advanced post-search relations.

Для необязательных элементов при наложении гибкого описания может быть создана так называемая нулевая гипотеза.

Нулевая гипотеза - это предположение о том, в области поиска элемента искомый объект отсутствует. Нулевая гипотеза формируется, если в области поиска не найден ни один объект, соответствующий необязательному элементу и имеющий качество выше, чем качество нулевой гипотезы. Качество нулевой гипотезы задается в диалоге свойств элемента на закладке General.

Таким образом, если ни один объект, соответствующий необязательному элементу, не был найден, то наложение гибкого описания не прекращается, а формируется нулевая гипотеза и ей присваивается качество, заданное пользователем при описании необязательного элемента.

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

Пример поиска объекта изображения и выдвижения гипотез

Допустим, нам надо описать два элемента для поиска статического текста. Первый элемент (StaticText1) будет описывать условия поиска статического текста со значением «мама», а второй (StaticText2) - статического текста со значением «папа». Будем считать, что оба элемента не являются обязательными, и качество нулевой гипотезы у обоих имеет значение по умолчанию 0,97.

Не задаем никаких условий, ограничивающих область поиска элемента StaticText1. Но, допустим, мы знаем, что элемент StaticText2 должен находиться ниже элемента StaticText1. Поэтому для элемента StaticText2 зададим соответствующее условие на закладке Relations свойств элемента (Below: SearchElements.StaticText1;). Зададим значение искомого текста для каждого элемента. Чтобы исключить ошибку, связанную с перепутыванием слов «мама» и «папа» при поиске, но все же допуская, что качество изображения может привести к ошибкам предраспознавания искомых слов, зададим Max number of errors (максимальное абсолютное количество ошибок) для обоих элементов равным 1, т.е. допустима одна ошибка.

Посмотрим, что получится на тестовом изображении, в котором слово «мама» присутствует дважды (выше и ниже слова «папа»), но в слове, расположенном выше присутствует ошибка в одном символе.

После запуска процедуры наложения гибкого описания на данном изображении увидим, что для элемента StaticText1 было сформировано две гипотезы. Одна с качеством 0,98, соответствующая слову с ошибкой (выше слова «папа»). А другая, не содержащая ошибок, но находящаяся ниже слова «папа», получила качество 1.

На данном этапе качество каждой из цепочек совпадает с качеством соответствующих гипотез. Поэтому лучшая цепочка состоит из гипотезы с качеством 1.

Поскольку мы задали в условиях поиска элемента StaticText2 «искать ниже элемента StaticText1», и у нас сформировались две гипотезы элемента StaticText1, программа пытается найти этот элемент в двух областях поиска. В случае гипотезы элемента StaticText1 с качеством 1, соответствующей слову «мама», расположенному ниже слова «папа», элемент StaticText2 не нашелся, т.е. была сформирована нулевая гипотеза с качеством 0,97. В этом случае итоговое качество Chain quality цепочки, состоящей из двух гипотез, является результатом перемножения их оценок качества 1 и 0,97, т.е. равно 0,97.

В случае гипотезы элемента StaticText1 с качеством 0,98, соответствующей слову «мама», расположенному выше слова «папа», элемент StaticText2 был обнаружен и была сформирована гипотеза с качеством 1. В этом случае итоговое качество Chain quality цепочки, состоящей из двух гипотез, является результатом перемножения их оценок качества 0,98 и 1, т.е. равно 0,98.

В итоге оказалась сформирована единственная гипотеза элемента StaticText2, соответствующая лучшей цепочке.


Выдвижение гипотез

Наложение гибкого описания - это попытка программы найти на изображении объекты, соответствующие элементам гибкого описания, с последующим выставлением оценки соответствия результата поиска заданному описанию. В качестве оценки используется десятичное число от 0 до 1. Значение, равное 1, означает стопроцентное соответствие найденного результата описанию. Если оценка отлична от нуля, то наложение гибкого описания также включает в себя этап формирования регионов блоков FlexiLayout.

При наложении гибкого описания на изображение элементы ищутся последовательно в том порядке, в котором они описаны в гибком описании, сверху вниз по ветке элементов. Для каждого элемента в заданной области поиска может быть найдено несколько объектов изображения (или наборов объектов), подходящих под описание элемента. Программа рассматривает найденные различные варианты в качестве гипотез расположения элемента на изображении. Каждому такому варианту, называемому «гипотезой», программа выставляет оценку соответствия описанию элемента, которая называется оценкой качества гипотезы.

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

Если элементы объединены в группу с помощью составного элемента, то вся группа тоже представляет собой элемент, для которого формируется несколько возможных гипотез, по числу завершенных цепочек подэлементов группы. Оценка качества гипотезы составного элемента Group вычисляется перемножением качеств гипотез элементов, входящих в составной элемент. Все гибкое описание FlexiLayout целиком само по себе является составным элементом, так что качество наложения гибкого описания определяется перемножением качества всех его элементов.

Задача наложения гибкого описания заключается в поиске наилучшей завершенной ветки всего дерева гипотез, т.е. включающей все элементы от первого до последнего. Общее решение такой задачи подразумевает рассмотрение всех возможных комбинаций гипотез всех элементов между собой, построение полного множества завершенных веток и выбор лучшей из них. Однако на практике такое решение заняло бы слишком много времени. К тому же при увеличении числа элементов и недостаточно строгом ограничении области поиска и параметров элементов возможен комбинаторный взрыв, т.е. резкое увеличение числа рассматриваемых вариантов.

С целью ограничения времени перебора вариантов программа использует несколько принципов оптимизации поиска.

Принципы оптимизации поиска

Каждый элемент имеет свойство Number of surviving hypotheses, которое ограничивает число гипотез данного элемента, которые будут использоваться в дальнейшем поиске, т.е. при поиске следующего элемента. По умолчанию значение этого свойства равно 5 для простых элементов и 1 для составных элементов. Это означает, что, найдя в заданной области поиска 15 гипотез для простого элемента, программа выберет из них 5 лучших. Остальные 10 цепочек гипотез останутся незавершенными. Поскольку составной элемент ищется с большей степенью надежности, чем простой, то его лучшая гипотеза, как правило, оказывается верной.

В процессе поиска объектов, соответствующих элементам, программа практически всегда имеет несколько незавершенных цепочек гипотез для найденных объектов, а, следовательно, и несколько возможностей для продолжения поиска. Поиск наилучшей гипотезы производится с помощью классического алгоритма "поиска в ширину" – то есть программа всегда ищет продолжение цепочки гипотез, которая является наилучшей по качеству на данном этапе поиска, независимо от длины этой цепочки. Например, если для гибкого описания из 30 элементов в процессе поиска существуют 2 цепочки: одна из 29 элементов с качеством 0.89, другая из 2-х элементов с качеством 0.92, то будет развиваться вторая цепочка до тех пор, пока все ее продолжения не станут хуже, чем первая.

Для составного элемента применяется правило оптимизации по качеству: если найдена идеальная завершенная цепочка этого элемента, т.е. качество найденной цепочки равно 1, то другие варианты подэлементов данной группы программой не рассматриваются.

Для каждого элемента программа ограничивает общее число гипотез элемента на всех ветках дерева гипотез числом 10000.

Подробнее

Построение и оценка гипотез для типов элементов


Построение и оценка гипотез для элементов

В качестве результата формирования гипотезы (поиска подходящего объекта изображения) программа выдает (показывает на изображении) Регион элемента.

Регион - это область изображения (представленная связным набором прямоугольников), описанная вокруг найденного объекта(ов) изображения. Регионом нулевой гипотезы является вся область поиска элемента.

В области поиска может находиться несколько объектов, удовлетворяющих описанию элемента, для каждого из них можно сформировать гипотезу. При описании каждого элемента можно задать максимальное число гипотез - число, ограничивающее при поиске перебор рассматриваемых вариантов объектов изображения, соответствующих данному элементу. В формировании гипотез последующих элементов участвует только заданное число лучших (по качеству) гипотез данного элемента. Максимальное число лучших гипотез элемента задается при описании элемента, в диалоге cвойств элемента, на закладке General. Для простых элементов это число по умолчанию равно 5, для составных 1.

Внимание!

Не рекомендуется увеличивать максимальное число гипотез, заданное по умолчанию.

Качество формируемых гипотез зависит от специфических свойств каждого типа элементов.


Формирование и оценка гипотез для элемента Static Text

При поиске статического текста на изображении допускается неточное совпадение результата распознавания текстового объекта и заданного значения текста элемента.

Например, можно задать свойства элемента Static text таким образом, что при поиске статического текста «Поставщик» будут рассматриваться в качестве гипотез объекты изображения вида «Поставчик», «Ростовщик» и т.п.

В свойствах элемента задаются значения свойств:

  • Max error percentage - относительное максимально допустимое число ошибок в слове в процентах, т.е. отношение числа ошибок в тексте гипотезы к числу букв в тексте гипотезы.
  • Max number of errors - абсолютное максимально допустимое число ошибок в слове (каждый неверный символ или его отсутствие считается ошибкой).

Если число ошибок превысит значение, указанное в свойстве, то найденный объект не будет рассматриваться в качестве гипотезы. Если же созданная гипотеза содержит допустимое число ошибок, то ее качество будет тем ниже, чем больше в ней ошибок.

Поскольку заранее не известно, из скольких букв будет состоять найденный объект (это зависит от изображения), а также из-за того, что элемент допускает задание нескольких вариантов текста для поиска (разной длины), то в каждом случае формирования гипотезы отсекающим будет являться либо абсолютный (Max number of errors), либо относительный (Max error percentage) параметр. В процессе формирования и оценки гипотезы используется условие, оказывающееся более строгим, т.е. если найденный объект будет удовлетворять одному параметру, но не удовлетворять другому, то объект не будет рассматриваться в качестве гипотезы.

Сформированная гипотеза элемента Static text имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Keyword | Указываются слова, вошедшие в гипотезу. Для каждого слова указывается количество ошибок.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу (True), или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Chain quality позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Static Text, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента Separator

При формировании гипотез рассматриваются только объекты типа Separator, найденные при предраспознавании.

Сформированная гипотеза элемента Separator имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Orientation | Указывается ориентация найденного разделителя.
Relative length | Указывается относительная длина найденного разделителя
Space length | Указывается абсолютная длина пробела внутри найденного разделителя.
Relative space length | Указывается относительная длина пробела внутри найденного разделителя.
Orthogonal shift | Указывается значения свойства Orthogonal shift, т.е. расстояние между разделителями (в направлении, перпендикулярном направлению разделителя), объединенными в данную гипотезу.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу, (True) или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Separator, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента White Gap

Формирование гипотез элемента White Gap ведется с помощью построения гистограммы объектов.

По умолчанию просвет ищется среди объектов типа Raw Text. Чтобы найти просвет среди объектов другого типа (например, разделителях), нужно написать соответствующее условие поиска в диалоге свойств элемента White Gap на закладке Advanced в поле Advanced pre-search relations. Например, если необходимо найти просвет в области, в которой встречаются объекты всех типов, надо написать выражение Type: PictureObject + SeparatorObject+ AnyText + PunctuationMark + CheckMarkObject;.

Построение гистограммы

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

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

Например, пусть в области поиска находятся текстовые объекты H1, H2, ..., H9. На рисунке, приведенном ниже, эти объекты показаны черным цветом. Пусть также в области поиска присутствуют объекты других типов, они показаны красным.

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

Далее находится максимальный уровень гистограммы (на рис. Max). Значение максимального уровня умножается на значение, заданное в свойстве Threshold coefficient (%) (K=0.2). Получаем максимально допустимый уровень просвета (на рис. White Gap threshold). Если полученное значение White Gap threshold>0, то в области просвета допускается наличие посторонних объектов.

После вычисления максимально допустимого уровня просвета, его значение сравнивается со значениями свойств Lower threshold limit и Upper threshold limit. Если White Gap threshold<Lower threshold limit, то свойству White Gap threshold присваивается значение Lower threshold limit, и именно это значение будут использовано для нахождения просвета. Если White Gap threshold>Upper threshold limit, то , то свойству White Gap threshold присваивается значение Upper threshold limit.

Затем выполняется сравнение высот участков гистограммы со значением White Gap threshold, и находятся участки, на которых уровень гистограммы ниже уровня White Gap threshold.

Свойство Min width/height позволяет задать минимальную абсолютную ширину просвета. Если для него выбрать значение W2, две другие гипотезы рассматриваться не будут.

Сформированная гипотеза элемента White Gap имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Orientation | Указывается направление найденного просвета.
Histogram maximum in search area | Указывается максимальный уровень гистограммы в области поиска.
White Gap threshold | Указывается вычисленный максимально допустимый уровень гистограммы, при котором просвет будет считаться найденным.
Histogram maximum within hypothesis | Указывается максимальный уровень гистограммы в области гипотезы просвета.
Detected | Указывается, был ли найден элемент (True) или нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента White Gap, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента Barcode

При формировании гипотез рассматриваются только объекты типа Barcode, найденные при предраспознавании.

Сформированная гипотеза элемента Barcode имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Text | Указывается распознанное значение штрих-кода.
Type | Указывается тип найденного штрих-кода.
Orientation | Указывается ориентация найденного штрих-кода.
Number of suspicious symbols | Количество неуверенно распознанных символов.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу, (True) или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Barcode, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента типа Character String

Если в свойствах элемента задано регулярное выражение, то в области поиска ищутся все строки, удовлетворяющие данному регулярному выражению. Если же регулярное выражение не задано, то построение гипотез ведется на основе заданных алфавитов.

При формировании гипотез рассматриваются все текстовые объекты, пересекающие область поиска по горизонтали (по вертикали объекты должны попадать в область поиска целиком). Из текстовых объектов начинают строиться строки. Построение строки ведется слева направо и прекращается при превышении заданной допустимой длины пробела, выбранной в свойстве Max space length.

В полученных строках выделяются последовательности символов, каждая из которых принадлежит только одному из заданных алфавитов. Также происходит деление строк на фрагменты.

Из полученных фрагментов формируются гипотезы. Формирование может происходить по двум различным принципам, в зависимости от выбора опции Allow embedded hypotheses.

Предположим, на предыдущем этапе было сформировано три фрагмента. Если опция Allow embedded hypotheses выбрана, то гипотезы строятся следующим образом:

гипотеза 1: фрагмент 1
гипотеза 2: фрагмент 1 + фрагмент 2
гипотеза 3: фрагмент 1 + фрагмент 2 + фрагмент 3
гипотеза 4: фрагмент 2
гипотеза 5: фрагмент 2 + фрагмент 3
гипотеза 6: фрагмент 3

Для каждой гипотезы проверяется, что в ее составе доля каждого из заданных алфавитов не превышает заданную в параметре Percentage of alphabet characters. Также проверяется, что не превышена заданная в параметре Percentage of non-alphabet characters доля символов, не входящих ни в один из алфавитов. Если для некоторой гипотезы не выполняется хотя бы одна из проверок, гипотеза не создается.

Если опция Allow embedded hypotheses не выбрана, то из перечисленных выше гипотез будут отброшены вложенные. Иными словами, те, которые входят целиком в какую-нибудь другую гипотезу из списка. Если проверки выполнились на всех гипотезах, то в итоге останется только одна гипотеза: фрагмент 1 + фрагмент 2 + фрагмент 3.

Таким образом, если опция Allow embedded hypotheses не выбрана, создаются гипотезы максимальной длины, удовлетворяющие всем условиям. Хотя вложенные гипотезы при этом исключаются, пересечение гипотез возможно. Это может быть отдельно стоящий символ или слово, или даже последовательность слов, которые входят в несколько гипотез, но не выделяются в отдельные гипотезы. Т.е., например, могут быть сформированы две строки (гипотезы): одна заканчивается на некоторое слово (фразу), а другая с него (нее) начинается.

Пример.

гипотеза 1: фрагмент 1 + фрагмент 2
гипотеза 2: фрагмент 2 + фрагмент 3

После формирования всех возможных гипотез происходит вычисление оценки качества Pre-search quality каждой из них (т.е. оценки, насколько хорошо гипотеза удовлетворяет параметрам поиска, заданным в диалоге свойств на закладке типа элемента и на закладке Advanced в разделе Advanced pre-search relations). На данном этапе вычисление Pre-search оценки качества осуществляется на основе попадания длины гипотезы в символах в нечеткий интервал, заданный в свойстве Character count, проверки попадания длины суммарного пробела в строке в нечеткий интервал, заданный параметром TotalGapLength, и проверки попадания количества слов в строке в нечеткий интервал, заданный в свойстве Word count.

Общая оценка гипотезы элемента получается перемножением всех оценок.

Сформированная гипотеза элемента Character String имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Text | Указывается последовательность символов, входящих в гипотезу.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу (True), или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Character String, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента типа Paragraph

Формирование и оценка гипотез для элемента Paragraph

Сформированная гипотеза элемента Paragraph имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Text | Указывается текст, входящий в гипотезу.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу, (True) или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Paragraph, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента типа Date

Формирование и оценка гипотез для элемента Date

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

Сформированная гипотеза элемента Date имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Day | Указывается день найденной даты.
Month | Указывается месяц найденной даты.
Year | Указывается год найденной даты.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу, (True) или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Date, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента типа Object Collection

При формировании гипотез рассматривается объединение всех объектов изображения, удовлетворяющих свойствам и условиям поиска элемента.

Сформированная гипотеза элемента Object Collection имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу, (True) или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Object Collection, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента типа Group

Объединение некоторого набора элементов в группу, т.е. в составной элемент, позволяет при формировании гипотез последующих элементов рассматривать этот набор подэлементов как единое целое, имеющее собственную завершенную гипотезу (реально состоящую из гипотез подэлементов), а значит, и оценку качества всей группы в целом. Перебор возможных сочетаний гипотез подэлементов между собой происходит внутри группы, а в дальнейшем в формировании гипотез последующих элементов участвует только заданное число лучших гипотез группы.

Замечание. Все дерево элементов целиком представляет собой один составной элемент, лучшая гипотеза которого и содержит результат наложения гибкого описания.

Составной элемент позволяет написать ограничение на область поиска, общее для всех подэлементов. Область поиска конкретного подэлемента будет вычисляться как пересечение области поиска, заданной в самом подэлементе, и области поиска всей группы, в составе которой подэлемент находится.

Внимание!
Область поиска составного элемента и некоторого его подэлемента могут не пересекаться. Из-за обнуления области поиска подэлемент не найдется. Поэтому для составного элемента рекомендуется задавать только простые отношения, например, "Above: PageRect.Top + PageRect.Height/2;" (искать элемент в верхней половине изображения), или не задавать их вовсе.

Сформированная гипотеза элемента Group имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу, (True) или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Group, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента Phone

При формировании гипотез рассматриваются только текстовые объекты, найденные при предраспознавании и имеющие формат, соотвествующий элементу Phone.

Сформированная гипотеза элемента Phone имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Number | Указывается найденный номер телефона.
Prefix | Указывается найденный префикс перед номером телефона.
Prefix rect. | Указываются координаты прямоугольника найденного префикса перед номером телефона.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу, (True) или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Phone, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента Currency

При формировании гипотез рассматриваются только текстовые объекты, найденные при предраспознавании и имеющие формат, соотвествующий элементу Currency.

Сформированная гипотеза элемента Currency имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Value | Указывается найденное числовое значение.
Currency name | Указывается найденное название валюты.
Currency name rect. | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы названия валюты.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу, (True) или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Currency, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента Table

Поиск таблиц и разметка столбцов и строк таблицы выполняется по имеющимся на изображении черным разделителям и белым просветам. Помимо разделителей и просветов для удобства нахождения и разметки таблиц используются заголовочная и итоговая часть таблицы. Обе эти части выполняют вспомогательную функцию: они ограничивают содержательную часть таблицы сверху и снизу, помогая тем самым обнаружить тело таблицы и извлечь из него данные. Заголовочная часть таблицы содержит называния столбцов, по ней выполняется разбивка таблицы на столбцы.

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

Сформированная гипотеза элемента Table имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Header found | Указывается, найдена ли заголовочная часть таблицы.
Footer found | Указываются, найдена ли итоговая часть таблицы.
Body found | Указывается, найдено ли тело таблицы.
Order name | Указывается имя фиксированной последовательности столбцов, обнаруженной в таблице.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу (True), или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Chain quality позволяет сравнивать конкурирующие цепочки между собой.

Сформированная гипотеза заголовочной части таблицы имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Перечень имен столбцов | Для каждого столбца указывается, найден ли столбец таблицы.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу (True), или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Chain quality позволяет сравнивать конкурирующие цепочки между собой.

Сформированная гипотеза итоговой части таблицы имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу (True), или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Chain quality позволяет сравнивать конкурирующие цепочки между собой.

Сформированная гипотеза тела таблицы имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Order name | Указывается имя фиксированной последовательности столбцов, обнаруженной в таблице.
Found columns | Перечень имен найденных столбцов.
Rows number | Указывается количество рядов в найденном теле таблицы.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу (True), или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Chain quality позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Работа с таблицами

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента типа Repeatable Group

Сформированная гипотеза элемента Repeatable Group имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу, (True) или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Данный показатель позволяет сравнивать конкурирующие цепочки между собой.

Подробнее

Свойства элемента Repeatable Group, задающие параметры искомого объекта

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента Labelled Field

Формирование и оценка гипотез для элемента Labeled Field

Элемент Labeled Field является групповым элементом с предопределенным составом. Формирование и оценка гипотез для данного элемента осуществляется так же, как и для элемента Group.

Сформированная гипотеза элемента Labeled Field имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Detected | Указывается, был ли найден объект изображения, соответствующий элементу (True), или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.
Chain quality | Указывается текущее качество участка цепочки поиска от первого подэлемента текущей группы до данного включительно. Качество цепочки вычисляется перемножением качеств всех подэлементов цепочки. Chain quality позволяет сравнивать конкурирующие цепочки между собой.

Аналогичные свойства имеют гипотезы подэлементов. Кроме того, гипотеза каждого подэлемента имеет дополнительные свойства.

Подэлемент LabeledField.Label

Свойство | Описание
Keyword | Указываются слова, вошедшие в гипотезу. Для каждого слова указывается количество ошибок.

Подэлемент LabeledField.Gap

Свойство | Описание
Orientation | Указывается направление найденного просвета.
Histogram maximum in search area | Указывается максимальный уровень гистограммы в области поиска.
White Gap threshold | Указывается вычисленный максимально допустимый уровень гистограммы, при котором просвет будет считаться найденным.
Histogram maximum within hypothesis | Указывается максимальный уровень гистограммы в области гипотезы просвета.

Подэлемент LabeledField.Field

Гипотеза данного элемента может иметь различные свойства в зависимости от типа поля.

Тип поля | Свойство | Описание
Any text | Text | Текст гипотезы.
Fixed variants | Keyword | Слова, вошедшие в гипотезу. Для каждого слова указывается количество ошибок.
Number | Text | Текст гипотезы.
Currency | Value | Найденное числовое значение.
 | Currency name | Найденное наименование валюты.
Date | Day | Число.
 | Month | Месяц.
 | Year | Год.
Phone | Number | Найденный телефонный номер.
 | Prefix | Найденный префикс.
Regular expression | Text | Текст гипотезы.

Подробнее

Область поиска

Дополнительные условия поиска


Формирование и оценка гипотез для элемента Region

При формировании гипотез элемента Region объекты, попадающие в область поиска, не рассматриваются.

Сформированная гипотеза элемента Region имеет следующие свойства:

Свойство | Описание
Element name | Указывается полное имя элемента.
Page | Указывается номер страницы, на которой был найден элемент.
Surrounding rect | Указываются координаты описывающего прямоугольника, содержащего регион гипотезы.
Width | Ширина региона гипотезы.
Height | Высота региона гипотезы.
Detected | Указывается, была ли найдена область элемента (True), или сформирована нулевая гипотеза (False).
From the best path | Указывается, принадлежит ли найденная гипотеза к лучшему пути в дереве гипотез (True) или нет (False).
Pre-search quality | Указывается качество гипотезы, с которым она удовлетворяет свойствам элемента, заданным явно или с помощью Advanced pre-search relations.
Post-search quality | Указывается качество гипотезы, с которым она удовлетворяет условиям, заданным с помощью Advanced post-search relations.

Подробнее

Область поиска

Дополнительные условия поиска


Дерево гипотез

При наложении каждого варианта гибкого описания на изображение программа последовательно формирует гипотезы для всех созданных элементов. Гипотезы элементов формируются последовательно: от первого (верхнего) элемента в дереве до последнего (нижнего). На основе сформированных гипотез строится дерево гипотез. При успешном наложении варианта дерево гипотез отображается в окне Hypotheses. Если наложились несколько вариантов, отображается дерево гипотез первого из них. Если описание наложить не удалось, отображается дерево гипотез первого варианта описания.

Замечание. Количество сформированных гипотез одного элемента может превысить значение, заданное в свойстве Number of surviving hypotheses данного элемента. В этом случае в дерево гипотез войдет только заданное в свойстве Number of surviving hypotheses число лучших (по качеству) гипотез.

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

На основе сформированных гипотез элементов, входящих в лучший путь (данного дерева гипотез), вычисляется месторасположение блоков гибкого описания.

Дерево гипотез отображается в окне Hypotheses. Для того, чтобы просмотреть дерево гипотез для данного изображения:

  1. Откройте изображение.

  2. Наложите гибкое описание на открытое изображение (команда Match в меню Image или в локальном меню).

Для того чтобы просмотреть гипотезы элементов, входящих в составной элемент:

  1. Выберите гипотезу.

  2. Нажмите Enter или воспользуйтесь командой Show Details контекстного меню.

Для того чтобы вернуться на один уровень вверх нажмите Ctrl+Enter или выберите команду Go One Level Up в контекстном меню.

Замечание. Дерево гипотез, построенное для данного изображения, удаляется при закрытии изображения. Сохраняется лучший путь в дереве, т.е. цепочка гипотез элементов, на основе которой был построен Matched Layout. Эти гипотезы можно просмотреть при повторном открытии изображения. Все дерево гипотез целиком не хранится, поскольку при увеличении числа элементов FlexiLayout дерево гипотез может стать чрезвычайно разветвленным и занимать слишком большой объем памяти (а при сохранении - файлового пространства).

Дерево гипотез имеет следующий вид:

В левом столбце в том порядке, как они описаны в дереве элементов, указываются элементы первого уровня вложенности.

В правом столбце специальным значком отображаются гипотезы, сформированные для соответствующего элемента. Сформированные гипотезы соединены линиями, показывающими последовательность формирования гипотез. Гипотезы лучшего пути соединены зелеными линиями, остальные - серым.

Обозначение | Описание
 | Ненулевая гипотеза элемента, принадлежащая лучшему пути.
 | Ненулевая гипотеза элемента, не принадлежащая лучшему пути.
 | Нулевая гипотеза элемента, принадлежащая лучшему пути.
 | Нулевая гипотеза элемента, не принадлежащая лучшему пути.
 | Недостроенная цепочка гипотез составного элемента (Group, Repeatable Group, Header, Footer). Позволяет просмотреть недостроенную цепочку гипотез, чтобы обнаружить ненайденный элемент.
, [image] , [image] , | В подветке данного элемента отображается гипотеза, принадлежащая лучшему пути. Для того чтобы просмотреть все гипотезы, нажмите "+" или в локальном меню выберите команду Expand Active.
, [image] , [image] , | Отображаются все гипотезы подветки данного элемента. Для того чтобы скрыть гипотезы не принадлежащие лучшему пути, нажмите "-" или в локальном меню выберите команду Collapse Active.
, [image] , [image] , [image] , | Подветка гипотез данного элемента далее не была построена.


Отладка гибкого описания

Гибкое описание FlexiLayout является часть проекта FlexiLayout Studio и создается при создании проекта. В этот момент гибкое описание не содержит блоков и элементов. Создание блоков и элементов FlexiLayout рекомендуется выполнять параллельно с отладкой самого описания. Отладка гибкого описания заключается в том, что после создания каждого элемента или блока рекомендуется скомпилировать гибкое описание и наложить гибкое описание на каждое тестовое изображение. При этом нужно убедиться в том, что гибкое описание не содержит ошибок и при наложении описания находятся все необходимые объекты изображения и блоки.

Причины ненахождения элементов и блоков могут заключаться в том, что на данном изображении искомый(е) объект(ы) не попал(и) в область поиска, или не удовлетворяе(ю)т параметрам, заданным для элемента. Таким образом, отладка заключается в обнаружении изображений с ошибками, корректировке описания и повторном наложении описания. Исправленное описание нужно наложить как на проблемные страницы, чтобы убедиться, что ошибка исправлена, так и на остальные страницы, чтобы убедиться, что из-за корректировки условий поиска элемента описание не перестало на них правильно накладываться.

Кроме того, по мере добавления новых элементов нужно проверять правильность их наложения на всех страницах тестового пакета. Таким образом, в процессе создания гибкого описания просмотр результатов наложения пользователем происходит многократно. При наличии в пакете нескольких десятков изображений данная процедура становится утомительной. Чтобы облегчить пользователю проверку наложения описания на страницы пакета, можно создать так называемый Reference layout - "правильную", или эталонную, разметку блоков на странице. При наложении описания на страницу, имеющую Reference layout, программа автоматически вычисляет разницу между эталонной разметкой и результатом наложения описания (Matched layout). Результат сравнения выражается в процентном соотношении площади блоков указанных видов разметки и отображается в окне пакета. Таким образом, при отладке описания пользователь может не открывать все страницы пакета одну за одной, а отслеживать различия разметок в окне пакета. Следует стремиться к тому, чтобы Matched layout как можно меньше отличался от Reference layout. Совпадение Matched layout и Reference layout соответствует значению 0% в столбцах Missing Areas и Excess Areas, отображаемых в окне Batch. Чем больше указанные там проценты различий, тем хуже наложилось описание.

Эталонную разметку Reference layout можно создать как на основе результата наложения описания Matched layout, так и нарисовать вручную. Подробнее о создании Reference layout см. Эталонная разметка.

Совет. Для удобства отладки гибкого описания в программе FlexiLayout Studio имеется возможность исключать элемент из описания (меню FlexiLayout>Disable). Также для удобства просмотра изображения имеется возможность скрыть на изображении активный блок или элемент (меню Image>Hide Active Blocks or Elements).

Подробнее

Компиляция гибкого описания

Наложение гибкого описания

Эталонная разметка

Исключение элемента

Тестирование элементов


Компиляция гибкого описания

Компиляция гибкого описания - это проверка программой FlexiLayout Studio корректности созданного описания: свойств элементов, задающих параметры искомого объекта изображения, области поиска, дополнительных условий поиска, а также свойств блоков гибкого описания.

В процессе компиляции проверяется следующее:

  1. Свойства элементов.
    Все свойства элемента, задающие параметры искомого объекта (закладка типа элемента) и условия, задающие область поиска (закладки Search Constraints, Relations) должны содержать ссылки только на элементы, описанные в ветви элементов выше данного. Если в ходе проверки найдено несоответствие данному требованию, то программа укажет некорректный элемент;
  2. Свойства блоков.
    Свойства блоков не должны содержать ссылки на несуществующие или исключенные элементы;
  3. Правильность выражений написанных на языке описания FlexiLayout (условия, заданные на закладке Advanced).
    Для всех выражений написанных на языке описания FlexiLayout должны выполняться условия:
  • Код не должен содержать синтаксических ошибок;
  • Дополнительные условия, заданные на закладке Advanced в разделе Advanced pre-search relations должны ссылаться только на элементы, описанные в дереве элементов выше данного. Дополнительные условия, заданные на закладке Advanced в разделе Advanced post-search relations должны ссылаться только на сам элемент и на элементы, описанные в дереве элементов выше данного. Если в ходе проверки найдено несоответствие данному требованию, то программа укажет некорректный элемент;
  • Все глобальные константы, используемые в коде, должны быть определены;
  • Все переменные, используемые в коде, должны быть определены и инициализированы;
  • Код должен обращаться только к сущностям, доступным в конкретном разделе кода.
    Свойства блоков должны содержать ссылки только на регионы элементов. Для элемента данного типа можно задать только свойства, присущие данному типу элементов (например, нельзя задать свойство Max width для элемента Static Text).

Для того чтобы скомпилировать гибкое описание, выберите команду Build в меню FlexiLayout или в локальном меню FlexiLayout.

Замечание. Компиляция гибкого описания автоматически выполняется перед наложением описания на изображение и при сохранении гибкого описания, а также при экспорте. Если при компиляции описания обнаружены ошибки, то в дереве описания ошибочные блоки и элементы помечаются иконками с красными крестиками. При этом в диалоге свойств ошибочного элемента появляется закладка Errors (последняя в ряду закладок), содержащая сообщения об ошибках, выявленных при компиляции данного элемента.

Сообщения на закладке Errors помечаются красными или желтыми флажками. Красный флажок означает ошибку, желтый - предупреждение. Если при компиляции описания обнаружена ошибка хотя бы одного элемента или блока, то все описание не может быть наложено на изображение. Если сообщение на закладке Errors относится к коду, заданному на закладке Advanced, то можно быстро перейти непосредственно на оператор кода, вызвавший данное сообщение , дважды щелкнув мышью по строке сообщения. Наличие предупреждений не является ошибкой и не препятствует наложению описания. Предупреждения, как правило, обращают внимание пользователя на потенциально опасные преобразования типов в коде.

Наложение гибкого описания на изображения тестового пакета, а также экспорт описания возможны только в случае, если описание не содержит ошибок компиляции.


Наложение гибкого описания

Наложение гибкого описания - это процесс поиска на изображении объектов изображения, соответствующих созданным элементам, и разметки блоков, описанных в гибком описании.

При наложении гибкого описания программа пытается последовательно (сверху вниз в ветке элементов) найти все объекты, описанные элементами, а затем, опираясь на заданные в гибком описании условия, разметить блоки на изображении.

Для того чтобы наложить гибкое описание:

  1. Выберите одно или несколько изображений пакета.
  2. Выберите Match в меню Batch (или в локальном меню пакета).

Для того чтобы наложить гибкое описание на изображение и просмотреть дерево гипотез для него:

  1. Откройте требуемое изображение.
  2. Выберите Match в меню Image (или в локальном меню изображения).


Эталонная разметка

Для каждого изображения пакета, можно создать эталонную разметку, которая будет отражать желаемое расположение блоков на изображении. Эталонная разметка может быть создана вручную, также можно создать эталонную разметку на основе результатов наложения гибкого описания. Созданную эталонную разметку можно редактировать, то есть добавить или удалить блоки, изменить размер, конфигурацию и положение блоков.

Эталонная разметка нужна на этапе отладки гибкого описания, она помогает создать по возможности оптимальное описание. Эталонная разметка дает возможность сравнивать результаты наложения гибкого описания и желаемое расположение блоков на каждом изображении пакета.

Эталонная разметка создается в режиме Reference layout. Для перехода в этот режим просмотра изображения воспользуйтесь кнопкой [image], расположенной на панели инструментов.

Режим просмотра изображения Difference layout (кнопка [image] на панели инструментов) позволяет увидеть разницу между эталонной разметкой и расположением блоков, полученным в результате наложения гибкого описания. Области, входящие в блоки эталонной разметки, но не вошедшие в блоки после наложения гибкого описания (Missing Areas) выделяются красным цветом. Области, не входящие в блоки эталонной разметки, но вошедшие в блоки после наложения гибкого описания (Excess Areas) выделяются зеленым цветом. При этом в окне Batch указываются значения Missing Areas, Excess Areas в процентах.

Для того чтобы создать эталонную разметку вручную:

  1. Откройте изображение.
  2. Наложите гибкое описание на изображение.
  3. Перейдите в режим Reference layout.
  4. Создайте на изображении необходимые блоки. Для этого воспользуйтесь кнопками панели Block-Drawing Tools.
  5. Сохраните эталонную разметку (кнопка [image] на панели инструментов).

Эталонную разметку можно создать, на основе результатов наложения гибкого описания, при этом в гибком описании уже должны быть созданы блоки. Для создания разметки:

  1. Откройте изображение.
  2. Наложите гибкое описание на открытое изображение.
  3. Выберите пункт Copy Matched Layout to Reference в меню Image (или в локальном меню).
  4. При необходимости отредактируйте положение найденных блоков.
  5. Сохраните эталонную разметку (кнопка [image] на панели инструментов).

Также можно воспользоваться командой Copy Matched Layout to Reference локального меню пакета, чтобы сохранить в качестве эталонной разметки результат наложения описания для выделенных страниц пакета.

Инструменты создания и редактирования эталона

Команды создания и редактирования блоков находятся в меню Image>Select Tool, также на панели инструментов расположены кнопки, соответствующие данным командам.

Select (кнопка [image] на панели инструментов) позволяет выбрать на изображении существующий блок, передвинуть его границы, переместить блок.

Для того чтобы передвинуть границу блока:
  1. Выберите инструмент Select в меню Image>Select Tool или на панели инструментов.
  2. Установите курсор мыши на границу блока.
  3. Нажмите левую кнопку мыши и потяните в нужную сторону.
  4. Отпустите кнопку мыши.

Замечание. Если вы установили курсор мыши на угол блока, то при движении мыши будут одновременно изменяться вертикальная и горизонтальная границы блока.

Для того чтобы переместить выделенный блок:
  1. Выберите инструмент Select в меню Image>Select Tool или на панели инструментов.
  2. Установите курсор мыши внутри блока. При этом курсор мыши меняет форму, показывая, что операция перемещения блока поля возможна.
  3. Нажмите левую кнопку мыши и потяните в нужную сторону.
  4. Отпустите кнопку мыши.

Совет. Иногда, из-за маленьких размеров блока, переместить его не получается, т.к. при наведении курсора активируется режим изменения размеров из-за того, что границы слишком близко друг к другу. Чтобы переключиться на перемещение принудительно, нужно нажать клавишу Ctrl.

Create Block (кнопка [image] на панели инструментов) позволяет создать на изображении новый блок.

Для того чтобы создать новый блок:
  1. Выберите инструмент Create Block в меню Image>Select Tool или на панели инструментов.
  2. Установите курсор мыши в угол предполагаемого блока. Нажмите левую кнопку мыши и, не отпуская кнопки, потяните в противоположный по диагонали угол блока.
  3. Отпустите кнопку мыши.
  4. В открывшемся диалоге Create Block выберите имя создаваемого блока.
Draw Location (кнопка [image] на панели инструментов) позволяет нарисовать область выделенного блока или элемента.

Для того чтобы создать область:
  1. В меню Training выберите пункт Training Mode для перехода в режим обучения.
  2. В окне FlexiLayout выберите блок или элемент.
  3. Выберите инструмент Draw Location в меню Image>Select Tool или на панели инструментов.
  4. Установите курсор мыши в угол предполагаемого блока. Нажмите левую кнопку мыши и, не отпуская кнопки, потяните в противоположный по диагонали угол блока.
  5. Отпустите кнопку мыши.
Delete Block (кнопка [image] на панели инструментов) позволяет удалить блок с изображения.

Для того чтобы удалить блок:
  1. Выберите инструмент Delete Block в меню Image>Select Tool или на панели инструментов.
  2. Нажмите на блок, который вы хотите удалить.
Add Block Part (кнопка [image] на панели инструментов) позволят добавить прямоугольную часть к выбранному блоку.

Для того чтобы добавить прямоугольную часть блока:
  1. Выберите инструмент Add Block Part в меню Image>Select Tool или на панели инструментов.
  2. Установите курсор мыши внутри блока, к которому вы хотите добавить часть.
  3. Нажмите левую кнопку мыши и, не отпуская кнопки, потяните по диагонали.
  4. Выделив нужную часть блока, отпустите кнопку мыши.

Выделенный прямоугольник будет добавлен к блоку.

Cut Block Part (кнопка [image] на панели инструментов) позволяет удалить прямоугольную часть выделенного блока.

Для того чтобы удалить прямоугольную часть блока:
  1. Выберите инструмент Cut Block Part в меню Image>Select Tool или на панели инструментов.
  2. Установите курсор мыши внутри блока, из которого вы хотите вырезать часть.
  3. Нажмите левую кнопку мыши и, не отпуская кнопки, потяните по диагонали.
  4. Выделив нужную часть блока, отпустите кнопку мыши.

Выделенный прямоугольник будет удален из блока.

Замечание. При удалении внутренней части блока снизу или сверху дополнительно удаляется часть блока справа до границы блока. Такая особенность программы обусловлена необходимостью передавать на распознавание неразрывные по горизонтали текстовые блоки. В отношении боковых сторон блоков такого ограничения нет.

Add Vertical Separator (кнопка [image] на панели инструментов) позволяет добавить вертикальный разделитель к выбранному табличному блоку.

Для того чтобы добавить вертикальный разделитель:
  1. Выберите инструмент Add Vertical Separator в меню Image>Select Tool или на панели инструментов.
  2. Подведите курсор мыши к нужной области блока Table. При этом курсор мыши меняет форму, показывая, что операция перемещения блока поля возможна.
  3. Щелкните мышью по блоку.
Add Horizontal Separator (кнопка [image] на панели инструментов) позволяет добавить горизонтальный разделитель к выбранному табличному блоку.

Для того чтобы добавить горизонтальный разделитель:
  1. Выберите инструмент Add Horizontal Separator в меню Image>Select Tool или на панели инструментов.
  2. Подведите курсор мыши к нужной области блока Table. При этом курсор мыши меняет форму, показывая, что операция перемещения блока поля возможна.
  3. Щелкните мышью по блоку.
Delete Separator (кнопка [image] на панели инструментов) позволяет удалить разделитель из выбранного табличного блока.

Для того чтобы удалить разделитель:
  1. Выберите инструмент Delete Separator в меню Image>Select Tool или на панели инструментов.
  2. Подведите курсор мыши к нужной области блока Table. При этом курсор мыши меняет форму, показывая, что операция перемещения блока поля возможна.
  3. Щелкните мышью по блоку.
Локальное меню разметки столбцов таблицы.

Для того чтобы выполнить эталонную разметку столбцов табличного блока:
  1. Выберите табличный блок на изображении.
  2. С помощью инструментов [image], [image], [image] разделите табличный блок на ячейки.
  3. Щелкните правой кнопкой мышью по столбцу таблицы и в контекстном меню выберите имя столбца.

Для того чтобы удалить столбец из табличного блока, щелкните правой кнопкой мыши по столбцу и в контекстном меню выберите команду Delete Column.


Эталонная сборка страниц в документы

Для изображений пакета можно задать эталонную сборку страниц в документы, которая будет отражать желаемое распределение страниц по документам.

Эталонная сборка документов, как и эталонная разметка, нужна на этапе отладки гибкого описания, она помогает создать по возможности оптимальное описание. Эталонная сборка дает возможность сравнивать результаты сборки страниц в документы при наложении гибкого описания и желаемое распределение страниц по документам.

Эталонную сборку можно просмотреть в режиме Reference layout. Для перехода в этот режим просмотра изображения воспользуйтесь кнопкой [image], расположенной на панели инструментов.

Режим просмотра изображения Difference layout (кнопка [image] на панели инструментов) позволяет увидеть разницу между эталонной сборкой и сборкой, полученной в результате наложения гибкого описания. Начало и конец документов, указанные в эталонной сборке, но не определенные в тех же местах при наложении гибкого описания, выделяются красными уголками. Зелеными уголками помечаются начало и конец документа, определенные в процессе наложения, но не заданные в эталонной сборке.

Для того чтобы создать эталонную сборку страниц в документы:

  1. Выделите в окне Batch страницы, для которых вы хотите определить эталонную сборку.
  2. Нажмите правую кнопку мыши и выберите в локальном меню пункт Assemble to Reference Documents….
  3. В диалоге Assemble to Reference Document задайте способ эталонной сборки: вы можете отнести все выделенные страницы к одному документу (выберите опцию One document) или собрать выделенные страницы в документы используя заданное количество страниц (выберите опцию Group by page count и введите количество страниц в документе).
  4. Отметьте опцию First page of document matches Header, если элемент Header обязательно должен быть наложен на первую страницу документа. Опцию отмечать не следует, если сборка документов будет производиться без использования элемента Header (например, по заданному числу страниц) или если на выделенных страницах Header отсутствует или не может быть наложен.
  5. Отметьте опцию Last page of document matches Footer, если элемент Footer обязательно должен быть наложен на последнюю страницу документа. Опцию отмечать не следует, если сборка документов будет производиться без использования элемента Footer (например, по заданному числу страниц) или если на выделенных страницах Footer отсутствует или не может быть наложен.
  6. Нажмите OK. Эталонная разметка отобразится в режиме Reference layout: начало и конец документа выделяются зелеными уголками.

Вы можете снять отметки First page of document matches Header и Last page of document matches Footer для отдельных страниц, например, если в каком-либо документе отсутствует итоговая часть, сборка все равно будет осуществлена: хотя элемент Footer не будет наложен, коней документа может быть определен по элементу Header следующего за ним документа.

Чтобы изменить значения опций First page of document matches Header и Last page of document matches Footer:

  1. Выделите страницу (или несколько страниц).
  2. Нажмите правую кнопку мыши и выберите в локальном меню пункт Change Reference Header/Footer….
  3. В открывшемся диалоге отметьте или снимите отметки с опций First page of document matches Header и Last page of document matches Footer.

Информация об эталонной сборке отображается также в колонках Reference Document Number и Reference Sequence Number окна Batch. В колонке Reference Document Number отображается номер документа, к которому должна относится страница, а в колонке Reference Sequence Number - номер страницы в документе, а буквы H и F в скобках указывают, должны ли быть наложены на страницу элементы Header и Footer.

В колонках Matched Document Number и Matched Sequence Number указывается аналогичная информация для наложенного гибкого описания. При создании гибкого описания нужно стремиться к тому, чтобы эта информация совпадала с информацией об эталонной сборке.


Исключение элемента

Иногда в процессе отладки гибкого описание требуется исключить из описания тот или иной элемент, не удаляя его. В этом случае элемент можно временно исключить из описания. Тогда в проекте будет сохранена вся информация об элементе (свойства, отношения, дополнительные условия поиска), но при наложении описания этот элемент будет проигнорирован.

Замечание. Если на исключенный элемент есть ссылки других элементов, то эти элементы будут помечены значком как содержащие ошибку. В этом случае, можно либо исключить зависимые элементы (disable), либо удалить в их свойствах ссылку на данный элемент.

Для того чтобы исключить элемент:

  1. Выделите в дереве элементов элемент.
  2. Выберете в меню FlexiLayout команду Disable.

Для того чтобы включить элемент:

  1. Выделите в дереве элементов элемент, который вы хотите сделать доступным.
  2. Выберете в меню FlexiLayout команду Enable.


Тестирование элементов

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

Тестирование позволяет увидеть все гипотезы, найденные для выбранного элемента на данном тестовом изображении. Протестировать можно любой элемент, включая составные элементы. Область поиска тестируемого элемента - вся страница, если не задано дополнительных ограничений в Absolute search area constraints или в Advanced pre-search relations. При тестировании элемента исполняются также и условия Advanced pre-search relations. В результате тестирования элемента в окне Hypotheses показываются все найденные гипотезы (в порядке убывания качества), а в окне Image подсвечиваются области всех найденных гипотез.

Замечание. Для тестирования необходимо, чтобы гибкое описание компилировалось (т.е. не содержало ошибок), и в окне Image было открыто изображение.

Для того чтобы протестировать элемент:

  1. Выберите нужный элемент в дереве FlexiLayout.

  2. В локальном меню нужного элемента команду Test Element или в меню FlexiLayout выберите команду Test Element.

Совет. Для перехода от одной гипотезы к другой в окне Hypotheses можно воспользоваться кнопками → и ← на клавиатуре.

Для выхода из режима тестирования нужно перейти в любой другой (Matched layout, Reference layout, Difference layout), нажав соответствующую кнопку на панели инструментов.


Классификаторы

Классификатор - отдельный проект, предназначенный для предварительной идентификации отдельных страниц и отнесения их к определенному типу по используемому гибкому описанию (в том числе многовариантному) или определенному варианту гибкого описания.

Классификатор полезен в том случае, если проект содержит большое количество гибких описаний, и необходимо ускорить и улучшить качество определения документа, к которому относится страница. Классификатор позволяет быстро определять первые страницы документов по групповому идентифицирующему элементу.

Классификаторы могут использоваться в следующих целях:

  • Для совместной отладки наложения заголовков (Header) всех документов в одном проекте FlexiLayout Studio.
  • Для ускорения выбора определения документа для наложения. Использование классификатора позволяет не перебирать все определения документа для поиска наиболее подходящего, а выбирать нужное определение на основании классификационных признаков. При этом порядок перебора определяется пользователем с помощью выбора классификационных признаков и построения дерева классификатора. Ускорение наиболее заметно для крупных проектов, содержащих большое количество определений документов.
  • Для распределения классифицирующих признаков по дереву классификатора. На верхнем уровне можно отбирать документы, поступившие от определенной компании, по наличию поля с ее наименованием. На следующем уровне классификации отобранные документы можно различать по типам с помощью заголовков или, например, количества разделителей на странице.
  • Для управления наложением гибких описаний сторонней разработки. Возможна ситуация, когда описания, полученные от стороннего разработчика, накладываются неправильно (не на те документы, на которые требуется). В данном случае классификатор можно использовать для управления наложением определений документов, не обращаясь к разработчику описаний.
  • Для ускорения работы проектов, содержащих определения документов на разных языках. При использовании классификатора предраспознавание для классифицируемых документов будет осуществляться не по количеству языков всех определений в проекте, а два раза: при классификации и при наложении выбранного определения документа.

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

Этапы классификации образуют иерархическую структуру. Например, можно объединить документы от какой-либо компании в отдельный класс, а различные типы документов описать как его подклассы. Тогда на первом этапе классификации можно использовать идентифицирующий элемент Static Text с наименованием компании, а на втором шаге классификации определить подклассы Invoice, Letter и т. д.

Набор идентификаторов класса представляет из себя обязательный групповой элемент Id. В его состав могут входить как обязательные, так и необязательные, и недопустимые элементы. Также можно указать минимальное количество найденных подэлементов, при котором групповой элемент считается найденным.

Уникальность этапов классификации

Каждому этапу классификации присваивается степень уникальности. Степень уникальности этапа классификации отображается с помощью специальных символов:

  • Uniquely in project ( [image]) - этап классификации является уникальным в рамках классификатора (глобально). Такие этапы нужно использовать, если для типа документа есть возможность выбрать хороший идентифицирующий элемент. Документы такого типа будут классифицироваться быстро и надежно. Элемент Id такого узла идентифицирует тип документа однозначно, то есть содержит в себе все признаки типа. Если идентифицирующий элемент данного этапа наложен, то остальные этапы рассматривать не нужно.
  • Uniquely on its tree level ( [image]) - этап классификации является уникальным в рамках предыдущего этапа (локально). Такие этапы используются, как правило, для распределения идентифицирующих признаков по родительским и дочерним этапам. Идентифицирующий элемент локально уникального этапа различает типы документа в рамках родительского этапа. Таким образом, в идентифицирующем элементе родительского этапа можно разместить признаки, общие для всех подтипов документов (например, «Название_Компании_1»), а в элементах Id его подэтапов – лишь отличительные признаки подтипов друг от друга (например, ключевые слова «Договор», «Счет-фактура» и т. д., или же характерную для подтипа сетку сепараторов). При этом может существовать соседний узел с идентифицирующим элементом, содержащим "Название_Компании_2", и аналогичными подтипами с ключевыми словами «Договор», «Счет-фактура» и пр.
  • Non-uniquely ( [image]) - этап классификации является не уникальным либо не предназначен для идентификации (а только для группировки подклассов). Подобные этапы используются в основном для логической группировки дочерних этапов. Например, на документах компании A и компании B нет названия компании или какого-либо другого признака, характерного для всех документов этой компании. Однако необходимо сгруппировать описания разных документов, принадлежащих этим компаниям, в отдельные «папочки» для удобства работы с ними. Тогда нужно создать два неуникальных этапа, в рамках которых расположить уникальные этапы классификации, идентифицирующие элементы которых содержат необходимые признаки документов.

Порядок классификации (Decision Tree)

Классификация осуществляется пошагово начиная с корневого элемента. На каждом шаге выбираются признаки, к которым может относиться документ (см. ниже). Далее рассматриваются их дочерние признаки, и т. д. Если на каком-то этапе подходящие дочерние признаки отсутствуют, то текущий признак добавляется к результату классификации.

Выбор признаков для продолжения осуществляется следующим образом:

  1. Накладываются глобально уникальные признаки (в том порядке, в котором они описаны в классификаторе). При успешном наложении идентификатора перебор заканчивается и соответствующий признак является единственно возможным путем продолжения.
  2. Накладываются локально уникальные признаки (в том порядке, в котором они описаны в классификаторе). При наложении идентификатора перебор заканчивается, признак добавляется к возможным путям продолжения.
  3. Если нет наложившихся уникальных признаков, проверяются неуникальные. В качестве путей продолжения добавляются все наложившиеся неуникальные признаки.

Например, рассмотрим следующую структуру классификатора:

Начинаем разбор с корня - элемента ClassificationTree. Первым проверяется наложение идентификатора признака FirstCompany. Если он наложился, то рассматриваются только подклассы этого класса. В противном случае проверяется наложение для классов SecondCompany и UnknownCompany. Наложиться может как один из них, так и оба сразу (поскольку данные классы неуникальны).

Если страница отнесена к классу FirstCompany, то проверяются только его подклассы. Подкласс Invoice проверяется первым, так как он уникален глобально, а Price - локально. Если ни один подкласс не наложился, страница относится к классу FirstCompany. Далее рассмотрим ситуацию, когда идентификатор класса FirstCompany не наложился.

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

  • Если наложился подкласс SecondCompany.Invoice, то перебор останавливается, страница относится к данному подклассу (так как он глобально уникален).
  • Если наложились подклассы разных классов (например, одновременно наложились SecondCompany.Price и UnknownCompany.Price), то они оба добавляются к результатам классификации.
  • Если у какого-нибудь класса не наложился ни один подкласс, то к результатам классификации добавляется он сам.

Подробнее

Свойства классификатора

Создание классификатора

Элементы


Свойства классификатора

При создании классификатора нужно задать его свойства.

Свойства классификатора сгруппированы на двух закладках:

Опция | Описание
Закладка Classifier
Группа Info
Name | Имя классификатора. По умолчанию классификатор создается с именем ClassificationTree.
Version | Версия классификатора. Данный параметр позволяет создавать и впоследствии различать версии (редакции) одного и того классификатора.
Comment Комментарий пользователя (необязательно для заполнения). Данное поле может содержать любую текстовую информацию о классификаторе.
Замечание. При дальнейшей работе в ABBYY FlexiCapture свойство Comment классификатора доступно для просмотра при работе с типами пакетов. При создании типа пакета с использованием файла классификатора *.cfl (экспортированного из программы FlexiLayout Studio) комментарий к классификатору отображается в свойствах типа пакета (в режиме "только для чтения"). Таким образом, может быть указана информация об авторе классификатора.
Группа Pre-recognition parameters
Name | Способ печати бланка формы: типографский (Typographic), матричный принтер (Matrix printer), пишущая машинка (Typewriter). Для выбора значения данного параметра необходимо оценить тип и качество печати.
Mode Режим распознавания: быстрый (Fast), полный (Thorough). В быстром режиме цветные и полутоновые изображения перед распознаванием бинаризуются (переводятся черно-белые). Распознавание в быстром режиме занимает меньше времени (что ускоряет обработку форм), при этом для большинства форм распознавание в быстром режиме дает удовлетворительные результаты. Полный режим рекомендуется применять в следующих случаях:

  • если используются формы низкого качества и распознавание в быстром режиме приводит к большому количеству ошибок;
  • если необходимо осуществлять распознание с учетом цвета.
Text languages | Языки, на которых написан текст документа формы. Из выпадающего списка необходимо выбрать один или несколько языков, на котором написан текст формы. Полный перечень языков см. в разделе Список OCR языков, поддерживаемых программой ABBYY FlexiLayout™ Studio
Pre-recognition area | Область предраспознавания. Нажмите кнопку ..., чтобы указать величину отступов краев прямоугольника от краев страницы.
Группа Classification mode
Выберите из списка режим классификации: Auto, Auto Decision Tree или Decision Tree.
Закладка Auto-Classifier
Группа Classification Tree Initialization
Use Profile: Titles, Titles with Image Objects or Image Objects Выберите профиль, используемый для инициализации дерева классификации.
Подробнее см. Автоматическое создание классов.
Replace Classes | Отметьте эту опцию, если вы хотите заменять существующие классы на новые в процессе инициализации.
Replace Features Отметьте эту опцию, если вы хотите заменять существующие признаки на новые в процессе инициализации.
Замечание. Созданные признаки имеют состояние "disabled".
Training group
User Profile: Выберите режим обучения классификатора: Raster (fast), Raster, Raster with Text, Raster with Titles, Raster with Titles and Image Objects или Raster with Image Objects
Подробнее см. Автоматическая классификация.
Группа Last training info
Содержит информацию о наличии в проекте обученного эталона.

Для просмотра или редактирования свойств классификатора, выберите команду Properties… в меню FlexiLayout / Classifier или в локальном меню корневого элемента классификатора.

Подробнее

Предраспознавание


Создание классификатора

Создать классификатор можно двумя способами:

  • Постороение дерева решений Decision Tree - иерархической структуры признаков с набором идентификаторов для каждого признака. Этот способ выбора описания является очень точным, но при большом числе типов документов требует больших затрат времени.
  • Обучение автоклассификатора на пакете изображений. Этот способ требует минимального участия пользователя.

Создание проекта классификатора

Для создания нового проекта классификатора выполните следующие действия:

  1. Выберите меню File > New Project... Откроется диалоговое окно Create New Project…
  2. Введите имя проекта и выберите папку для хранения проекта.
  3. В поле Type выберите ABBYY Classifier Project Files (*.fcp).

Для редактирования свойств классификатора выберите пункт Properties… в меню FlexiLayout / Classifier или в локальном меню корневого элемента классификатора. На закладке Classifier диалогового окна свойств классификатора выберите режим классификации: автоматический (Auto), автоматический с использованием дерева решений (Auto Decision Tree) или дерево решений (Decision Tree).

Окно Classifier содержит список классов, которые могут быть наложены на страницы в результате классификации, и список признаков с набором идентификаторов, которые образуют дерево решений.

Добавление класса

Для добавления класса выполните следующие действия:

  1. Перейдите в окно Classifier.
  2. В локальном меню группы Classes выберите пункт Add Class.
  3. В открывшемся диалоге введите имя класса и выберите настройки автоклассификации:
    • Double-check this classification result by Decision Tree - отметьте эту опцию, если вы хотите проверять результаты автоклассификации с помощью дерева решений (Decision Tree).

      Замечание. Опция доступна, только если в свойствах классификатора выбран режим классификации Auto Decision Tree.

    • Add extra Classes to this classification result - при выборе этой опции результаты классификации для неуверенно классифицированных страниц будут содержать дополнительные классы. Чтобы добавить дополнительные классы к результату классификации, нажмите кнопку Edit и в открывшемся диалоговом окне выберите нужные классы из списка доступных классов.

Для редактирования свойств класса выберите пункт Properties… в локальном меню класса.

Вы также можете создавать классы автоматически. Подробнее см. Автоматическое создание классов.

Добавление признака

Для добавления признака выполните следующие действия:

  1. Перейдите в окно Classifier.
  2. Спуститесь по дереву классификатора до уровня вложенности, на котором вы хотите создать класс (для первого уровня выберите ClassificationTree).
  3. В контекстном меню выберите пункт Add Feature.
  4. В открывшемся диалоге задайте имя и свойства признака
    • В разделе ID element identifies document type выберите степень уникальности узла.
      • Uniquely in project- признак уникален в рамках классификатора;
      • Uniquely on its tree level - признак уникален в рамках родительского признака;
      • Non-uniquely - неуникальный или неидентифицирующий признак.
    • В поле Use this Class for identified document type укажите наименование класса, который надо накладывать на страницу (ссылка). Данный класс будет наложен, если документ будет отнесен к данному узлу классификации.

Добавление идентификаторов

При создании класса приложение автоматически создает пустой групповой элемент Id, предназначенный для указания идентификаторов класса. Добавление, удаление и изменение идентифицирующих элементов осуществляется обычным образом. В состав идентификатора может входить любое количество произвольных элементов, за исключением элемента Table. Также в качестве идентификатора может быть импортирован заголовок (Header) ранее созданного проекта FlexiLayout Studio. Для импорта выберите пункт Import ID… контекстного меню узла классификатора и укажите проект, заголовок которого требуется импортировать. Если проект содержит несколько вариантов описания, вам будет предложено выбрать вариант описания из списка.

Подробнее

Отладка классификатора

Автоклассификация

Элементы


Отладка классификатора

Отладка классификатора осуществляется аналогично отладке гибкого описания с незначительными изменениями.

Компиляция классификатора

Для компиляции классификатора выберите в контекстном меню корневого элемента (по умолчанию ClassificationTree пункт Build Classifier.

Эталонный результат классификации

Для каждого изображения пакета можно указать эталонный результат классификации. В дальнейшем можно сравнивать полученный результат с эталонным и при необходимости вносить изменения в классификатор. Эталонный результат классификации можно выбрать одним из следующих способов:

  • скопировать из столбца Classification Result, выбрав пункт Copy Matched Layout to Reference контекстного меню пакета;
  • указать в поле Reference FlexiLayout диалогового окна Свойства страницы (пункт Properties… контекстного меню пакета).

Просмотр протокола классификации

Протокол классификации отображается в окне Classifier log. Для каждой страницы пакета в протоколе отображается следующая информация:

  • Результат наложения классификатора;
  • Список накладываемых классов и результат наложения.

Дополнительно

Отладка гибкого описания


Автоклассификатор

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

В результате обучения классификатора создается эталон обучения. Проверить наличие эталона обучения в проекте можно на закладке Auto-Classifier свойств классификатора, в разделе Last training info.

Информация о процессе классификации выводится в окне Classifier Log, расположенном в правом нижнем углу окна программы. Для сохранения лога классификации в виде текстового файла выберите пункт Export Log в локальном меню окна Classifier Log.

Для настройки автоклассификатора выполните следующие действия:

  1. Создайте классы, соответствующие типам документов, которые предполагается вводить в ABBYY FlexiCapture в одном потоке. Подробно об автоматическом создании классов см. Автоматическое создание классов.
  2. В окне Batch укажите эталонные классы (Reference Class) для всех страниц пакета.
  3. В окне Batch поставьте галочку в столбце Used For Training для нескольких страниц каждого класса, чтобы использовать эти страницы при обучении.
  4. На закладке Auto-Classifier свойств классификатора выберите требуемый режим обучения. Все режимы, за исключением Raster (fast), учитывают размер страницы, соотношение ширины и высоты страницы, а также объекты, которыми может быть заполнена страница: текст, метки и разделители. Вы можете выбрать один из следующих профилей:
    • Raster (fast) - в этом режиме осуществляется сравнение изображений по точкам
    • Raster - этот режим подходит для почти жестких форм
    • Raster with Text - этот режим учитывает слова и словосочетания, наиболее характерные для данного класса; вероятность принадлежности к определенному классу определяется, исходя из наличия в тексте этих признаков
    • Raster with Titles - этот режим учитывает встречающиеся в документах заголовки и объединяет документы в классы по совпадению значений распознанных заголовков; расположение данных на странице не учитывается
    • Raster with Titles and Image Objects - этот режим учитывает распознанные заголовки, а также наличие и расположение на документах объектов различных типов (разделители, штрих-коды и т.д.)
    • Raster with Image Objects - этот режим учитывает наличие и расположение на документах объектов различных типов (разделители, штрих-коды и т.д.)
  5. В локальном меню пакета выберите команду Train Auto-Classifier on Training Set, чтобы начать обучение автоклассификатора на наборе выбранных страниц.
  6. В локальном меню пакета выберите пункт Classify для классификации всех страниц пакета с помощью обученного автоклассификатора.
  7. Проверьте результаты классификации. В столбце Classification Fidelity окна Batch показано, совпадает ли наложенный класс, указанный в столбце Classification Result, с эталонным классом, указанным в столбце Reference Class.
  8. При необходимости скорректируйте эталон обучения и укажите дополнительные настройки автоклассификации. Подробнее см. Как улучшить результаты обучения.
  9. При необходимости заполните дерево решений Decision Tree.


Автоматическое создание классов

ABBYY FlexiLayout Studio 10 позволяет инициализировать дерево классов (Classification Tree) на основе пакета изображений, автоматически создавать классы при загрузке изображений из папок, а также создавать классы на основе имен папок.

Инициализация дерева классов

Программа формирует дерево классов на основе информации о распознанных заголовков и наличии на страницах объектов изображения различных типов. Для инициализации дерева классов на закладке Auto-Classifier свойств классификатора выберите требуемый профиль: Titles (использует информацию о заголовках и частоте их присутствия на странице), Titles with Image Objects (использует информацию о заголовках, а также о наличии на страницах объектов изображения различных типов, что может использоваться для выделения дочерних признаков) или Image Objects (использует информацию о наличии на страницах объектов изображения различных типов: разделители, штрих-коды и т.д.).

При выборе опций Replace Classes и Replace Features имеющиеся классы и признаки будут заменены в процессе инициализации. Нажмите Run, чтобы начать процесс инициализации.

При инициализации дерева классов программа создает классы и соответствующие им признаки с незаполненными Id-элементами. В процессе инициализации создается эталон автоклассификатора, при помощи которого классифицируются все страницы пакета. Страницы, соответствующие созданным классам, автоматически получают ссылку на свой класс в качестве эталонного значения (Reference Class).

Создание классов при загрузке изображений из папок

При добавлении в пакет изображений из папок (и подпапок) классы могут быть созданы на основе FLS-проектов гибких описаний, если такие проекты присутствуют в указанных папках. Для добавления изображений из папки выберите в меню File пункт Add Images from Folder… и в открывшемся диалоге отметьте опцию Create Classes based on FlexiLayout projects. Созданные классы будут присвоены в качестве эталонных классов страницам, загруженным из пакетов соответствующих проектов.

Создание классов на основе имен исходных папок

Если изображения были добавлены из папок, то можно создать классы на основе имен папок, из которых были добавлены изображения. Чтобы создать классы для выделенных страниц, выберите команду Create Class by Source Folder в локальном меню пакета.


Как улучшить результаты обучения

Для улучшения результатов обучения автоклассификатора можно использовать следующие методы:

  • корректировка эталона обучения на основе сообщений из лога классификации;
  • настройка параметров автоклассификации для класса на основе статистики классификации.

Корректировка эталона обучения

При обучении эталона информация о процессе обучения выводится в окне Classifier Log, расположенном в правом нижнем углу окна программы. Эту информацию можно использовать для корректировки эталона. При корректировке страницы, на которые ссылаются сообщения в логе классификации, автоматически исключаются из обучения.

Лог классификации в окне Classifier Log может содержать следующие сообщения:

  • Если в обучающем наборе недостаточно страниц определенного класса, в лог выводится соответствующее сообщение. В этом случае необходимо увеличить количество страниц данного класса до трех или более.
  • Если страницы, принадлежащие к одному эталонному классу (Reference Class), не могут быть объединены в один класс, в лог выводится соответствующее сообщение. Это значит, что программа не может найти общие элементы на страницах. Вы можете либо заменить страницы этого класса в обучающем наборе, либо создать вместо данного класса два визуально различимых класса.
  • Если в сообщении об ошибке сказано, что некоторые страницы классифицированы неуверенно (Fuzzy classified), попробуйте заменить страницы этого класса в обучающем наборе и запустить обучение автоклассификатора еще раз.

Улучшить результаты классификации можно также с помощью настроек автоклассификации на основе статистики.

После классификации пакета для каждого класса создается статистика. Краткая статистика отображается в окне Properties при выделении класса. Чтобы просмотреть подробную статистику, откройте диалог Classification Statistics. Для этого выберите команду Show Statistics в локальном меню класса.

Если класс определяется ненадежно (класс регулярно присваивается страницам других типов), результаты классификации можно дополнительно проверять наложением дерева решений. Для этого в свойствах того класса, который ошибочно присваивается страницам других типов, выберите опцию Double-check this classification result by Decision Tree (опция доступна, только если в свойствах классификатора выбран режим классификации Auto Decision Tree). В дереве решений заполните Id-элементы узлов, предназначенных для разделения путающихся классов. Результаты наложения дерева решений добавятся к результату автоматической классификации.

Если результат классификации стабильно путается с одним или двумя другими классами или заполнение дерева решений представляется трудоемким, можно добавить эти классы в результат классификации. Для этого в свойствах класса выберите опцию Add extra Classes to this classification result. Таким образом на страницах, где класс накладывается неуверенно, будет получен множественный результат классификации.

Добавление дополнительных классов к результату классификации позволяет значительно уменьшить число вариантов классификации и в то же время избежать возможных ошибок при определении типа документа. Этот метод может применяться для визуально похожих типов документов, между которыми трудно найти отличия в автоматическом режиме.


Экспорт гибкого описания

Гибкое описание можно экспортировать в приложения обработки форм в формате *.afl. Экспортируемое гибкое описание надежно кодируется для предотвращения несанкционированного использования.

Для того чтобы экспортировать гибкое описание FlexiLayout:

  1. Выберите команду Export… (меню File>Export…).
  2. В открывшемся диалоге Export FlexiLayout укажите название файла и папку, куда он будет сохранен.

Полученное таким образом описание гибкого описания можно подключать к определениям документов в программе ABBYY FlexiCapture и другом приложении.


Экспорт классификатора

Классификатор можно экспортировать в приложения обработки форм в формате *.cfl. Экспортируемый классификатор надежно кодируется для предотвращения несанкционированного использования.

Для того чтобы экспортировать классификатора:

  1. Выберите команду Export… (меню File>Export…).
  2. В открывшемся диалоге Export Classifier укажите название файла и папку, куда он будет сохранен.

Полученный таким образом классификатор можно подключать к типу пакета в программе ABBYY FlexiCapture.


Обработка гибких форм в FlexiCapture и способы их идентификации

В одном пакете FlexiCapture можно обрабатывать неограниченное количество шаблонов, причем любое количество из них может быть гибкими (гибкий шаблон - шаблон, созданный на основе гибкого описания FlexiLayout). Если в пакете есть несколько гибких шаблонов, то желательно, чтобы все гибкие описания, использованные для создания шаблонов одного пакета, имели одинаковый набор параметров предраспознавания (язык, тип текста, режим). В этом случае предраспознавание будет выполняться только один раз, и затем его результаты будут использоваться также и для других шаблонов. Это позволит сократить время обработки, поскольку время предраспознавания обычно занимает порядка 90% времени наложения гибкого шаблона.

Предраспознавание в FlexiCapture осуществляется на каждой странице столько раз, сколько разных наборов параметров предраспознавания задано во всем массиве гибких шаблонов пакета. Если все шаблоны требуют предраспознавания только на одном языке, то при наложении нескольких шаблонов предраспознавание страницы осуществляется один раз, а получившиеся объекты изображения будут сохранены и использованы для остальных шаблонов, чтобы исключить затраты времени на распознавание одного и того же изображения. Если в каком-то шаблоне задан другой язык (или тип текста, или режим), то результаты предраспознавания будут другие, и, следовательно, при наложении шаблонов будут создаваться уже два варианта результатов предраспознавания, таким образом, время предраспознавания возрастет вдвое. Поэтому, если есть такая возможность, сокращение числа наборов параметров предраспознавания позволит ускорить процесс наложения шаблонов, и, следовательно, сократить общее время обработки форм.

В отдельных случаях для ускорения наложения шаблонов можно обойтись вообще без распознавания. Это возможно, если в качестве элементов шаблона используются только элементы Separator, Barcode, White Gap, Region и Object Collection. При этом для всех элементов White Gap и Object Collection должно выполняться одно из следующих требований:

  • В условиях поиска элемента не используется текст.
  • Свойство элемента UseRawText имеет значение True.

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

Классификаторы

Для автоматического выбора приложением гибкого описания или его варианта используются классификаторы. Классификатор - проект специального типа, который создается в приложении FlexiLayout Studio и импортируется в приложение FlexiCapture. В данном проекте описывается древовидная структура классов, к которым может относиться документ. Класс содержит набор элементов, идентифицирующий документы определенного типа. По результатам классификации страницы в ее свойства записываются наименования гибких описаний, которыми она должна обрабатываться (или вариантов описания) либо информационная строка. Дополнительная информация о проектах-классификаторах приведена в разделе Проект классификатора (Classificator).

Выбор описания без использования классификатора

Если не используется классификатор, то для повышения надежности выбора нужного гибкого шаблона в FlexiCapture, а также для ускорения самой процедуры этого выбора, на этапе создания гибкого описания во FlexiLayout создают элементы, выполняющие функции идентификаторов. В качестве идентификатора может выступать практически любой тип элемента. Но он должен надежно находиться на всех формах данного типа. На практике в качестве идентификаторов чаще всего используют элементы типа Static Text, Barcode и Character String. Иногда тип формы идентифицируется не одним, а несколькими элементами.

Чем выше в дереве проекта находится элемент, выполняющий функции идентификатора, тем быстрее будет проходить процедура выбора гибкого шаблона.

Одним из способов задания элемента-идентификатора является отмена выбора Optional element в диалоге свойств данного элемента, т.е. для наложения шаблона объект, соответствующий данному элементу, должен обязательно присутствовать на изображении формы. Если объект, соответствующий обязательному элементу, не будет найден, шаблон не будет наложен.

Кроме того, для идентификации формы в разделе Advanced pre-search relations некоторого обязательного элемента можно записать код с применением функции DontFind(). Таким образом, проанализировав свойства некоторого набора элементов, находящихся выше данного в дереве проекта, можно сказать программе, что текущий обязательный элемент искать не надо.

Другим способом идентификации гибких шаблонов является использование свойства Quality гипотезы элемента. Безусловная установка свойства Quality в 0 в разделе Advanced post-search relations (соответствующая строка кода выглядит как Quality: 0;) любого элемента, приведет к тому, что шаблон не будет наложен. На практике же обычно устанавливают Quality в 0, анализируя свойства некоторого набора элементов, находящихся выше данного в дереве проекта.


Язык описания FlexiLayout

Дополнительные условия (закладка Advanced в свойствах элемента) позволяют задавать и свойства элементов, и условия поиска, а также, дополнительные ограничения на сформированную гипотезу.

Дополнительные условия записываются в виде программного кода. Команды записываются на специальном языке, разработанном для описаний гибких форм.


Лексические конвенции

Идентификаторы

Идентификатор - это последовательность символов, обозначающая один из следующих объектов:

  • имя блока
  • имя элемента
  • имя константы
  • имя переменной
  • ключевое слово

Регистр букв идентификатора не играет роли.

Синтаксис идентификатора

identifier :

nondigit
identifier nondigit
identifier digit

nondigit : один из

_ a b c d e f g h i j k l m n o p q r s t u v w x y z
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

digit : один из

0 1 2 3 4 5 6 7 8 9

Пунктуаторы

В языке используются следующие пунктуаторы:

. , ( ) * / + - = < > { } : ; ! & |

Пунктуаторы ( ) и { } должны употребляться только парно.

Предшествование и ассоциативность операторов

Операторы приводятся в таблице в порядке убывания уровня предшествования.

Оператор | Значение | Ассоциативность
( ) | Вызов функции |
: | Вызов функции |
. | Выбор члена | Слева направо
+ – | Унарный положительный Унарный отрицательный |
* / | Умножение Деление | Слева направо
+ – | Сложение Вычитание | Слева направо
NOT | Логическое НЕТ (унарное) |
 | Операции сравнения (имеют одинаковый приоритет) |
< | Меньше чем | Слева направо
> | Больше чем | Слева направо
<= | Меньше или равно | Слева направо
>= | Больше или равно | Слева направо
== | Равно | Слева направо
!= | Не равно | Слева направо
AND | Логическое И | Слева направо
OR | Логическое ИЛИ | Слева направо

Оператор присваивания

Переменным языка гибких описаний можно присваивать значения при помощи оператора присваивания =.

Пример:

Distance a;

a = Page( 1 ).RectGlobal.Width;

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

Константы

В языке гибких описаний используются только глобальные константы, которые задаются в диалоге свойств гибкого описания (см. Глобальные константы) и доступны во всех разделах описания всех блоков и элементов.

Комментарии

Текст программы может содержать комментарии. Синтаксическое оформление комментариев в коде гибких описаний принято такое же, как в языке C, а именно:

  • Символы /* , предшествующие любой последовательности символов (в том числе - красным строкам), заканчивающейся символами */ .
  • Двойная косая черта // , предшествующая любой последовательности символов. Текст с красной строки, если за ней немедленно не следует обратная косая черта \, исключается из комментария.


Зарезервированные ключевые слова

Следующие ключевые слова зарезервированы для внутреннего применения и не могут быть использованы для именования блоков, элементов, констант и переменных.

AllInstances

and

AndElement

array

AttributeDefinitions

begin

bool

boolean

break

case

char

chose_if

class

const

continue

CurrentInstance

default

delete

div

do

double

Elements

else

end

EndOfAndElement

EndOfElement

EndOfOrElement

enum

error

explicit

extern

ExternalType

false

finally

FinalRelations

FlexibleTemplateHeader

float

for

Function

goto

if

Import

IndependentRelations

InitScript

inline

Instance

int

is

LastFound

let

like

long

mod

namespace

new

not

nothing

null

of

on

operator

or

OrElement

ParamDefinitions

Params

private

PrivateRelations

protected

public

RecognitionParams

RegionalDecimalPoint

register

Relations

return

set

short

sizeof

static

string

struct

switch

template

then

this

to

true

typedef

typeid

typename

unsigned

using

Variants

void

while

with

xor


Операции вызова функций

В языке гибких описаний используется два равноправных способа задания параметров функций и методов:

  • при помощи оператора () (круглые скобки)
  • при помощи оператора : (двоеточие)

Список параметров разделяется оператором , (запятая).

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

Оператор | Пример использования
() | Mode( Horizontal ); MaxErrors( 2, 0.25 );
: | Mode: Horizontal; MaxErrors: 2, 0.25;
 | DonFind(); DontFind;


Управляющие операторы

Разделитель операторов

Операторы языка гибких описаний разделяются точкой с запятой ;

Составные операторы

Одно или несколько подряд идущих операторов могут быть заключены фигурные скобки, образуя составной оператор. Составные операторы также называются блоками (не путать с блоками гибкого описания).

Условные операторы

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

Оператор if выполняет операцию условного перехода. Тело оператора условного перехода выполняется, если выражение имеет истинное значение. Существует два варианта синтаксиса условных выражений.

Синтаксис

оператор выбора :

if ( expression ) then statement
if ( expression ) then statement else statement

В обоих вариантах синтаксиса происходит вычисление выражений.

В первом варианта если значение expression истинно, выполняется оператор statement. Если значение expression ложно, оператор statement игнорируется. Во втором варианте с использованием else второй оператор statement выполняется, если значение expression ложно.

Операторы цикла

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

Оператор for является оператором цикла. Тело оператора цикла выполняется до тех пор, пока выражение имеет истинное значение.

Синтаксис

оператор цикла :

for <var-name> from <from-expr> to <to-expr> [step <step-expr>]
<statement>

Имя переменной-счётчика <var-name> является обязательным, при этом оно не должно совпадать с объявленными выше переменными. Областью видимости счетчика является тело цикла. Внутри цикла не разрешается менять значение счётчика или заводить переменную с таким же именем.

Начальное from-expr и конечное to-expr значения счётчика оцениваются перед выполнением первой итерации цикла, в дальнейшем они рассматриваются как целочисленные константы для предотвращения бесконечных циклов.

Аргумент step (шаг счетчика) является необязательным. Если значение step не указано, шаг счетчика приравнивается к единице. Значение шага счетчика оценивается один раз в начале цикла, так же, как и его начальное и конечное значения. В зависимости от знака шага выбирается условие выполнения итерации цикла: для положительных значений шага должно выполняться условие <var-name> ≤ <to-expr>, для отрицательных – <var-name> ≥ <to-expr>. Нулевое значение в качестве значения шага счетчика не допускается, использование нулевого значения вызовет ошибку.

Тело цикла <statement> может представлять собой один оператор или блок (составной оператор) внутри фигурных скобок.

Также внутри тела цикла можно использовать следующие операторы:

  • break - осуществляет выход из цикла;
  • continue – осуществляет немедленный переход к следующей итерации цикла.


Имена элементов, констант и переменных

Имена, используемые в языке для обращения к элементам, константам или переменным, доступны лишь в определенной области видимости. Область видимости переменной также ограничивает ее время жизни.

Имя переменной, объявленной в секции Region expression, Advanced pre-search relations или Advanced post-search relations, доступно лишь в данной секции данного объекта после собственно объявления переменной.

В любой секции можно использовать блоки, локально ограничивающие область видимости имен переменных. Переменная, объявленная внутри блока, доступна лишь внутри блока после обявления. Например:
{
Int a; a = 5;
}

Доступ к гипотезам элементов осуществляется через имена элементов. В любом разделе описания элемента (Advanced pre-search relations и Advanced post-search relations) доступны гипотезы всех элементов, находящихся в дереве элементов выше данного на этой же ветке дерева гипотез. Кроме того, в разделе Advanced post-search relations элемента можно обращаться к сформированной гипотезе самого этого элемента. В разделе Region expression описания блока доступны гипотезы всех элементов, находящиеся на лучшей ветке дерева гипотез.

Программный код раздела Advanced pre-search relations выполняется для каждой гипотезы данного элемента независимо от других гипотез данного элемента, находящихся на других ветках дерева гипотез. Таким образом, при выполнении программного кода некоторого раздела описания элемента доступна ровно одна гипотеза любого элемента, находящегося выше, а именно та, которая находится на той же ветке дерева гипотез.

Обращение к гипотезе элемента, а также всем ее свойствам, происходит в режиме read-only.

Обращение к гипотезам вышестоящих элементов происходит по полному имени элемента, например: SearchObjects.Group1.Group2.FirstItem. Кроме того, при обращении к одному подэлементу группы из другого допускается укороченное обращение, не содержащее имени группы.

Например, в Advanced-разделах элемента SearchObjects.Group1.Group2.SecondItem можно обратиться к элементу SearchObjects.Group1.Group2.FirstItem любым из перечисленных способов: SearchObjects.Group1.Group2.FirstItem, Group1.Group2.FirstItem, Group2.FirstItem, FirstItem.

Если, согласно описанным правилам, некоторое имя может идентифицировать два различных элемента из доступной области видимости, то оно идентифицирует ближайший по уровню вложенности элемент, который находится выше в дереве элементов.

Пусть, например, дерево элементов имеет следующий вид:

SearchElements

FirstItem

Group1

FirstItem
SecondItem

Тогда обращение из описания элемента SearchElements.Group1.SecondItem к имени FirstItem будет идентифицировать элемент SearchElements.Group1.FirstItem, а не SearchElements.FirstItem.


Определяемые пользователем свойства элемента

Определяемым пользователем свойством называется типизированная переменная, принадлежащая элементу. Данные свойства указываются в разделе External fields закладки Advanced в следующем формате:

Type1 Name1;
...
TypeN NameN;

где Name - имя переменной, Type - ее тип.

При создании свойства инициализируются: числовые - нулевыми значениями, прямоугольники и регионы - пустыми и. т. п.

Данные свойства могут использоваться в элементе, которому они принадлежат, и в элементах, расположенных ниже него. Изменять значение свойства можно только в элементе-владельце, в других элементах оно доступно только для чтения.

Можно вычислить и записать в такое свойство значение сложного выражения, характеризующего гипотезу элемента. Из последующих элементов описания можно обращаться к данному значению, не вычисляя его каждый раз. Таким образом, сокращается время наложения описания. Также не требуется копировать большое выражение в каждый нужный элемент, что улучшает структуру и облегчает разработку кода.

Для обращения к свойству элемента используется полное свойства в формате ElementName.FieldName (например, SearchElements.StaticText1.x). Внутри элемента допускается обращение по имени поля: x. Если элемент является составным, то подэлементы (любого уровня вложенности) также могут обращаться к его свойствам по короткому имени.

Внутри элемента наименования свойств должны быть уникальными. Не допускается совпадение названий определяемых пользователем свойств составного элемента и свойств его подэлементов (любого уровня вложенности). Также названия свойств составного элемента не должны совпадать с названиями его подэлементов.

Пример

В данном примере осуществляется поиск двух составляющих адреса: города (Character String City) и станции метро (Character String Station). Станция метро указывается только в случае, если город - Moscow. Для ускорения наложения определим у элемента City свойство fromMoscow. Это свойство принимает значение True, если элемент City найден и имеет значение Moscow, и False в остальных случаях.

Код для элемента City

User-defined properties
logic fromMoscow;

Advanced post-search relations
if( not IsNull and Value.Find( "Moscow" ) >= 0 ) then fromMoscow = true;
else fromMoscow = false;

В дальнейшем используем данное свойство при поиске станции метро. Чтобы сократить время наложения, будем искать станцию только в случае, если найден город Moscow.

Код для элемента Station

Advanced pre-search relations
if not City.fromMoscow then dontfind;

Замечание. Из-за наличия определяемых пользователем свойств элементы одного типа не рассматриваются как идентичные. Таким образом, запрещается конструкция следующего вида:

Let e = SearchElements.StaticText1;
e = SearchElements.StaticText2; // элемент того же типа


Переменные

В любом разделе, предназначенном для ввода программного кода, можно создавать и использовать переменные. Имя переменной не может совпадать с именем глобальной константы или элемента.

В языке гибких описаний существует два способа создания переменных.

  1. Объявление переменной с указанием типа и имени.

    В языке принят следующий синтаксис объявления переменной:

    [имя типа] [имя переменной];

    Например:
    Int a;
    String s;
    Logic isElementLongEnough;

    Для обращения к значению переменной предварительно необходимо ее инициализировать при помощи оператора присваивания. Обращение к неинициализированной переменной приводит к ошибке при компиляции или выполнении программного кода.

  2. Объявление переменной с одновременной инициализацией.

    В языке можно создать переменную, объявляя и инициализируя ее некоторым выражением: именем элемента, его свойства, другой переменной. Это делается следующим образом:

    Let [имя переменной] = [имя, на которое ссылается переменная]

    Например:
    Int a;a=3; Let a1 = a + 5;
    Let myElement = SearchObjects.Group1.Group2.FirstItem
    Let myRect = SearchObjects.Group1.Group2.FirstItem.Rect

    Сразу после объявления ссылки система создает переменную с указанным именем. Тип переменной неявно определяется типом того выражения, на которое она ссылается при объявлении. Одновременно происходит инициализация переменной значением указанного выражения.

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


Cистема координат и единицы измерения

Для описания положения объектов на странице и расстояний между ними используется двумерная система координат с горизонтальной и вертикальной осями. Точка отсчета (0, 0) координатных осей расположена в левом верхнем углу изображения. Положительное направление оси абсцисс - слева направо, оси ординат - сверху вниз.

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

Единицы измерения координат и расстояний:

Единица измерения | Описание
dot (также dt) | 1/300 доля дюйма
inch (также in) | дюйм
pt | paper point, 1/72 доля дюйма
mm | миллиметр
cm | сантиметр

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

Формат записи | Пример
Числовое значение и следующая за ним единица измерения без пробела между ними | 5cm 200dot 4in
Числовое значение, оператор умножения *, единица измерения. Между любыми частями записи допустимы пробелы. | 5*mm 17 *dt 3 * inch


Предопределенные типы

Тип | Описание
Void | Тип Void используется для объявления функций, не возвращающих никакое значение.
Logic | Булевый тип. Переменная этого типа может иметь значения true и false. Все условные выражение возвращают значение типа Logic.
Операторы |
Not | Логическое отрицание, унарный оператор.
And | Логическое И, бинарный оператор.
Or | Логическое ИЛИ, бинарный оператор.
String | Тип String служит для представления последовательности символов Unicode переменной длины.
Методы |
Int Length() | Возвращает число символов в строке. Только чтение.
Int Find(String subStr, Int startPos = 0) | Возвращает позицию, с которой начинается подстрока subStr в данной строке. Начинает поиск с позиции startPos. Может использоваться без аргумента startPos, в таком случае он принимает значение по умолчанию, равное 0. Если данная строка не содержит подстроки startPos, возвращает -1.
String Mid ( Int start, Int count ) | Возвращает подстроку данной строки длиной count символов, начинающуюся с символа номер start.
String Mid ( String subStr, Int startPos = 0 ) | Возвращает позицию , с которой начинается подстрока subStr в данной строке. Может использоваться без аргумента startPos, в таком случае он принимает значение по умолчанию, равное 0. Если данная строка не содержит подстроки startPos, возвращает -1.
Int Compare( String str ) | Сравнивает данную строку с заданной в аргументе. Если строки равны, то возвращается 0. Если данная строка идет по алфавиту перед str, то возвращается –1, а если после str, то возвращается 1.
Int CompareNoCase( String str ) | Сравнивает данную строку с заданной в аргументе без учета регистра символов. Если строки равны, то возвращается 0. Если данная строка идет по алфавиту перед str, то возвращается –1, а если после str, то возвращается 1.
Операторы |
== | Бинарный оператор проверки равенства двух строк. Результат имеет тип Logic. Возвращает true, если строки равны, иначе false. Различает регистр.
!= | Бинарный оператор проверки неравенства двух строк. Результат имеет тип Logic. Возвращает true, если строки равны, иначе false. Различает регистр.
+ | Оператор конкатенации двух строк. Результат имеет тип String.
Int | Целочисленный тип. Соответствует 32-разрядному целому числу со знаком.
Методы |
Int abs( Int ) | Возвращает абсолютное значение числа.
Операторы |
- | Унарный оператор смены знака.
+ | Бинарный оператор сложения двух целых чисел.
- | Бинарный оператор вычитания двух целых чисел.
* | Бинарный оператор умножения двух целых чисел.
/ | Бинарный оператор деления на целое число.
<, <=, >, >=, ==, != | Бинарные операторы сравнения двух целых чисел: меньше, меньше или равно, больше, больше или равно, равно, не равно. Результат имеет тип Logic.
Distance | Целочисленный (в единицах dot) тип, используемый для представления расстояния.
Методы |
Distance abs( Distance ) | Возвращает абсолютное значение расстояния.
Операторы |
- | Унарный оператор смены знака.
+ | Бинарный оператор сложения двух величин типа Distance.
- | Бинарный оператор вычитания двух величин типа Distance.
* | Бинарный оператор умножения величины типа Distance на целое число. Результат имеет тип Distance.
* | Бинарный оператор умножения двух величин типа Distance. Результат имеет тип Area.
/ | Бинарный оператор деления величины типа Distance на целое число. Результат имеет тип Distance.
<, <=, >, >=, ==, != | Бинарные операторы сравнения двух величин типа Distance: меньше, меньше или равно, больше, больше или равно, равно, не равно. Результат имеет тип Logic.
XCoordinate | Целочисленный тип, используемый для представления координаты на оси Y.
Операторы |
+ | Бинарный оператор сложения величины типа XCoordinate с величиной типа Distance. Возвращаемое значение имеет тип XCoordinate.
- | Бинарный оператор вычитания величины типа Distance из величины типа XCoordinate. Возвращаемое значение имеет тип XCoordinate.
- | Бинарный оператор вычитания величины типа XCoordinate из величины типа XCoordinate. Возвращаемое значение имеет тип Distance.
<, <=, >, >=, ==, != | Бинарные операторы сравнения двух величин типа XCoordinate: меньше, меньше или равно, больше, больше или равно, равно, не равно. Результат имеет тип Logic.
YCoordinate | Целочисленный тип, используемый для представления координаты на оси Y..
Операторы |
+ | Бинарный оператор сложения величины типа YCoordinate с величиной типа Distance. Возвращаемое значение имеет тип YCoordinate.
- | Бинарный оператор вычитания величины типа Distance из величины типа YCoordinate. Возвращаемое значение имеет тип YCoordinate.
- | Бинарный оператор вычитания величины типа YCoordinate из величины типа YCoordinate. Возвращаемое значение имеет тип Distance.
<, <=, >, >=, ==, != | Бинарные операторы сравнения двух величин типа YCoordinate: меньше, меньше или равно, больше, больше или равно, равно, не равно. Результат имеет тип Logic.
Real | Вещественное число.
Операторы |
- | Унарный оператор смены знака.
+ | Бинарный оператор сложения двух чисел с плавающей точкой.
- | Бинарный оператор вычитания двух чисел с плавающей точкой.
* | Бинарный оператор умножения двух чисел с плавающей точкой.
/ | Бинарный оператор деления на число с плавающей точкой.
<, <=, >, >=, ==, != | Бинарные операторы сравнения двух чисел с плавающей точкой: меньше, меньше или равно, больше, больше или равно, равно, не равно. Результат имеет тип Logic.
Quality | Вещественное число от 0 до 1, используемое в качестве возвращаемого значения методов, управляющих качеством гипотезы элемента.
Area | Целочисленный (в единицах dot*dot) тип, используемый для представления площади области изображения.
Операторы |
- | Унарный оператор смены знака.
+ | Бинарный оператор сложения двух величин типа Area.
- | Бинарный оператор вычитания двух величин типа Area.
* | Бинарный оператор умножения величины типа Area на число типа Int. Результат имеет тип Area.
* | Бинарный оператор умножения величины типа Area на число типа Real. Результат имеет тип Area.
/ | Бинарный оператор деления на целое число типа Int. Результат имеет тип Area.
<, <=, >, >=, ==, != | Бинарные операторы сравнения двух двух величин типа Area: меньше, меньше или равно, больше, больше или равно, равно, не равно. Результат имеет тип Logic.
ImageObjectType | Тип, используемый для представления типов классифицированных объектов изображения.
Операторы |
+ | Оператор объединения величин типа ImageObjectType.
DateFormats | Целочисленный тип, используемый для представления формата даты.
Операторы |
+ | Оператор объединения величин типа DateFormats.
DayFormatVariants | Целочисленный тип, используемый для представления формата дня с составе даты.
Операторы |
+ | Оператор объединения величин типа DayFormatVariants.
MonthFormatVariants | Целочисленный тип, используемый для представления формата месяца с составе даты.
Операторы |
+ | Оператор объединения величин типа MonthFormatVariants.
YearFormatVariants | Целочисленный тип, используемый для представления формата года с составе даты.
Операторы |
+ | Оператор объединения величин типа YearFormatVariants.
XInterval | Тип для представления горизонтального отрезка на изображении.
Операторы |
+ | Бинарный оператор сложения величины типа XInterval с величиной типа Distance. Возвращаемое значение имеет тип XInterval.
+ | Бинарный оператор сложения величины типа XInterval с величиной типа DistInterval. Возвращаемое значение имеет тип XInterval.
- | Бинарный оператор вычитания величины типа Distance из величины типа XInterval. Возвращаемое значение имеет тип XInterval.
- | Бинарный оператор вычитания величины типа DistInterval из величины типа XInterval. Возвращаемое значение имеет тип XInterval.
- | Бинарный оператор вычитания величины типа XInterval из величины типа XInterval. Возвращаемое значение имеет тип XInterval.
- | Бинарный оператор вычитания величины типа XCoordnate из величины типа XInterval. Возвращаемое значение имеет тип DistInterval.
- | Бинарный оператор вычитания величины типа XInterval из величины типа XCoordnate. Возвращаемое значение имеет тип DistInterval.
- | Бинарный оператор вычитания величины типа YCoordinate из величины типа YInterval. Возвращаемое значение имеет тип DistInterval.
- | Бинарный оператор вычитания величины типа YInterval из величины типа YCoordinate. Возвращаемое значение имеет тип DistInterval.
Методы |
XCoordinate Start() | Возвращает абсциссу начала отрезка. Только чтение.
XCoordinate End() | Возвращает абсциссу конца отрезка. Только чтение.
YInterval | Тип для представления вертикального отрезка на изображении.
Операторы |
+ | Бинарный оператор сложения величины типа YInterval с величиной типа Distance. Возвращаемое значение имеет тип YInterval.
+ | Бинарный оператор сложения величины типа YInterval с величиной типа DistInterval. Возвращаемое значение имеет тип YInterval .
- | Бинарный оператор вычитания величины типа Distance из величины типа YInterval. Возвращаемое значение имеет тип YInterval.
- | Бинарный оператор вычитания величины типа DistInterval из величины типа YInterval. Возвращаемое значение имеет тип YInterval.
- | Бинарный оператор вычитания величины типа YInterval из величины типа YInterval. Возвращаемое значение имеет тип DistInterval.
- | Бинарный оператор вычитания величины типа YCoordinate из величины типа YInterval. Возвращаемое значение имеет тип DistInterval.
- | Бинарный оператор вычитания величины типа YInterval из величины типа YCoordinate. Возвращаемое значение имеет тип DistInterval.
Методы |
YCoordinate Start() | Возвращает ординату начала отрезка. Только чтение.
YCoordinate End() | Возвращает ординату конца отрезка. Только чтение.
DistInterval | Тип для представления допустимого диапазона длины отрезка.
Операторы |
* | Бинарный оператор умножения величины типа DistInterval на число типа Int. Результат имеет тип DistInterval.
/ | Бинарный оператор деления на целое число типа Int
Методы |
Distance Start() | Возвращает минимальное значение длины отрезка. Только чтение.
Distance End() | Возвращает максимальное значение длины отрезка. Только чтение.
Rect | Прямоугольник на изображении.
Конструкторы |
Rect Rect( XCoordinate left, YCoordinate top, XCoordinate right, YCoordinate bottom ) | Конструктор величины типа Rect от координат на изображении. В параметрах передаются границы прямоугльника: left – левая, top – верхняя, right – правая, bottom – нижняя.
Операторы |
Or | Оператор объединения двух прямоугольников.
And | Оператор пересечения двух прямоугольников.
Методы |
XCoordinate Left() | Возвращает левую границу прямоугольника. Только чтение.
YCoordinate top() | Возвращает верхнюю границу прямоугольника. Только чтение.
XCoordinate Right() | Возвращает правую границу прямоугольника. Только чтение.
YCoordinate Bottom() | Возвращает нижнюю границу прямоугольника. Только чтение.
Distance Width() | Возвращает ширину прямоугольника. Только чтение.
Distance Height() | Возвращает высоту прямоугольника. Только чтение.
Area Area() | Возвращает площадь прямоугольника. Только чтение.
Void Left( XCoordinate x ) | Задает левую границу прямоугольника.
Void top( YCoordinate y ) | Задает верхнюю границу прямоугольника.
Void Right( XCoordinate x ) | Задает правую границу прямоугольника.
Void Bottom( YCoordinate y ) | Задает нижнюю границу прямоугольника.
XCoordinate XCenter() | Абсцисса центра прямоугольника.
YCoordinate YCenter() | Ордината центра прямоугольника.
Void Inflate( Distance xDist, Distance yDist ) | Расширяет прямоугольник на величину xDist справа и слева, на величину yDist сверху и снизу.
XCoordinate GetX( Real ratio ) | Вычисляет абсциссу, находящуюся внутри прямоугольника между координатами Left и Right в соотношении ratio. Для вычисления используется формула Left + Width * ratio.
YCoordinate GetY( Real ratio ) | Вычисляет ординату, находящуюся внутри прямоугольника между координатами Top и Bottom в соотношении ratio. Для вычисления используется формула Top + Height * ratio.
Rect GetInflated( Distance xDist, Distance yDist ) | Возвращает "расширенный" прямоугольник. Каждая вершина сдвигается на xDist и yDist в сторону расширения (верхняя левая - вверх и влево и т. д.). Сам прямоугольник при этом не изменяется.
Logic IsEmpty() | Проверка того, соответствует ли прямоугольник непустой области на изображении, т.е. области, у которой Left < Right и Top < Bottom
FuzzyRect | Нечеткий прямоугольник. Подробнее см. Нечеткий прямоугольник
Операторы |
And | Оператор объединения двух нечетких прямоугольников. Объединяет интервалы границ сторон заданных нечетких прямоугольников.
Or | Оператор объединения двух нечетких прямоугольников. Объединяет интервалы границ сторон заданных нечетких прямоугольников.
Методы |
Rect ExternalRect() | Возвращает копию внешнего прямоугольника.
Rect InternalRect() | Возвращает копию внутреннего прямоугольника.
XInterval Left() | Левая граница нечеткого прямоугольника, горизонтальный интервал.
YInterval top() | Верхняя граница нечеткого прямоугольника, вертикальный интервал.
XInterval Right() | Правая граница нечеткого прямоугольника, горизонтальный интервал.
YInterval Bottom() | Нижняя граница нечеткого прямоугольника, вертикальный интервал.
XInterval XCenter() | Абсцисса центра нечеткого прямоугольника, горизонтальный интервал.
YInterval YCenter() | Ордината центра нечеткого прямоугольника, вертикальный интервал.
DistInterval Width() | Ширина нечеткого прямоугольника, интервал расстояний.
DistInterval Height() | Высота нечеткого прямоугольника, интервал расстояний.
Logic IsEmpty() | Проверка нечеткого прямоугольника на непустоту.
RectArray | Массив прямоугольников.
Конструкторы |
RectArray RectArray () | Конструктор. Создает пустой массив прямоугольников.
RectArray RectArray( Rect rect ) | Конструктор от величины типа Rect. Создает массив из одного прямоугольника, равного rect.
RectArray RectArray( Region region ) | Конструктор от величины типа Region. Создает массив прямоугольников из региона region.
Методы |
Region Region() | Связный регион, образованный на основе массива прямоугольников.
Rect Rect() | Описывающий прямоугольник массива прямоугольников.
Void Add( Rect rect ) | Метод добавления в массив прямоугольников еще одного прямоугольника rect.
Void Add( RectArray array ) | Метод добавления в массив прямоугольников другого массива прямоугольников array.
Region | Регион, представляющий собой набор прямоугольников, расположенных один под другим таким образом, что верхяя линия нижнего прямоугольника является нижней границей верхнего (таким образом прямоугольники не перекрываются).
Конструкторы |
Region Region() | Конструктор. Создает пустой регион.
Region Region( RectArray rectArray ) | Конструктор от величины типа RectArray. Создает регион, содержащий прямоугольники из массива rectArray.
Операторы |
Or | Оператор объединения двух регионов.
And | Оператор пересечения двух регионов; либо региона и прямоугольника. Результат имеет тип Region.
Методы |
XCoordinate Left() | Возвращает левую границу региона. Только чтение.
YCoordinate Top() | Возвращает верхнюю границу региона. Только чтение.
XCoordinate Right() | Возвращает правую границу региона. Только чтение.
YCoordinate Bottom() | Возвращает нижнюю границу региона. Только чтение.
Distance Width() | Возвращает ширину региона. Только чтение.
Distance Height() | Возвращает высоту региона. Только чтение.
Area Area() | Возвращает площадь прямоугольника. Только чтение.
Void Inflate( Distance xDist, Distance yDist ) | Расширяет регион на величину xDist справа и слева, на величину yDist сверху и снизу.
Rect Rect() | Возвращает копию описывающего прямоугольника региона.
ImageObjectSet | Тип для представления набора объектов изображения, попавших в гипотезу.
Методы |
RectArray Rects() | Возвращает копию массива прямоугольников объектов изображения, попавших в гипотезу.
Region Region() | Возвращает копию связного региона, образованного на основе массива прямоугольников объектов изображения, попавших в гипотезу.
TextTypes | Тип, используемый для представления множества типов текста.
Операторы |
+ | Оператор объединения величин типа TextTypes.
BarcodeTypes | Тип, используемый для представления множества типов штрих-кодов.
Операторы |
+ | Оператор объединения величин типа BarcodeTypes.
BarcodeOrientations | Тип, используемый для представления множества возможных ориентаций штрих-кодов.
Операторы |
+ | Оператор объединения величин типа BarcodeOrientations.
RecognitionMode | Целочисленный тип, используемый для представления режимов предварительного распознавания.
Direction | Тип, используемый для представления горизонтального или вертикального направления. Используется для задания направления в элементах Separator и WhiteGap.
HorSearchAreaBound | Тип, используемый для представления правой и левой границ области поиска элемента. Создать переменную такого типа можно только при помощи выражения Let.
Операторы |
- | Бинарный оператор вычитания двух величин типа HorSearchAreaBound и XInterval. Возвращаемое значение имеет тип XInterval.
>, < | Бинарные операторы сравнения величины типа HorSearchAreaBound с величиной типа XCoordinate. Результат имеет тип FuzzyRect.
VertSearchAreaBound | Тип, используемый для представления верхней и нижней границ области поиска элемента. Создать переменную такого типа можно только при помощи выражения Let.
Операторы |
- | Бинарный оператор вычитания двух величин типа HorSearchAreaBound и YInterval. Возвращаемое значение имеет тип YInterval.
>, < | Бинарные операторы сравнения величины типа VertSearchAreaBound с величиной типа YCoordinate. Результат имеет тип FuzzyRect.
Hypothesis | Тип, используемый для обращения к гипотезе элемента любого типа. Подробнее о методах гипотез см. Гипотезы всех типов элементов.
HypothesisInstances | Описывает экземпляры гипотез элемента Repeatable Group. Имеет те же методы, что и гипотеза. Подробнее о методах гипотез см. Гипотезы всех типов элементов.
Методы |
YCoordinateArray GetYArray( Real ratio ) | Возвращает массив Y координат прямоугольников экземпляров. Для вычисления Y-координаты используется формула Top + Height * ratio. Нулевые экземпляры игнорируются.
YCoordinateArray | Массив Y-координат прямоугольников.
Конструктор |
YCoordinateArray YCoordinateArray() | Конструктор. Создает пустой массив прямоугольников, заданных Y-координатами.
Методы |
Void Add( YCoordinate ) | Добавить прямоугольник в конец массива.
Void Add( YCoordinateArray ) | Добавить в конец массива другой массив.
Void InsertAt( Int index, YCoordinate ) | Добавить прямоугольник в позицию index.
Void DeleteAll() | Удалить все элементы массива.
Void DeleteAt( Int index ) | Удалить элемент в позиции index.
YCoordinate GetAt( Int index ) | Возвращает элемент с заданным индексом.
Int Count() | Возвращает количество элементов массива.
Void ShiftDown( Int index, Distance ) | Сдвинуть вниз (увеличить) координату заданного элемента массива.
Void ShiftUp( Int index, Distance ) | Сдвинуть вверх (уменьшить) координату заданного элемента массива.
Void ShiftDown( Distance ) | Сдвинуть вниз (увеличить) все элементы массива.
Void ShiftUp( Distance ) | Сдвинуть вверх (уменьшить) все элементы массива.
TableBlockColumn | Тип, используемый для обращения к столбцу табличного блока. Создать переменную такого типа можно только при помощи выражения Let. Подробнее об использовании столбцов табличного блока см. Гипотеза элемента Table.
TableBlockColumnArray | Тип, используемый для обращения к массиву столбцов табличного блока. Создать переменную такого типа можно только при помощи выражения Let. Подробнее об использовании столбцов табличного блока см. Гипотеза элемента Table.
Конструкторы |
TableBlockColumnArray( TableBlockColumn ) | Создает массив столбцов из одного столбца. Пример: TableBlockColumnArray arr; arr = Blocks.TableBlock.Column1;
Методы |
Void Add( TableBlockColumn ) | Добавляет в массив столбцов табличного блока указанный столбец.
Операторы |
<< | Добавляет в массив столбцов табличного блока другой массив. Бинарный оператор. Пример: TableBlockColumnArray arr; arr = Blocks.TableBlock.Column1; arr << Blocks.TableBlock.Column2 << Blocks.TableBlock.Column3;
TableHypothesis | Тип, используемый для обращения к гипотезе табличного элемента. Подробнее о методах гипотез см. Гипотеза элемента Table.
TableHypColumn | Тип, используемый для обращения к столбцу гипотезы табличного элемента. Создать переменную такого типа можно только при помощи выражения Let. Подробнее о методах гипотез см. Гипотеза элемента Table.
TableColumnType | Тип, используемый для представления множества типов содержимого табличного столбца.
CurrencyPositionTypes | Тип, используемый для задания позиции названия валюты относительно числового значения в элементе Currency.
Операторы |
+ | Бинарный оператор объединения величин типа CurrencyPositionTypes.
PageInterval | Тип для представления диапазона страниц многостраничного документа.
Методы |
Logic IsEmpty() | Проверка диапазона прямоугольника на непустоту. Только чтение.
Int Start() | Возвращает номер первой страницы диапазона страниц. Только чтение.
Int End() | Возвращает номер последней страницы диапазона страниц. Только чтение.
PageArea | Область на странице. Возвращается методами PageSearchAreaLocal, PageSearchAreaGlobal, PageAreaLocal, PageAreaGlobal (аргументы этих функций – номер страницы). Может быть как в локальных, так и в глобальных координатах в зависимости от того, какая функция была вызвана.
Методы |
XInterval Left() | Левая граница части гипотезы, расположенной на данной странице, горизонтальный интервал.
YInterval Top() | Верхняя граница части гипотезы, расположенной на данной странице, вертикальный интервал.
XInterval Right() | Правая граница части гипотезы, расположенной на данной странице, горизонтальный интервал.
YInterval Bottom() | Нижняя граница части гипотезы, расположенной на данной странице, вертикальный интервал.
XInterval XCenter() | Абсцисса центра части гипотезы, расположенной на данной странице, горизонтальный интервал.
YInterval YCenter() | Ордината центра части гипотезы, расположенной на данной странице, вертикальный интервал.
DistInterval Width() | Ширина части гипотезы, расположенной на данной странице, интервал расстояний.
DistInterval Height() | Высота части гипотезы, расположенной на данной странице, интервал расстояний.
FuzzyRect FuzzyRect() | Нечеткий прямоугольник части гипотезы, расположенной на данной странице.
Rect Rect() | Описывающий прямоугольник части гипотезы, расположенной на данной странице. Совпадает с внешним прямоугольником нечеткого прямоугольника.
Region Region() | Регион части гипотезы, расположенной на данной странице.
Region SimplifiedRegion() | Регион части гипотезы, расположенной на данной странице, упрощенный для улучшения визуального восприятия.
ImageObjectSet Set() | Объекты изображения, попавшие в часть гипотезы, расположенной на данной странице.
ImageObjectSet ExcludeSet() | Объекты изображения, попавшие в область изображения, исключенную из области поиска части гипотезы, расположенной на данной странице, методами типа Exclude.
RectArray Rects() | Массив прямоугольников объектов изображения, попавших в часть гипотезы, расположенной на данной странице.
PageEdge | Тип, используемый для задания функции Nearest по отношению к краю страницы. Позволяет выбрать гипотезу, ближайшую к верхней, нижней, левой или правой границе.
Page | Тип возвращает функция Page( Int PageNumber ).
Методы |
Distance AverageLineHeight() | Средняя высота строки на странице.
Distance AverageInterlineInterval() | Среднее расстояние между строками на странице.
Area ObjectsAreaLocal( Rect localRect, ImageObjectType ) | Площадь объектов на странице заданного типа в заданном прямоугольнике. Прямоугольник задан в локальных координатах страницы.
Area ObjectsIntersectionAreaLocal( Rect localRect, ImageObjectType ) | Совместная площадь объектов на странице заданного типа, полностью лежащих в заданном прямоугольнике, и областей пересечения с заданным прямоугольником объектов, не полностью лежащих внутри него. Прямоугольник задан в локальных координатах страницы.
Area ObjectsAreaGlobal( Rect globalRect, ImageObjectType ) | Площадь объектов на странице заданного типа в заданном прямоугольнике. Прямоугольник задан в глобальных координатах.
Area ObjectsIntersectionAreaGlobal( Rect globalRect, ImageObjectType ) | Совместная площадь объектов на странице заданного типа, полностью лежащих в заданном прямоугольнике, и областей пересечения с заданным прямоугольником объектов, не полностью лежащих внутри него. Прямоугольник задан в глобальных координатах.
Rect RectLocal() | Прямоугольник всего изображения в координатах страницы.
Rect RectGlobal() | Прямоугольник всего изображения в глобальных координатах.
SearchAreaPageSetType | Тип, используемый в функции RestrictSearchArea. Предопределенные константы этого типа: AnyPage; OddPages; EvenPages; LastPage.
IntArray | Массив целых чисел.
Конструкторы |
IntArray IntArray() | Конструктор. Создает пустой массив.
IntArray IntArray( Int ) | Конструктор от целого числа. Создает массив из одного этого числа.
Методы |
Int Count() | Возвращает количество элементов массива.
Int GetAt( Int ) | Возвращает элемент с заданным индексом.
Void Add( Int ) | Добавляет целое число в конец массива.
Void Add( IntArray ) | Добавляет в конец массива другой массив.
Void InsertAt( Int index, Int number ) | Добавляет число number в позицию index.
Void DeleteAll() | Удаляет все элементы массива.
Void DeleteAt( Int index ) | Удаляет элемент в позиции index.
Операторы |
<< | Добавляет в массив целое число. Бинарный оператор.
StringArray | Массив строк.
Конструктор |
StringArray StringArray() | Конструктор. Создает пустой массив.
Методы |
Int Count() | Возвращает количество элементов массива.
String GetAt( Int index ) | Возвращает элемент с заданным индексом.
Void Add( String ) | Добавляет строку в конец массива.
Void Add( StringArray ) | Добавляет в конец массива другой массив.
Void InsertAt( Int index, String ) | Добавляет строку в позицию index.
Void DeleteAll() | Удаляет все элементы массива.
Void DeleteAt( Int index ) | Удаляет элемент в позиции index.


Преобразование типов

В языке гибких описаний поддержаны неявные преобразования типов.

Int –> Real
Rect –> Region
XCoordinate –> XInterval
YCoordinate –> YInterval
Distance –> Distinterval

Следующие преобразования допустимы в языке, но их использование может привести к ошибке. Например, преобразование XCoordinate –> Distance с последующим преобразованием Distance –> YCoordinate может привести к ошибочному преобразованию абсциссы в ординату.

При наличии подобных преобразований в программном коде компилятор выдает предупреждение.

Distance –> XCoordinate
Distance –> YCoordinate
XCoordinate –> Distance
YCoordinate –> Distance
DistInterval –> XInterval
DistInterval –> YInterval
Xinterval –> DistInterval
Yinterval –> DistInterval


Предопределенные константы

Тип | Значение
Logic | true; false
DateFormats | DayMonthYear; DayYearMonth; MonthDayYear; MonthYearDay; YearDayMonth; YearMonthDay
DayFormatVariants | NoLeadingZeroDay; WithLeadingZeroDay
MonthFormatVariants | DigitsNoLeadingZeroMonth; DigitsWithLeadingZeroMonth; WordMonth
YearFormatVariants | TwoDigitYear; FourDigitYear
Quality | BestQuality; WorstQuality
TextTypes | TextType_Normal; TextType_TypeWriter; TextType_Matrix
RecognitionMode | FastMode; FullMode
Alignment | Alignment_None; Alignment_Left; Alignment_Right; Alignment_Justified; Alignment_Center
BarcodeOrientations BarcodeOrientation_Autodetect; BarcodeOrientation_LeftToRight;

BarcodeOrientation_DownToTop; BarcodeOrientation_RightToLeft;

BarcodeOrientation_TopToDown

BarcodeTypes | BarcodeType_Autodetect; BarcodeType_Codabar; BarcodeType_Code39; BarcodeType_Code93; BarcodeType_CheckCode39; BarcodeType_Code39WithoutAsterisk; BarcodeType_Interleaved25; BarcodeType_CheckInterleaved25; BarcodeType_EAN13; BarcodeType_Code128; BarcodeType_EAN8; BarcodeType_PDF417; BarcodeType_IATA25; BarcodeType_UCC128; BarcodeType_UPCA; BarcodeType_UPCE
ImageObjectType

Сумма произвольного числа элементарнных значений, соответствующих объектам различного типа:

  • AnyText - текст;
  • PunctuationMark - пунктуационные знаки;
  • PictureObject - изображение;
  • InvertedTextObject - инвертированный текст;
  • CheckmarkObject - метка;
  • SeparatorObject - разделитель;
  • VertSeparatorObject - вертикальный разделитель;
  • HorSeparatorObject - горизонтальный разделитель;
  • BarcodeObject - штрих-код.
Direction | Vertical; Horizontal
TableColumnType ColumnType_Text;
ColumnType_Currency;
ColumnType_Date;
ColumnType_RegExp;
ColumnType_Number
CurrencyPositionTypes | CurrencyPos_Left; CurrencyPos_Right
SearchAreaPageRestriction | WholePage (используется только в функции RestrictSearchArea)
SearchAreaPageSetType | AnyPage; OddPages; EvenPages; LastPage (используются только в функции RestrictSearchArea)
PageEdge | PageTop; PageBottom; PageLeft; PageRight
TextAlignmentInTableCell | TextAlignment_CellTop; TextAlignment_CellBottom
String | RegionalDecimalPoint – символ, используемый операционной системой для разделения целой и дробной частей десятичного числа.


Предопределенные переменные

Имя | Значение
OutputRegion | Переменная типа Region, используемая в разделе описания блока Region Expression. Ее значение определяет найденный регион блока. Используется для блоков всех типов, кроме табличного.
IsNull | Переменная типа Logic, используемая в разделе описания блока Region Expression. Её значение определяет, найден данный блок или нет. Переменная IsNull предварительно инициализирована значением False, что означает, что блок найден. Чтобы указать программе, что блок не найден, нужно присвоить переменной IsNull значение True. Используется для блоков всех типов.
OutputTable | Переменная типа TableHypothesis, используемая в разделе описания табличного блока Region Expression. Ее значение позволяет инициализировать регион и содержимое блока на основе указанного табличного элемента. Используется только для блоков табличного типа.
OutputInstances | Переменная, используемая в разделе Region Expression для блоков всех типов, у которых отмечена опция Has repeatable instances. Для нетабличных блоков тип переменной HypothesisInstances, а для табличных TableHypothesisInstances. Ее значение определяет найденный регион блока. Регион блока, построенный из экземпляров элементов и подэлементов повторяющейся группы, является разрывным.


Глобальные функции

Определение | Описание
Distance AverageLineHeight() Средняя высота строки на странице.
Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка.
Для многостраничного документа можно использовать соответствующий метод типа Page:
Page( N ). AverageLineHeight.
Distance AverageInterLineInterval() Среднее расстояние между строками на странице.
Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка.
Для многостраничного документа можно использовать соответствующий метод типа Page:
Page( N ). AverageInterLineInterval.
Area ObjectsArea( Rect, ImageObjectType ) | Площадь объектов заданного типа в заданном прямоугольнике. Работает в глобальных координатах.
Area ObjectsIntersectionArea( Rect, ImageObjectType ) | Площадь объектов заданного типа, находящихся внутри заданного прямоугольника, и областей пересечения с заданным прямоугольником объектов заданного типа, выходящих за его пределы. Работает в глобальных координатах.
Rect PageRect() Прямоугольник всего изображения.
Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный.
В многостраничном документе эту функцию можно использовать только в разделе Pre-search Relations. См. Функции, ограничивающие область поиска: Вспомогательные функции для задания области поиска.
Logic IsOnSameLine( Hypothesis, Hypothesis ) | Проверка на пересечение гипотез по вертикали
Int abs ( Int ) | Возвращает абсолютное значение числа
Int Min( Int n1, Int n2 ) | Возвращает минимальное значение из n1, n2
Int Max( Int n1, Int n2 ) | Возвращает максимальное значение из n1, n2
Int Round( Real ) | Возвращает целое число, ближайшее к значению аргумента.
Int Ceil( Real ) | Возвращает наименьшее целое число, значение которого не меньше значения аргумента.
Int Floor( Real ) | Возвращает наибольшее целое число, значение которого не больше значения аргумента.
Real Min( Real d1, Real d2 ) | Возвращает минимальное значение из d1, d2
Real Max( Real d1, Real d2 ) | Возвращает максимальное значение из d1, d2
Area Min( Area a1, Area a2 ) | Возвращает минимальное значение из a1, a2
Area Max( Area a1, Area a2 ) | Возвращает максимальное значение из a1, a2
Distance abs ( Distance ) | Возвращает абсолютное значение расстояния
Distance Min( Distance d1, Distance d2 ) | Возвращает минимальное значение из d1, d2
Distance Max( Distance d1, Distance d2 ) | Возвращает максимальное значение из d1, d2
XCoordinate Min( XCoordinate x1, XCoordinate x2 ) | Возвращает минимальное значение из x1, x2
XCoordinate Max( XCoordinate x1, XCoordinate x2 ) | Возвращает максимальное значение из x1, x2
XCoordinate MiddleBetween( XCoordinate x1, XCoordinate x2 ) | Возвращает абсциссу, вычисленную как ( x1+ x2 ) / 2
XCoordinate Between( XCoordinate x1, XCoordinate x2, Real ratio ) | Возвращает абсциссу, вычисленную как x1+ ( x2 – x1 ) * ratio
YCoordinate Min( YCoordinate y1, YCoordinate y2 ) | Возвращает минимальное значение из y1, y22
YCoordinate Max( YCoordinate y1, YCoordinate y2 ) | Возвращает максимальное значение из y1, y2
YCoordinate MiddleBetween( YCoordinate y1, YCoordinate y2 ) | Возвращает ординату, вычисленную как ( y1+ y2 ) / 2
YCoordinate Between( YCoordinate y1, YCoordinate y2, Real ratio ) | Возвращает ординату, вычисленную как y1+ ( y2 – y1 ) * ratio
XInterval MiddleBetween( Xinterval x1, XInterval x2 ) | Возвращает XInterval, вычисленный как ( x1+ x2 ) / 2
XInterval Between( Xinterval x2, Xinterval x2, Real ratio ) | Возвращает XInterval, вычисленный как x1+ ( x2 – x1 ) * ratio
YInterval MiddleBetween( Yinterval y1, Yinterval y2 ) | Возвращает YInterval, вычисленный как ( y1+ y2 ) / 2
YInterval Between( Yinterval y1, Yinterval y2, Real ratio ) | Возвращает YInterval, вычисленный как y1+ ( y2 – y1 ) * ratio
Region FormRegion( RectArray included, RectArray excluded ) | Создает регион, включающий массив прямоугольников included, и исключающий включающий массив прямоугольников excluded.
String Chr( Int ) | Возвращает строку по заданному Unicode коду символа (код нужно писать в десятичной системе счисления)
Quality ValidateByText( String word, String variants, Int maxErrors, Real maxErrorsPart, Logic ignoreSpaces )

Проверяет заданное слово word, сравнивая его с перечисленными вариантами. Аргумент maxErrors задает абсолютное, а аргумент maxErrorsPart – относительное максимально допустимое число ошибок на слово. Аргумент ignoreSpaces определяет, нужно ли учитывать пробелы при сравнении.

Возвращается качество совпадения заданного слова и наиболее подходящего ему слова из вариантов, заданных в аргументе variants.

Пример:
if not IsNull then ValidateByText ( Value(), "ABBYY|Flexi Capture", 1, 0.3, true );

Данная функция может быть использована в разделе Advanced Post-Search Relations для нечеткого сравнения найденного строкового значения гипотезы, возвращаемого методом Value, с заданными вариантами.
Quality ValidateByDB( String word, String connectionString, String selectString, Int maxErrors, Real maxErrorsPart, Logic ignoreSpaces, Int maxRecordsCount = 1000 )

Проверяет заданное слово word с помощью базы данных (см. Использование баз данных и текстовых файлов в языке гибких описаний.) Аргумент connectionString задает строку соединения с базой данных. Аргумент selectString задает SQL-запрос, начинающийся с команды SELECT. Аргумент maxErrors задает абсолютное, а аргумент maxErrorsPart – относительное максимально допустимое число ошибок на слово. Аргумент ignoreSpaces определяет, нужно ли учитывать пробелы при сравнении. Для ускорения поиска рассматриваются только первые maxRecordsCount вариантов (по умолчанию 1000).

Возвращается качество совпадения заданного слова и наилучшего слова для него из базы данных.

Пример:
if not IsNull then ValidateByDB( Value(), "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\\FCS\\Companies.mdb", "SELECT Name FROM Companies", 1, 0.3, true, 500 );

Данная функция может быть использована в разделе Advanced Post-Search Relations для нечеткого сравнения найденного строкового значения гипотезы, возвращаемого методом Value, с заданными вариантами.
Quality ValidateByFile( String word, String fileName, Int maxErrors, Real maxErrorsPart, Logic ignoreSpaces, Int maxRecordsCount = 1000 ) Проверяет заданное слово word с помощью текстового файла fileName, в котором перечислены варианты фраз. (См. Использование баз данных и текстовых файлов в языке гибких описаний.) Аргумент maxErrors задает абсолютное, а аргумент maxErrorsPart – относительное максимально допустимое число ошибок на слово. Аргумент ignoreSpaces определяет, нужно ли учитывать пробелы при сравнении.

Возвращается качество совпадения заданного слова и наилучшего слова для него из текстового файла. Для ускорения поиска рассматриваются только первые maxRecordsCount вариантов (по умолчанию 1000).

Пример:
if not IsNull then ValidateByTextFile( Value(), "Companies.txt", 1, 0.3, true, 500 );

Данная функция может быть использована в разделе Advanced Post-Search Relations для нечеткого сравнения найденного строкового значения гипотезы, возвращаемого методом Value, с заданными вариантами.

Int RecordCount( String connectionString, String selectString ) Возвращает количество записей запроса.

Пример:
См. пример для функции Record ниже.
Void PrepareRecordset( String connectionString, String selectString, Int maxRecordsCount = 1000 ) Подготавливает запрос для быстрого доступа.

Пример:
См. пример для функции Record ниже.
StringArray Record( String connectionString, String selectString, Int index ) Позволяет получить данные о конкретной записи.
Для ячейки, имеющей значение NULL, возвращается пустая строка.

Пример:
String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\1.mdb;";
String selectString = "SELECT SearchText, LeftPos, TopPos, RightPos, BottomPos from SearchPositions WHERE ElementName = 'DocID'";

PrepareRecordset( connectionString, selectString );
Int recordCount = RecordCount( connectionString, selectString );

String searchString;
RectArray searchArea = RectArray();
for recordIndex from 0 to recordCount - 1 {
StringArray recordArray = Record( connectionString, selectString, recordIndex );
if recordIndex == 0 then {
searchString = recordArray.GetAt( 0 );
} else {
searchString = searchString + "|" + recordArray.GetAt( 0 );
}
searchArea.Add( Rect( StrToInt( recordArray.GetAt( 1 ) ) * dt, StrToInt( recordArray.GetAt( 2 ) ) * dt, StrToInt( recordArray.GetAt( 3 ) ) * dt, StrToInt( recordArray.GetAt( 4 ) ) * dt ) );
}

SearchText: searchString;
RSA: searchArea;

В данном примере из таблицы SearchPositions извлекается строка поиска SearchText и координаты прямоугольников поиска LeftPos, TopPos, RightPos, BottomPos. Значение поля SearchText объединяется при помощи оператора "|" в строку поиска. Координаты в полях таблицы LeftPos, TopPos, RightPos, BottomPos используются для формирования координат прямоугольников в точках. Полученные координаты добавляются в область поиска элемента DocID.
String UCase( String ) | Возвращает строку, полученную из заданной приведением всех символов строки к верхнему регистру.
String LCase( String ) | Возвращает строку, полученную из заданной приведением всех символов строки к нижнему регистру.
String RemoveSpaces( String ) | Возвращает строку, полученную из заданной удалением всех пробелов строки.
Int PagesCount() | Возвращает количество страниц в документе.
Page Page( Int PageNumber ) | Возвращает тип, описывающий заданную страницу.
Rect DocumentRect() | Возвращает прямоугольник всего документа (в глобальных координатах).
Logic TestDBConnection( String connectionString ) | Проверяет наличие доступа к базе данных. Аргумент connectionString задает строку соединения с базой данных.
Logic TestDBSelect( String connectionString, String selectString ) | Проверяет наличие доступа к базе данных и корректность SQL-запроса (существования таблицы и поля). Аргумент connectionString задает строку соединения с базой данных. Аргумент selectString задает SQL-запрос, начинающийся с команды SELECT.
Logic TestFileAccess( String fileName ) | Проверяет наличие доступа к текстовому файлу.
Logic IsInt( String inputString, Logic isStrictMode = false ) | Служит для проверки того, что строку inputString можно безопасно преобразовать в целое число. Параметр isStrictMode (по умолчанию равен false) определяет, допустимо ли наличие в строке символов, отличных от цифр и пробелов.
Int LogicToInt( Logic value ) | Возвращает "1", если value имеет значение true, и "0", если value имеет значение false.
Int StrToInt( String inputString, Logic isStrictMode = false ) Возвращает результат преобразования значения строки inputString в целое число. Пробелы при преобразовании пропускаются. Параметр isStrictMode (по умолчанию равен false) определяет, допустимо ли наличие в строке символов, отличных от цифр и пробелов. Если при isStrictMode = false в строке встретился символ, не являющийся цифрой или пробелом, все символы, идущие дальше, опускаются. Перед преобразованием рекомендуется проверить возможность его осуществления с помощью вызова функции IsInt.

Пример:

Int integralValue;

String valueFromDocument = SearchElements.StaticText.Value();

Logic canBeConverted = IsInt( valueFromDocument, true );

if( canBeConverted ) then integralValue = StrToInt( valueFromDocument, true );
Logic IsReal( String numberString, String separators = “.,”, Logic isStrictMode = false ) | Служит для проверки того, что строку inputString можно безопасно преобразовать в вещественное число. Список допустимых десятичных разделителей задаётся аргументом separators – по умолчанию допускаются точка, запятая и разделитель, выставленный в региональных настройках ОС пользователя (см. RegionalDecimalPoint). Параметр isStrictMode (по умолчанию равен false) определяет, допустимо ли наличие в строке символов, отличных от цифр, пробелов и разделителей.
Real StrToReal( String numberString, String separators = “.,”, Logic isStrictMode = false ) Возвращает результат преобразования значения строки inputString в вещественное число. Пробелы при преобразовании пропускаются. Параметр isStrictMode (по умолчанию равен false) определяет, допустимо ли наличие в строке символов, отличных от цифр, пробелов и разделителей. Если при isStrictMode = false в строке встретился второй десятичный разделитель или символ, не являющийся цифрой или пробелом, все символы, идущие дальше, опускаются. Перед преобразованием рекомендуется проверить возможность его осуществления с помощью вызова функции IsReal.

Пример:

Real realValue;

String valueFromDocument = SearchElements.StaticText.Value();

Logic canBeConverted = IsReal( valueFromDocument, "." );

if( canBeConverted ) then realValue = StrToReal( valueFromDocument, "." );
Logic ExecuteSQL( String connectionString, String queryString ) Выполняет пользовательский SQL-запрос queryString. Аргумент connectionString задает строку соединения с базой данных.

Пример:

ExecuteSQL("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\\FCS\\Companies.mdb", "UPDATE Companies SET total=0" );
Logic WriteToFile( String filename, String text ) Дописывает в текстовый файл filename строку text. Если файла с таким названием не существует, он создаётся.

Пример:

WriteToFile( “D:\\FCS\\logFile.txt”, SearchElements.Tag.Value() );
Void SetPagesCount( Int pagesCount ) Явно задает количество страниц в документе. Используется в секциях Pre-search или Post-search advanced code.

Вызов этой функции должен осуществляться из элементов Header или Footer, или их подэлементов.

Функция используется для документов, у которых отсутствует признак конца документа (футера нет либо он опционален).

Примеры:

Если данный элемент наложился – на следующей странице документ заканчивается.

if IsFound then SetPagesCount( PagesCount + 1 );

Читаем количество страниц в документе из поля PageNum:

if PageNum.IsFound and IsInt( PageNum.Value ) then SetPagesCount: StrToInt( PageNum.Value );
Следующие функции предназначены для запуска предраспознавания в процессе наложения гибкого описания. Текстовые строки, пересекающие заданную область предраспознавания, распознаются целиком (в том числе части строк, выходящие за пределы области).
Void RecognizeText() | Распознает текст в относительном прямоугольнике, заданном в свойствах проекта Pre-recognition area, на всех страницах документа.
Void RecognizeText( IntArray pages ) | Распознает текст в относительном прямоугольнике, заданном в свойствах проекта Pre-recognition area, на страницах, заданных набором pages.
Void RecognizeText( SearchAreaPageSetType pageSetType ) | Распознает текст в относительном прямоугольнике, заданном в свойствах проекта Pre-recognition area, на страницах, заданных набором pageSetType.
Void RecognizeText( Rect rect ) | Распознает текст в прямоугольнике rect.
Void RecognizeText( Rect rect, IntArray pages ) | Распознает текст в прямоугольнике rect на страницах, заданных набором pages.
Void RecognizeText( Rect rect, SearchAreaPageSetType pageSetType) | Распознает текст в прямоугольнике rect на страницах, заданных набором pageSetType.
Void RecognizeText( RectArray rectArray ) | Распознает текст в массиве прямоугольников rectArray.
Void RecognizeText( RectArray rectArray, IntArray pages ) | Распознает текст в массиве прямоугольников rectArray на страницах, заданных набором pages.
Void RecognizeText( RectArray rectArray, SearchAreaPageSetType pageSetType ) | Распознает текст в массиве прямоугольников rectArray на страницах, заданных набором pageSetType.
Void RecognizeText( Region region ) | Распознает текст в регионе region.
Void RecognizeText( Region region, IntArray pages ) | Распознает текст в регионе region на страницах, заданных набором pages.
Void RecognizeText( Region region, SearchAreaPageSetType pageSetType ) | Распознает текст в регионе region на страницах, заданных набором pageSetType.
RectArray RecognizedRects() | Отладочная функция, позволяющая вывести на печать массив предраспознанных прямоугольников.


Управление поиском

Определение | Описание
Void Optional( Real q1, Real q2 ) | Устанавливает признак опциональности для элемента. Параметр q1 задает качество нулевой гипотезы. Параметр q2 задает критерий для создания нулевой гипотезы: нулевая гипотеза будет создана в случае, если не будет создана ненулевая гипотеза с качеством выше, чем этот порог.
Void StopIfFound ( Logic Value=true ) | Прекращает генерацию гипотез ветки перебора, если в ней содержится ненулевая гипотеза данного элемента
Void DontFind() | Задает условие, что искать элемент не нужно. В случае, если элемент опциональный, будет создана лишь нулевая гипотеза.
Void MaxHypothesesCount( Int ) | Задает максимально допустимое число гипотез элемента.


Виды условий, ограничивающих область поиска

Область поиска элемента формируется выполнением условий на закладках Search constraints и Relations свойств элемента, а также выполнением инструкций из раздела Advanced Pre-Search Relations. Перед выполнением всех условий область поиска элемента совпадает с прямоугольником страницы. Затем на нее накладываются условия, заданные на закладках Search constraints и Relations. После этого на область поиска накладываются дополнительные ограничения, заданные в разделе Advanced Pre-Search Relations.

В разделе Advanced Pre-Search Relations описания элемента можно задать условия следующих видов:

  1. Ограничение области поиска заданным прямоугольником (переменной типа Rect), регионом, т.е. связным массивом прямоугольников (переменной типа Region) или массивом прямоугольников, который в общем случае может быть несвязным (переменной типа RectArray). Ограничение такого вида задается при помощи функции RestrictSearchArea с указанием параметра соответствующего типа.
    В качестве параметра можно указывать любые вычисляемые выражения, возвращающие значения подходящего типа.
  2. Ограничение области поиска полуплоскостью, находящейся слева, сверху, справа или снизу от указанной точки, гипотезы другого элемента и др. Ограничения такого вида задаются при помощи функций LeftOf, RightOf, Above, Below.
  3. Иногда в реальных задачах бывает необходимо ограничить отдельно какую-либо границу элемента. Например, может быть известно, что левая граница элемента всегда находится в левой половине изображения, тогда как правая может простираться сколь угодно далеко вправо.
    Язык гибких описаний позволяет задать подобные ограничения на этапе вычисления области поиска, что позволяет сузить набор формируемых гипотез элемента. Ограничения такого вида задаются при помощи специальных функций LeftBound, RightBound, TopBound, BottomBound и операторов > и <. Функции LeftBound и RightBound используются для обращения к левой и правой границам области поиска, функции TopBound, BottomBound - для обращения к верхней и нижней границам.
  4. Исключение из области поиска прямоугольника, массива прямоугольников, гипотезы другого элемента и пр. Подобные ограничения задаются функциями Exclude, ExcludeRect, ExcludeSet.

В разделе Advanced Pre-Search Relations элемента может быть задано любое количество ограничений на область поиска любого из перечисленных видов. Каждое из таких условий формирует некоторую область на изображении. Все области, полученные в результате выполнения отдельных условий из раздела, после вычисления пересекаются.
Кроме того, вычисленная область поиска элемента пересекается с областью поиска группового элемента, в составе которого данный элемент находится.


Геометрия области поиска

Представим для простоты, что на закладках Search Constraints и Relations свойств элемента (а также всех его «родительских» составных элементов) не заданы никакие ограничения области поиска. Тогда перед выполнением инструкций из раздела Advanced Pre-Search Relations область поиска элемента будет совпадать со всем прямоугольником страницы. Если раздел не содержит инструкций, то элемент будет искаться на всей странице.

Выполнение условий поиска вида 1, 2, 4 описанных в разделе Виды условий, ограничивающих область поиска, приводит к формированию области поиска в виде массива прямоугольников. Программа представляет такую область как один прямоугольник, описывающий весь массив, и набор прямоугольников, которые необходимо исключить из описывающего прямоугольника (excluded rectangles).

Выполнение условий поиска из Виды условий, ограничивающих область поиска, п.3 формирует диапазон допустимых значений координат для каждой из границ гипотезы: левой, правой, верхней и нижней. Диапазон координат границы представляет собой отрезок на соответствующей координатной оси, например, [x1, x2] или [y1, y2]. Здесь x1 и x2 имеют тип XCoordinate, y1 и y2 имеют тип YCoordinate. Для отрезка на координатной оси выполняется условие: x1 <= x2 для оси абсцисс, y1 <= y2 для оси ординат.

Если на некоторую границу наложено последовательно несколько условий, то каждое из них приводит к изменению диапазона допустимых значений координат этой границы.

Например, пусть раздел Advanced Pre-Search Relations содержит следующие условия:

LeftBound > 5mm;

LeftBound < 15mm;

LeftBound < 10mm;

Пусть перед выполнением этих условий область поиска не ограничивалась. Тогда в случае, если описание одностраничное (допустимое минимальное и максимальное число страниц документа равно 1), она совпадает с прямоугольником страницы [PageRect.Left, PageRect.Top, PageRect.Right, PageRect.Bottom], а в общем многостраничном случае имеет максимальное значение [-INF, -INF, INF, INF]. Диапазоны координат границ элемента при этом имеют следующие значения:

Граница | Диапазон для одностраничных описаний | Диапазон для многостраничных описаний
LeftBound | [PageRect.Left, PageRect.Right] | [-INF, INF]
TopBound | [PageRect.Top, PageRect.Bottom] | [-INF, INF]
RightBound | [PageRect.Left, PageRect.Right] | [-INF, INF]
BottomBound | [PageRect.Top, PageRect.Bottom] | [-INF, INF]

После выполнения условия LeftBound > 5mm изменяется только левая граница, допустимый диапазон ее значений становится отрезком [5mm, PageRect.Right] для одностраничных описаний и [5mm, INF] для многостраничных описаний.

После выполнения условия LeftBound < 15mm диапазон значений левой границы становится отрезком [5mm, 15mm].

После выполнения условия LeftBound < 10mm диапазон значений левой границы становится отрезком [5mm, 10mm].

Аналогичным образом можно задать ограничения и на другие границы элемента.

Сформированные границы области поиска представляются программой в виде так называемого нечеткого прямоугольника.


Нечеткий прямоугольник

Нечеткий прямоугольник – это структура, описывающая класс прямоугольников с границами, лежащими в допустимых диапазонах значений. Нечеткий прямоугольник состоит из двух прямоугольников: внешнего и внутреннего.

В языке гибких описаний нечеткий прямоугольник представляется типом FuzzyRect.

Как можно видеть на рисунке ниже, в общем случае, когда заданы ограничения на все границы, в области поиска существует участок, который должен попасть внутрь любой гипотезы элемента. Этот участок и называется внутренним прямоугольником. Максимальный описывающий прямоугольник возможной гипотезы называется внешним прямоугольником.

Показать иллюстрацию

Пусть границы элемента заданы следующими интервалами:

LeftBound: [L1, L2], где L1 <= L2

TopBound: [T1, T2], где T1 <= T2

RightBound: [R1, R2], где R1 <= R2

BottomBound: [B1, B2], где B1 <= B2

Нечеткий прямоугольник, содержащий информацию о заданных границах, строится следующим образом: InternalRect: [L2, T2, R1, B1], ExternalRect: [L1, T1, R2, B2].

В случае, если пользователь не накладывает ограничений на границы области поиска, внутренний прямоугольник является вырожденным и не имеет геометрического смысла. При этом L1=R1, L2=R2, T1=B1, T2=B2.

Предположим теперь, что на область поиска не наложено вообще никаких условий. Тогда в случае, если допустимое минимальное и максимальное число страниц документа равно 1, нечеткий прямоугольник области поиска формируется следующим образом:

LeftBound: [PageRect.Left, PageRect.Right]

TopBound: [PageRect.Top, PageRect.Bottom]

RightBound: [PageRect.Left, PageRect.Right]

BottomBound: [PageRect.Top, PageRect.Bottom]

InternalRect: [PageRect.Right, PageRect.Bottom, PageRect.Left, PageRect.Top]

ExternalRect: [PageRect.Left, PageRect.Top, PageRect.Right, PageRect.Bottom]

иначе, в случае многостраничного документа:

LeftBound: [-INF, INF]

TopBound: [-INF, INF]

RightBound: [-INF, INF]

BottomBound: [-INF, INF]

InternalRect: [INF, INF, -INF, -INF]

ExternalRect: [-INF, -INF, INF, INF]

Как видно из приведенных выражений, внешний прямоугольник при этом совпадает с прямоугольником всей страницы, а внутренний прямоугольник является вырожденным и имеет отрицательные высоту и ширину.

Нечеткие прямоугольники можно объединять и пересекать. При пересечении двух нечетких прямоугольников пересекаются соответствующие границы прямоугольников: правая с правой, верхняя с верхней и т.п. Таким образом формируются новые интервалы границ:

LeftBound: [L1’, L2’]

TopBound: [T1’, T2’]

RightBound: [R1’, R2’]

BottomBound: [B1’, B2’]

Результирующий нечеткий прямоугольник пересечения формируется, как и прежде, на основе полученных интервалов: InternalRect: [L2’, T2’, R1’, B1’], ExternalRect: [L1’, T1’, R2’, B2’].

Если в результате пересечения не выполняется хотя бы одно из условий формирования нечеткого прямоугольника: L1 <= L2, T1 <= T2, R1 <= R2, B1 <= B2, то результирующий нечеткий прямоугольник обнуляется: InternalRect: [0, 0, 0, 0], ExternalRect: [0, 0, 0, 0]. Обычно создание пустого нечеткого прямоугольника является следствием противоречиво заданных условий, например, при попытке пересечь два нечетких прямоугольника, внешние границы которых не пересекаются.

Объединение нечетких прямоугольников происходит аналогично: для каждой границы сначала выполняется объединение интервалов. Результатом объединения двух интервалов является минимальный интервал, содержащий оба заданных интервала. После объединения на основе полученных новых границ строится новый нечеткий прямоугольник.

На практике наиболее часто встречаются нечеткие прямоугольники с вырожденным внутренним прямоугольником. Необходимость задать ограничение на определенную границу бывает лишь в редких случаях. Однако область поиска элемента всегда представляется нечетким прямоугольником и массивом исключенных прямоугольников, как того требует строгая типизация системы.


Функции, ограничивающие область поиска

Функции, перечисленные в таблице, могут использоваться только в разделе Advanced Pre-Search Relations элемента. Каждая из функций ограничивает нечеткий прямоугольник области поиска элемента или пополняет массив исключенных прямоугольников.

Функция | Описание
Void LeftOf( XInterval x, Distance offset = 0 ) | Ограничивает область поиска элемента прямоугольником, полученным как результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной слева от точки x.End – offset.
Void LeftOf( FuzzyRect fuzzyRect, Distance offset = 0 ) | Ограничивает область поиска элемента вертикальной полуплоскостью, расположенной слева от точки hyps.Left.End – offset.
Void LeftOf( Hypothesis hyp, Distance offset = 0 ) | Ограничивает область поиска элемента прямоугольником, полученным как результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной слева от точки hyp.Left.End – offset.
Void LeftOf( HypothesisInstances hyps, Distance offset = 0 ) | Ограничивает область поиска элемента вертикальной полуплоскостью, расположенной слева от точки hyps.Left.End – offset. Используются глобальные координаты.
Void RightOf( XInterval x, Distance offset = 0 ) | Ограничивает область поиска элемента прямоугольником, полученным как результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной справа от точки x.Start + offset. Пример Искать элемент правее центра элемента ElementName по горизонтали со смещением 100 dot. RightOf: MainGroup.NameHeader.Rect.XCenter + 100dt;
Void RightOf( FuzzyRect fuzzyRect, Distance offset = 0 ) | Ограничивает область поиска элемента вертикальной полуплоскостью, расположенной справа от точки hyp.Right.Start + offset. Пример Искать элемент правее области пересечения нечетких прямоугольников Element1 и Element2. FuzzyRect intersection = Element1.FuzzyRect AND Element2.FuzzyRect; RightOf: intersection;
Void RightOf( Hypothesis hyp, Distance offset = 0 ) | Ограничивает область поиска элемента прямоугольником, полученным как результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной справа от точки hyp.Right.Start + offset. Пример Искать элемент правее правой границы элемента ElementName со смещением 100 dot. Если элемент не будет найден, то смещение и поиск будет относительно ЛЕВОЙ границы области поиска данного элемента. RightOf: ElementName.Right, 100dt;
Void RightOf( HypothesisInstances hyps, Distance offset = 0 ) | Ограничивает область поиска элемента вертикальной полуплоскостью, расположенной справа от точки hyp.Right.Start + offset. Используются глобальные координаты.
Void Above( YInterval y, Distance offset = 0 ) | Ограничивает область поиска элемента прямоугольником, полученным как результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной выше от точки y.End – offset.
Void Above( FuzzyRect fuzzyRect, Distance offset = 0 ) | Ограничивает область поиска элемента горизонтальной полуплоскостью, расположенной выше точки hyp.top.End – offset.
Void Above( Hypothesis hyp, Distance offset = 0 ) | Ограничивает область поиска элемента прямоугольником, полученным как результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной выше точки hyp.Top.End – offset.
Void Above( HypothesisInstances hyps, Distance offset = 0 ) | Ограничивает область поиска элемента горизонтальной полуплоскостью, расположенной выше точки hyp.top.End – offset. Используются глобальные координаты.
Void Below( YInterval y, Distance offset = 0 ) | Ограничивает область поиска элемента прямоугольником, полученным как результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной ниже точки y.Start + offset.
Void Below( FuzzyRect fuzzyRect, Distance offset = 0 ) | Ограничивает область поиска элемента горизонтальной полуплоскостью, расположенной ниже точки hyp.Bottom.Start + offset.
Void Below( Hypothesis hyp, Distance offset = 0 ) | Ограничивает область поиска элемента прямоугольником, полученным как результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной ниже точки hyp.Bottom.Start + offset.
Void Below( HypothesisInstances hyps, Distance offset = 0 ) | Ограничивает область поиска элемента горизонтальной полуплоскостью, расположенной ниже точки hyp.Bottom.Start + offset. Используются глобальные координаты.
Void Exclude( Hypothesis hyp ) | Исключает из области поиска элемента регион гипотезы hyp. В случае, если гипотеза hyp является ненайденной, исключает внутренний прямоугольник области поиска гипотезы hyp. Пример Указываем программе, что из области поиска необходимо исключить элемент ElementName. Если элемент ElementName не будет найден, то при обращении к данной функции область поиска не изменится. Excude: ElementName;
Void Exclude( Rect rect ) | Исключает из области поиска элемента прямоугольник rect. Пример Указываем программе, что из области поиска необходимо исключить прямоугольник элемента ElementName. Если элемент ElementName не будет найден, то при обращении к данной функции из области поиска текущего элемента будет исключена область поиска элемента ElementName. Excude: ElementName.Rect;
Void Exclude( RectArray rectArray ) | Исключает из области поиска элемента массив прямоугольников rectArray. Пример Указываем программе, что из области поиска необходимо исключить прямоугольники элементов ElementName1, ElementName2 и ElementName3. Если какие-либо из элементов не будут найдены, то при обращении к данной функции из области поиска текущего элемента будут исключены области поиска соответствующих элементов. Exclude: RectArray(ElementName1.Rect or ElementName2.Rect or ElementName3.Rect);
Void ExcludeRect( XInterval left, YInterval top, XInterval right, YInterval bottom ) | Исключает из области поиска элемента нечеткий прямоугольник, ограниченный интервалами left, top, right, bottom слева, сверху, справа и слева соответственно. Пример Указываем программе, что из области поиска необходимо исключить прямоугольник с абсолютными размерами left = 10 dot, top= 200 dot, right=100 dot, bottom=400 dot. ExcludeRect: 10dt, 200dt, 100dt, 400dt;
Void ExcludeSet( ImageObjectSet set ) | Исключает из области поиска элемента массив прямоугольников набора объектов set. Пример Указываем программе, что из области поиска текущего элемента необходимо исключить массив прямоугольников набора объектов элемента ElementName. ExcludeSet: ElementName.Set;
Void Exclude( HypothesisInstances ) | Исключает из области поиска элемента регион набора гипотез.
Void RestrictSearchArea( FuzzyRect fuzzyRect ) | Ограничивает область поиска нечетким прямоугольником fuzzyRect. Используются глобальные координаты.
Void RestrictSearchArea( FuzzyRect, IntArray pages ) | Ограничивает область поиска нечетким прямоугольником fuzzyRect. Задаются локальные координаты и указывается набор страниц pages.
Void RestrictSearchArea( FuzzyRect, SearchAreaPageSetType ) | Ограничивает область поиска нечетким прямоугольником fuzzyRect. Задаются локальные координаты и указывается набор страниц типа SearchAreaPageSetType.
Void RestrictSearchArea( RectArray rectArray ) | Ограничивает область поиска массивом прямоугольников rectArray. Используются глобальные координаты. Пример Указываем программе, что границы области поиска текущего элемента определяются границами прямоугольников элементов ElementName1, ElementName2 и ElementName3. Если какие-либо из элементов не будут найдены, то при обращении к данной функции область поиска текущего элемента будет определяться границами областей поиска соответствующих элементов. RestrictSearchArea: RectArray(ElementName1.Rect or ElementName2.Rect or ElementName3.Rect);
Void RestrictSearchArea( RectArray, IntArray pages ) | Ограничивает область поиска массивом прямоугольников rectArray. Задаются локальные координаты и указывается набор страниц pages.
Void RestrictSearchArea( RectArray, SearchAreaPageSetType ) | Ограничивает область поиска массивом прямоугольников rectArray. Задаются локальные координаты и указывается набор страниц типа SearchAreaPageSetType.
Void RestrictSearchArea( Region region ) | Ограничивает область поиска регионом region. Используются глобальные координаты. Пример Указываем программе, что область поиска текущего элемента ограничивается регионом элемента ElementName. RestrictSearchArea: ElementName.Region;
Void RestrictSearchArea( Region, IntArray pages ) | Ограничивает область поиска регионом region. Задаются локальные координаты и указывается набор страниц pages.
Void RestrictSearchArea( Region, SearchAreaPageSetType ) | Ограничивает область поиска регионом region. Задаются локальные координаты и указывается набор страниц типа SearchAreaPageSetType. Пример Указываем программе, что поиск элемента должен производиться в области поиска на четных страницах. RestrictSearchArea: searchArea, EvenPages;
Void RestrictSearchArea( SearchAreaPageRestriction pageRestriction, IntArray pages ) | Ограничивает множество страниц, на которых должен производится поиск, не ограничивая область поиска на самих страницах. Параметр pageRestriction принимает единственное значение WholePage. Пример Указываем программе, что поиск элемента должен производиться на страницах 2, 4, 7-9. RestrictSearchArea: WholePage, 2 << 4 << 7 << 8 << 9;
Void RestrictSearchArea( SearchAreaPageRestriction pageRestriction, SearchAreaPageSetType ) | Ограничивает множество страниц, на которых должен производится поиск, не ограничивая область поиска на самих страницах. Параметр pageRestriction принимает единственное значение WholePage. Пример Указываем программе, что поиск элемента должен производиться на последней странице. RestrictSearchArea: WholePage, LastPage;
Замечание: Вместо полного имени функции RestrictSearchArea допускается использование сокращенного псевдонима RSA.

За мечание. Различные ограничения на одной странице используются совместно, а на разных страницах независимо (поиск происходит на страницах, для которых задано хотя бы одно ограничение).

Вспомогательные функции для задания области поиска

Rect PageRect() Прямоугольник текущей страницы в глобальных координатах, используемой для задания области поиска, зависящей от страницы.
Функцию PageRect можно использовать только для задания области поиска.

Пример.

Чтобы задать, что элемент находится в нижней половине страницы (но неизвестно какой), напишем:
Below: PageRect.Top + PageRect.Height / 2;

Во всех остальных случаях нужно использовать конструкцию Page( N ).Rect для получения прямоугольника страницы номера N или DocumentRect для прямоугольника всего документа. Кроме того, для задания области поиска, зависящей от страницы, можно использовать функцию PageNumber.
Int PageNumber() Номер текущей страницы. Используется для задания области поиска, зависящей от страницы.

Пример. Пусть есть повторяющийся элемент SearchElements.PageHeader. Для того, чтобы указать, что нужно искать на каждой странице ниже экземпляров этого элемента, запишем условие

Below: SearchElements.PageHeader.AllInstances.PageAreaGlobal( PageNumber ).FuzzyRect, 0 * dot;


Функции, формирующие нечеткий прямоугльник

Функции, формирующие нечеткий прямоугольник

Функция RestrictSearchArea( FuzzyRect fuzzyRect ), описанная в разделе Функции, ограничивающие область поиска, позволяет ограничить область поиска любым нечетким прямоугольником.

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

Функция | Описание
HorSearchAreaBound LeftBound() | Позволяет задать ограничение на левую границу области поиска. Выражения вида LeftBound() > XCoordinate при вычислении возвращают FuzzyRect
VertSearchAreaBound TopBound() | Позволяет задать ограничение на верхнюю границу области поиска. Выражения вида TopBound() > YCoordinate при вычислении возвращают FuzzyRect
HorSearchAreaBound RightBound() | Позволяет задать ограничение на левую границу области поиска. Выражения вида RightBound () > XCoordinate при вычислении возвращают FuzzyRect
VertSearchAreaBound BottomBound() | Позволяет задать ограничение на верхнюю границу области поиска. Выражения вида BottomBound () > YCoordinate при вычислении возвращают FuzzyRect
FuzzyRect AreaLeftOf( XInterval x, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся вертикальной полуплоскостью, расположенной слева от точки x.End – offset.
FuzzyRect AreaLeftOf( FuzzyRect rect, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся вертикальной полуплоскостью, расположенной слева от точки rect.Left.End – offset.
FuzzyRect AreaLeftOf( Hypothesis hyp, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся вертикальной полуплоскостью, расположенной слева от точки hyp.Rect.Left.End – offset.
FuzzyRect AreaLeftOf( HypothesisInstances hyps, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся вертикальной полуплоскостью, расположенной слева от точки hyps.Rect.Left.End – offset.
FuzzyRect AreaRightOf( XInterval x, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся вертикальной полуплоскостью, расположенной справа от точки x.Start + offset.
FuzzyRect AreaRightOf( FuzzyRect rect, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся вертикальной полуплоскостью, расположенной справа от точки rect.Right.Start + offset.
FuzzyRect AreaRightOf( Hypothesis hyp, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся вертикальной полуплоскостью, расположенной справа от точки hyp.rect.Right.Start + offset.
FuzzyRect AreaRightOf( HypothesisInstances hyps, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся вертикальной полуплоскостью, расположенной справа от точки hyp.Rect.Right.Start + offset.
FuzzyRect AreaAbove( YInterval y, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся горизонтальной полуплоскостью, расположенной сверху от точки y.End - offset.
FuzzyRect AreaAbove( FuzzyRect rect, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся горизонтальной полуплоскостью, расположенной сверху от точки rect.Top.End - offset.
FuzzyRect AreaAbove( Hypothesis hyp, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся горизонтальной полуплоскостью, расположенной сверху от точки hyp.rect.Top.End - offset.
FuzzyRect AreaAbove( HypothesisInstances hyps, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся горизонтальной полуплоскостью, расположенной выше точки hyp.Rect.top.End - offset.
FuzzyRect AreaBelow ( YInterval y, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся горизонтальной полуплоскостью, расположенной снизу от точки y.Start + offset.
FuzzyRect AreaBelow ( FuzzyRect rect, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся горизонтальной полуплоскостью, расположенной снизу от точки rect.Bottom.Start + offset.
FuzzyRect AreaBelow ( Hypothesis hyp, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся горизонтальной полуплоскостью, расположенной снизу от точки hyp.rect.Bottom.Start + offset.
FuzzyRect AreaBelow ( HypothesisInstances hyps, Distance offset = 0 ) | Возвращает нечеткий прямоугольник в глобальных координатах, являющийся горизонтальной полуплоскостью, расположенной ниже точки hyp.Rect.Bottom.Start + offset.
FuzzyRect ImageLeftOf( XInterval x, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной слева от точки x.End – offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaLeftOf( XInterval x, Distance offset = 0 )
FuzzyRect ImageLeftOf( FuzzyRect rect, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной слева от точки rect.Left.End – offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaLeftOf( FuzzyRect rect, Distance offset = 0 )
FuzzyRect ImageLeftOf( Hypothesis hyp, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной слева от точки hyp.Rect.Left.End – offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaLeftOf( Hypothesis hyp, Distance offset = 0)
FuzzyRect ImageRightOf( XInterval x, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной справа от точки x.Start + offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaRightOf( XInterval x, Distance offset = 0 )
FuzzyRect ImageRightOf( FuzzyRect rect, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной справа от точки rect.Right.Start + offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaRightOf( FuzzyRect rect, Distance offset = 0 )
FuzzyRect ImageRightOf( Hypothesis hyp, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с вертикальной полуплоскостью, расположенной справа от точки hyp.rect.Right.Start + offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaRightOf( Hypothesis hyp, Distance offset = 0)
FuzzyRect ImageAbove( YInterval y, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной сверху от точки y.End - offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaAbove( YInterval y, Distance offset = 0 )
FuzzyRect ImageAbove( FuzzyRect rect, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной сверху от точки rect.Top.End - offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaAbove( FuzzyRect rect, Distance offset = 0 )
FuzzyRect ImageAbove( Hypothesis hyp, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной сверху от точки hyp.rect.Top.End - offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaAbove( Hypothesis hyp, Distance offset = 0 )
FuzzyRect ImageBelow( YInterval y, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной снизу от точки y.Start + offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaBelow( YInterval y, Distance offset = 0 )
FuzzyRect ImageBelow( FuzzyRect rect, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной снизу от точки rect.Bottom.Start + offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaBelow( FuzzyRect rect, Distance offset = 0 )
FuzzyRect ImageBelow( Hypothesis hyp, Distance offset = 0 ) | Возвращает нечеткий прямоугольник, результат пересечения прямоугольника страницы с горизонтальной полуплоскостью, расположенной снизу от точки hyp.rect.Bottom.Start + offset. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка. Для многостраничного документа можно использовать функцию FuzzyRect AreaBelow( Hypothesis hyp, Distance offset = 0 )


Отладочные функции, возвращающие информацию о заданной области поиска

Перечисленные функции доступны только в разделе Advanced Pre-Search Relations.

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

Функция | Описание
FuzzyRect SearchArea() | Сформированная область поиска, нечеткий прямоугольник. Read-Only
RectArray ExcludedRects() | Массив прямоугольников, исключенный из области поиска элемента. Read-Only
PageArea PageSearchAreaLocal( Int PageNumber ) | Возвращает область поиска, пересеченную с данной страницей, в локальных координатах страницы.
PageArea PageSearchAreaGlobal( Int PageNumber ) | Возвращает область поиска, пересеченную с данной страницей, в глобальных координатах.

Пример

Вывести на печать область поиска элемента.

Для этого в разделе Advanced pre-search relations для выбранного элемента необходимо набрать следующий код:
Print: Str(SearchArea); или что то же самое Print: Str(SearchArea ());

Функция Str необходима для преобразования к строковому виду результатов выполнения данного запроса в целях печати. Результат (сведения о координатах и размере нечеткого прямоугольника выбранного элемента InternalRect и ExternalRect) будет выведен в окне Properties. Для того чтобы его увидеть, следует выделить курсором соответствующий элемент в дереве гипотез, а затем подвести курсор к строке Pre-search print в окне Properties. Значение Value в строке Pre-search print может не отобразиться целиком, но в окне Pre-search print, находящемся непосредственно под окном Properties результат вывода на печать доступен полностью.

Замечание. При выводе на печать результатов обращения к функции ExcludedRects (Print: Str(ExcludedRects());) доступ к результату также осуществляется при выборе строки Pre-search print в окне Properties.


Функции группы Nearest

Функции группы Nearest указывают программе, что из нескольких гипотез элемента при прочих равных условиях необходимо искать ближайшую к некоторому элементу или точке на изображении, заданной параметрами функции Nearest. В секции Advanced pre-search relations элемента можно использовать только одну функцию из группы Nearest. После ее срабатывания из нескольких рассматриваемых гипотез остается только одна, причем это происходит на этапе выдвижения гипотез элемента, т.е до выполнения кода, указанного в секции Advanced post-search relations. Подробнее см. Использование функций Nearest и FuzzyQuality для поиска элементов.

Функции группы Nearest используются для выбора гипотез всех элементов, кроме Групп, Повторяющихся групп и Таблиц.

Имя параметра | Описание
Void NearestX( XCoordinate x ) Задает условие выбора гипотезы, ближайшей к вертикальной прямой, проходящей через точку ( x, 0 )

Пример
Для поиска текущего элемента укажем, что он является ближайшим по горизонтали к правой границе элемента ElementName.
NearestX: ElementName.Right.Start;

Void NearestY( YCoordinate y ) Задает условие выбора гипотезы, ближайшей к горизонтальной прямой, проходящей через точку ( 0, y )

Пример
Для поиска текущего элемента укажем, что он является ближайшим по вертикали к верхней границе элемента ElementName.
NearestY: ElementName.Top.Start;
Void Nearest ( Xinterval x, YInterval y )

Void Nearest( XInterval x, YInterval y ) Задает условие выбора гипотезы, ближайшей к прямоугольнику Rect( x.Start, y.Start, x.End, y.End )

Пример 1
Для поиска текущего элемента укажем, что он является ближайшим к центру элемента ElementName.
Nearest: ElementName.XCenter, ElementName.YCenter;

Пример 2
Для поиска текущего элемента укажем, что он является ближайшим к центру первой страницы Nearest: Page( 1 ) .RectGlobal.XCenter, Page( 1 ) .RectGlobal.YCenter;

Void Nearest( PageEdge ) Задает условие выбора на каждой странице документа гипотезы, ближайшей к какому-либо краю страницы: верхнему, нижнему, правому, левому.

Замечание. В случае равноудаленности гипотез от заданной границы, могут буть выбраны несколько гипотез.

Пример
Для поиска текущего элемента укажем, что он является ближайшим к нижнему краю страницы.
Nearest: PageBottom;

Void Nearest( Hypothesis hyp ) Задает условие выбора гипотезы, ближайшей к нечеткому прямоугольнику hyp.Rect

Пример
Для поиска текущего элемента укажем, что он является ближайшим к элементу ElementName.
Nearest: ElementName;

Void Nearest( HypothesisInstances ) | Задает условие выбора гипотезы, ближайшей к набору гипотез элемента RepeatableGroup.


Управление качеством гипотезы

Определение | Описание
Quality Quality( Real ) | Задает штрафующий коэффициент, на который домножается качество гипотезы элемента.
Quality FuzzyQuality( Int value, IntFuzzyInterval interval ) | Задает функцию для вычисления штрафующего коэффициента, на который домножается качество гипотезы элемента. Функция вычисляется как результат попадания величины value в нечеткий интервал interval. Подробнее об использовании функции FuzzyQuality см. в разделе Советы и рекомендации/Использование функций Nearest и FuzzyQuality для поиска элементов .
Quality FuzzyQuality( DistInterval value, DistFuzzyInterval interval ) | Задает функцию для вычисления штрафующего коэффициента, на который домножается качество гипотезы элемента. Функция вычисляется как результат попадания величины value в нечеткий интервал interval. Подробнее об использовании функции FuzzyQuality см. в разделе Советы и рекомендации/Использование функций Nearest и FuzzyQuality для поиска элементов.


Задание свойств элементов

На закладке Advanced в разделе Advanced pre-search relations можно редактировать свойства элемента, если это необходимо. Это относится как к свойствам, которые пользователь устанавливает в диалоге свойств элемента, так и некоторым дополнительным свойствам. Далее приводится список свойств элементов, которые можно редактировать в разделе Advanced pre-search relations.

Замечание. Все свойства, заданные на первых трех закладках (до закладки Advanced) диалога Properties любого элемента, интерпретируются компилятором FlexiLayout Studio как последовательность операторов, представляющих собой параметры (свойства) соответствующих элементов, описанные ниже в данном разделе. Для того чтобы посмотреть, как выглядит сформированный код, следует нажать кнопку Code на закладке Advanced.

Отображенные на закладке Code свойства можно копировать и редактировать нужным вам образом в секции Advanced pre-search relations на закладке Advanced, а также использовать для написания собственного кода с использованием операторов условий if then else.

Пример

Проверим нахождение элементов Element1 и Element2. Если хотя бы один из них найден, укажем программе, что надо искать вертикальный разделитель. Иначе – будем искать горизонтальный разделитель.
If (Element1.IsNull == False) or (Element2.IsNull == False) then
Mode: Vertical;
Else
Mode: Horizontal;
Описание свойств элементов приведены в соответствующих разделах ниже.


Элемент Object Collection

Имя параметра | Описание
Void Type( ImageObjectType ) | Выставляет значение свойства Type, если на закладке Object Collection данного элемента были установлены какие-либо другие типы объектов, они не будут приниматься в расчет после вызова данной функции. См. диалог Свойства элемента Object Collection, закладка Object Collection, Type. Пример Задаем список типов объектов штрих-коды и картинки для текущего элемента Object Collection Type: BarcodeObject + PictureObject; или что то же самое Type (BarcodeObject + PictureObject); После обращения к данному свойству в области поиска элемента могут быть найдены все объекты типа Barcode и Picture.
Void MinObjHeight( Distance ) | См. диалог Свойства элемента Object Collection, закладка Object Collection, Min height Вы можете задавать размер в любых единицах измерения. Пример Установим минимальную высоту искомых объектов элемента Object Collection равной 10 мм. MinObjHeight (10mm);
Void MaxObjHeight( Distance ) | См. диалог Свойства элемента Object Collection, закладка Object Collection, Max height Вы можете задавать размер в любых единицах измерения.
Void MinObjWidth( Distance ) | См. диалог Свойства элемента Object Collection, закладка Object Collection, min Width Вы можете задавать размер в любых единицах измерения.
Void MaxObjWidth( Distance ) | См. диалог Свойства элемента Object Collection, закладка Object Collection, Max width Вы можете задавать размер в любых единицах измерения.
Void WholeWordMode ( Logic ) | Флаг определяет, нужно ли рассматривать в качестве гипотез только целые текстовые объекты. Если установлено значение True, то гипотезы, состоящие из частей слов, не рассматриваются. По умолчанию имеет значение False. Замечание. Ограничения по высоте и ширине для искомых текстовых объектов применяются в зависимости от значения флага к словам (значение True), или отдельным символам (значение False).
Void UseRawText( Logic ) | Позволяет использовать при поиске среди текста нераспознанные текстоподобные объекты, которым при предраспознавании был присвоен тип Raw Text. Для включения данного режима необходимо вызвать метод с параметром True. По умолчанию используется только распознанный текст (значение False).
Void MaxXOutsidePart( Real ) | Задает часть объекта, которая может выступать по горизонтали за пределы области поиска. Принимает значение от 0 до 1. В гипотезу попадают объекты, выступающие за область поиска на указанную либо меньшую часть.
Void MaxYOutsidePart( Real ) | Задает часть объекта, которая может выступать по вертикали за пределы области поиска. Принимает значение от 0 до 1. В гипотезу попадают объекты, выступающие за область поиска на указанную либо меньшую часть.


Элемент Character String

Имя параметра | Описание
Void AllowEmbeddedHypotheses( Logic ) см. диалог Свойства элемента Character String, закладка Character String, Allow embedded hypotheses

Пример
Укажем программе, что надо сформировать только самую длинную гипотезу.
AllowEmbeddedHypotheses (False);

Void MinQuality( Real ) Задает минимально допустимое качество рассматриваемой гипотезы

Пример
Укажем программе, что гипотезы с качеством ниже 0,95 должны игнорироваться.
MinQuality: 0.95;

Void MaxNonDefinedCount( Real ) см. Свойства элемента Character String, закладка Character String, Persantage of non-alphabet characters

Пример
Укажем программе, что в строке может быть не более 30% символов, не принадлежащих ни к одному из указанных алфавитов.
MaxNonDefinedCount (0.3);

Void MaxWordBreakCount( Real ) | Максимальное число концов слов внутри строки. Деление на слова осуществляется в соответствии с параметром Detect words by interword space(см. диалог Свойства элемента Character String, закладка Character String. Параметр задается как отношение [число концов слова]/[число символов в цепочке].
Void MinInterwordSpace( Distance ) | Включение режима разбиения на слова по ширине пробела (см. диалог Свойства элемента Character String, закладка Character String, опция Detect words by interword space и установка минимальной ширины пробела (параметр Min interword space) в значение Distance.
Void WordsCount( Int, Int, Int, Int ) | см. диалог Свойства элемента Character String, закладка Character String, Words count
Void TotalChainLength( Int, Int, Int, Int ) см. диалог Свойства элемента Character String, закладка Character String, Characters count

Пример
Укажем программе что искать надо строку, длина которой может быть от 5 до 10 символов.
TotalChainLength (4, 5, 10, 11);

Void TotalGapLength( Distance, Distance, Distance, Distance ) | Позволяет задать максимально допустимую суммарную абсолютную длину пробелов внутри цепочки. Задается как нечеткий интервал. Оценивает качество гипотезы в зависимости от суммарной длины пробелов.
Void MaxGapInLine( Distance ) Задает максимально допустимое расстояние между соседними символами

При формировании гипотезы символы добавляются в гипотезу до тех пор, пока расстояние между соседними символами не превышает значения MaxGapInLine.
см. также диалог Свойства элемента Character String, закладка Character String, Max space length

Пример
Укажем программе, что максимальное расстояние между соседними символами в искомой строке не должно превышать 5 мм, иначе будет сформирована нулевая гипотеза.
MaxGapInLine (5mm);

Void MaxRelativeGapInLine( Real ) | Максимальное расстояние между соседними символами в процентах от высоты строки.
Void AllowChoppedWords( Logic ) | Флаг определяет, нужно ли рассматривать текстовые объекты, выходящие за правую или левую границу области поиска. По умолчанию имеет значение True.
Void MaxXOutsidePart( Real ) | Задает часть символа, которая может выступать по горизонтали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void MaxYOutsidePart( Real ) | Задает часть символа, которая может выступать по вертикали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void AddAlphabet( String alphabet, Real portion, Logic isRestrictionStrong ) Задает алфавит (alphabet) и допустимую долю (portion) символов этого алфавита в гипотезе. Флаг isRestrictionStrong определяет поведение в случае, если количество символов алфавита превышает допустимую долю: True - при превышении гипотеза отбрасывается, False - лишние символы рассматриваются как не относящиеся ни к одному алфавиту. По умолчанию флаг имеет значение True.

Пример
Добавим алфавит, состоящий из символов №, #, % и *, доля которых в гипотезе не может превышать 10%.
Замечание. Добавить можно только символы, не входящие ни в один из уже имеющихся алфавитов, определенных для текущего элемента.
AddAlphabet ("№#%*", 0.1, True);

Void RegularExpression( String ) Задает регулярное выражение, которому должен соответствовать текст гипотезы.

Пример
Составим регулярное выражение для поиска строки, в которой символы могут располагаться в виде одного из двух наборов: 2 цифры, - (дефис), 1 цифра или буква N, цифра от 1 до 5, / (слэш), от одной до 3 цифр.
RegularExpression: ("([0-9]{2}[-][0-9])|([N][1-5][/][0-9]{1-3})");
или, что то же самое:
RegularExpression: ("([0-9]{2}\"-\"[0-9])|(\"N\"[1-5]\"/\"[0-9]{1-3})");

Void WholeWordMode ( Logic ) Флаг определяет, нужно ли рассматривать в качестве гипотез только целые слова. Если имеет значение True, то гипотезы, состоящие из частей слов, не рассматриваются. По умолчанию имеет значение False.
Замечание. Отличие данного свойства от свойства AllowedChoppedWords заключается в том, что свойство AllowChoppedWords влияет только на форматирование гипотез из слов, находящихся на границе области поиска, тогда как свойство WholeWordMode влияет на формирование всех гипотез.
Void RegularExpressionFromDB( String connectionString, String selectString, Int maxRecordsCount = 1000 ) | Задает регулярное выражение, которому должен соответствовать текст гипотезы, с помощью базы данных. (См. Использование баз данных и текстовых файлов в языке гибких описаний.) Аргумент connectionString задает строку соединения для открытия базы данных. Аргумент selectString задает SQL-запрос, начинающийся с команды SELECT. Для ускорения поиска рассматриваются только первые maxRecordsCount вариантов (по умолчанию 1000).
Void RegularExpressionFromFile( String fileName, Int maxRecordsCount = 1000 ) | Задает регулярное выражение, которому должен соответствовать текст гипотезы, с помощью текстового файла. (См. Использование баз данных и текстовых файлов в языке гибких описаний.) Аргумент fileName задает имя текстового файла. Для ускорения поиска рассматриваются только первые maxRecordsCount вариантов (по умолчанию 1000).
Void Width( Distance, Distance, Distance, Distance ) | Ширина гипотезы в виде нечеткого интервала.
Void Height( Distance, Distance, Distance, Distance ) | Высота гипотезы в виде нечеткого интервала.


Элемент Static Text

Имя параметра | Описание
Void MinQuality( Real ) | Задает минимально допустимое качество рассматриваемой гипотезы
Void MaxErrors( Int ) Задает максимально допустимое абсолютное число ошибок в тексте

Свойства элемента Static Text, закладка Static Text, Max number of errors

Void MaxErrorsPart( Real ) Задает максимально допустимое относительное число ошибок в тексте

Свойства элемента Static Text, закладка Static Text, Max error percentage

Void MaxErrors( Int number, Real part ) Задает максимально допустимое число ошибок в тексте: number – абсолютное, part – относительное

Пример
Укажем программе, что абсолютное число ошибок в искомом тексте не может превысить 3, а относительное 20%.
MaxErrors (3, 0.2);
Замечание. Реально сработает то условие, которое окажется строже для конкретной ситуации.

Void MaxGapInLine( Distance ) Задает максимально допустимое расстояние между соседними символами.

При формировании гипотезы символы добавляются в гипотезу до тех пор, пока расстояние между соседними символами не превышает значения MaxGapInLine.

Пример
Укажем программе, что максимальное расстояние между соседними символами данного элемента не должно превышать 5 мм, иначе будет сформирована нулевая гипотеза.
MaxGapInLine (5mm);

Void MaxRelativeGapInLine( Real ) | Максимальное расстояние между соседними символами в процентах от высоты строки.
Void AllowChoppedWords( Logic ) Флаг определяет, нужно ли рассматривать текстовые объекты, выходящие за правую или левую границу области поиска. По умолчанию имеет значение True.

Пример
Укажем программе, что надо искать элемент только среди текстовых объектов, целиком попавших в область поиска.
AllowChoppedWords (False);

Void MaxXOutsidePart( Real ) | Задает часть символа, которая может выступать по горизонтали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void MaxYOutsidePart( Real ) | Задает часть символа, которая может выступать по вертикали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.

Void CaseSensitive( Logic Value=true)

Учет различия заглавных и строчных букв (регистра). Если установлено значение True, заглавные и строчные буквы считаются различными.
Void IgnoreAccents( Logic value = true ) | Игнорирование при поиске диакритических символов. Если установлено значение True, диакритические символы игнорируются. Таким образом, слова "тяжёлый", "тяжелый", "тяжёлыи" и "тяжелыи" будут считаться идентичными.
Void SearchTextFromDB( String connectionString, String selectString, Int maxRecordsCount = 1000 )

Задает набор текстовых строк для поиска на изображении с помощью базы данных (см. Использование баз данных и текстовых файлов в языке гибких описаний.) Аргумент connectionString задает строку соединения с базой данных. Аргумент selectString задает SQL-запрос, начинающийся с команды SELECT. Результирующее множество этого запроса, которое должно содержать только одно поле, задает варианты фраз. Для ускорения поиска рассматриваются только первые maxRecordsCount вариантов (по умолчанию 1000).

Пример:
SearchTextFromDB: "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=D:\\FCS\\DBKeywords.mdb", "SELECT Words FROM WordsTable", 500;
Void SearchTextFromFile( String fileName, Int maxRecordsCount = 1000 )

Задает набор текстовых строк для поиска на изображении с помощью текстового файла fileName, в котором перечислены варианты фраз. (См. Использование баз данных и текстовых файлов в языке гибких описаний.) Для ускорения поиска рассматриваются только первые maxRecordsCount вариантов (по умолчанию 1000).

Пример:
SearchTextFromFile: "Keywords.txt", 500;
Int KeywordsCount( ) | Возвращает количество ключевых слов в строке, заданной в SearchText, которой соответсвут найденная строка.
String Keyword( Int index ) | Возвращает ключевое слово по его индексу в строке, заданной в SearchText, которой соответсвут найденная строка. Индексация начинается с нуля.
Следующие методы доступны только в случае, если искомый текст состоит из одного слова
Void SearchText ( String ) | Искомый текст
Следующие методы доступны только в случае, если искомый текст состоит из нескольких слов
Void NextLinePenalty( Real ) | см. диалог Свойства элемента Static Text, закладка Static Text, Line break penalty
Void OmissionPenalty( Real ) | см. диалог Свойства элемента Static Text, закладка Static Text, Missing word penalty
Void WholeWordMode ( Logic ) Флаг определяет, нужно ли рассматривать в качестве гипотез только целые текстовые объекты. Если имеет значение True, то гипотезы, состоящие из частей слов, не рассматриваются. По умолчанию имеет значение False.
Замечание. Отличие данного свойства от свойства AllowedChoppedWords заключается в том, что свойство AllowChoppedWords влияет только на форматирование гипотез из слов, находящихся на границе области поиска, тогда как свойство WholeWordMode влияет на формирование всех гипотез.
Void AllowEmbeddedHypotheses( Logic )

Пример
Укажем программе, что надо сформировать только самую длинную гипотезу.
AllowEmbeddedHypotheses (False);
Void MaxLineBreakDistance( Distance ) | Расстояние, на которое может отстоять слово в последующей строке по отношению к предыдущей.


Элемент Paragraph

Имя параметра | Описание
Void MaxGapInLine( Distance ) | Задает максимальное расстояние между символами.
Void AllowChoppedWords( Logic ) Флаг определяет, нужно ли рассматривать текстовые объекты, выходящие за правую или левую границу области поиска.

Пример
Укажем программе, что можно искать элемент среди текстовых объектов, которые частично попали в область поиска.
AllowChoppedWords (True);

Void MinQuality( Real ) | Задает минимально допустимое качество рассматриваемой гипотезы
Void MaxXOutsidePart( Real ) | Задает часть символа, которая может выступать по горизонтали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void MaxYOutsidePart( Real ) | Задает часть символа, которая может выступать по вертикали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void IgnoreSeparators( Logic ) | Игнорирование сепараторов при поиске абзаца. Если имеет значение True, абзацы, содержащие сепараторы, не разбиваются.
Void MinLineWidth( Distance ) | Минимальная ширина строки. Учитывается при склеивании строк. Строки, не удовлетворяющие заданному условию, исключаются.
Void MaxLineWidth( Distance ) | Максимальная ширина строки. Учитывается при склеивании строк. Строки, не удовлетворяющие заданному условию, исключаются.
Void MinLinesCount( Int ) | Минимальное число строк в абзаце.
Void MaxLinesCount( Int ) | Максимальное число строк в абзаце. Учитывается при сборке абзаца. Если число строк достигает максимальное значение, абзац не продолжается.
Void Alignment ( TextAlignment ) Определяет тип выравнивания. Учитывается после сборки абзаца. Неправильно выровненные абзацы исключаются целиком. Допустимые значения:
  • Alignment_None - выравнивание не проверяется
  • Alignment_Left - выравнивание по левому краю
  • Alignment_Right - выравнивание по правому краю
  • Alignment_Justified - выравнивание по левому и правому краю
  • Alignment_Center - выравнивание по центру
Void MaxAlignmentError( Distance ) | Допустимая ошибка при выравнивании. Вычисляется как разница между максимальной и минимальной координатой соответствующего края строки (в зависимости от заданного типа выравнивания).
Void AllowFirstLineIndent( Logic ) | Определяет, может ли первая строка иметь отступ. При значении True первая строка может иметь отступ, если выбрано выравнивание Alignment_Left, Alignment_Right или Alignment_Justified. Для выравнивания Alignment_Left и Alignment_Justified разрешается отступ с левого края. Для Alignment_Right - с правого.
Void MaxFirstLineIndent( Distance ) | Максимальная величина отступа первой строки. Если задано отрицательное значение, строка может иметь обратный отступ (выступ).
Void AllowLastHangingLine( Logic ) | Определяет, может ли абзац заканчивать короткой строкой. При значении True последняя строка абзаца может быть сколь угодно короткой.
Void MaxInterlineSpace( Distance ) | Максимальное расстояние между строками.
Void MaxRelativeInterlineSpace( Real ) | Максимальное расстояние между двумя строками в процентах от высоты верхней строки.
Void MaxLineHeightSpread( Real ) | Максимальное отклонение высоты строк. Отношение разности высот самой высокой и самой низкой строки к высоте самой высокой строки.
Void MaxLineLengthSpread( Real ) | Максимальное отклонение длины строк. Отношение разности длин самой длинной и самой короткой строки к длине самой длинной строки.
Void MinHorLineOverlap( Real ) | Минимальное совпадение соседних строк по горизонтали. Рассчитывается как отношение длины общей части строк к длине короткой строки.
Void LinesCount( IntFuzzyInterval ) | Количество строк в абзаце.
Void FragmentWidth( IntFuzzyInterval ) | Ширина абзаца (в символах).
Void MaxLineHeight( Distance ) | Максимальная высота символов (размер шрифта).
Void MinLineHeight( Distance ) | Минимальная высота символов (размер шрифта).
Void MaxRelativeGapInLine( Real ) | Максимальное расстояние между соседними символами в процентах от высоты строки.
Void FilterStamp( Logic ) | см. диалог Свойства элемента Paragraph, закладка Paragraph, Remove stamp


Элемент Separator

Имя параметра | Описание
Void Mode( Direction ) Ориентация разделителя (Horizontal или Vertical)

Пример
Укажем программе, что искомый разделитель имеет горизонтальную ориентацию.
Mode: Horizontal;

См. диалог Свойства элемента Separator, закладка Separator, Orientation

Void MinQuality( Real ) | Задает минимально допустимое качество рассматриваемой гипотезы.
Void MinRelativeLength ( Real ) Задает минимально допустимую длину участка разделителя, попавшего в область поиска, по отношению к длине области поиска.

См. диалог Свойства элемента Separator, закладка Separator, Min relative length

Void PenaltyLimitForLength( Real ) Позволяет задать минимальное качество, которое при вычислении оценки качества гипотеза может получить за длину (число от 0 до 1). Чем длиннее объект-разделитель, тем выше качество гипотезы. Самое высокое качество, равное 1, имеет разделитель, длина которого равна длине области поиска. При уменьшении относительной длины разделителя от 1 до 0 качество гипотезы падает прямо пропорционально от 1 до PenaltyLimitForLength.
Замечание. Данная функция введена вместо функции Void MaxPenalty( Real ), которая является устаревшей и будет удалена в следующих версиях. Если вы ранее использовали Max length penalty, то следует задавать PenaltyLimitForLength равным (1 - [Max length penalty]).
См. диалог Свойства элемента Separator, закладка Separator, Penalty limit for length
Void MinSeparatorLength( Distance ) | См. диалог Свойства элемента Separator, закладка Separator, Min length
Void MaxSeparatorLength( Distance ) | См. диалог Свойства элемента Separator, закладка Separator, Max length
Void MaxSeparatorGap( Distance ) См. диалог Свойства элемента Separator, закладка Separator, Space, Max length

Пример
Укажем программе, чтобы горизонтальные разделители, находящиеся на одном уровне по горизонтали, воспринимались как единый разделитель, если расстояние между ними не превысит 20 dot.
Mode: Horizontal;
MaxSeparatorDistance (0mm);
MaxSeparatorGap(20dt);

Void MaxSeparatorRelativeGap( Real ) | См. диалог Свойства элемента Separator, закладка Separator, Space, Max relative length
Void MaxSeparatorGap( Distance, Real ) | Задает как абсолютное (), так и относительное ограничение на длину пробела. См. диалог Свойства элемента Separator, закладка Separator, Space, Max length
Void MaxSeparatorDistance( Distance ) См. диалог Свойства элемента Separator, закладка Separator, Space, Orthogonal shift

Пример
Укажем программе, чтобы горизонтальные разделители, находящиеся друг от друга на расстоянии не более 1 мм по вертикали, воспринимались как единый разделитель.
Mode: Horizontal;
MaxSeparatorDistance (1mm);

Void FitsWithinSearchArea( Logic ) Указывает, что разделитель должен полностью находиться в области поиска.

См. диалог элемента Separator, свойство Fits entirely within search area


Элемент White Gap

Имя параметра | Описание
Void Mode( Direction ) | Ориентация просвета. См. диалог Свойства элемента White Gap, закладка White Gap, Orientation, а также описание свойств элемента White Gap в разделе Формирование и оценка гипотез для элемента White Gap. Пример Укажем программе, что искомый просвет имеет вертикальную ориентацию. Mode: Vertical;
Void RelativeGapLevel( Real ) | См. диалог Свойства элемента White Gap, закладка White Gap, Relative upper threshold, а также описание свойств элемента White Gap в разделе Формирование и оценка гипотез для элемента White Gap.
Void MaxGapLevel( Distance ) | См. диалог Свойства элемента White Gap, закладка White Gap, Upper threshold, а также описание свойств элемента White Gap в разделе Формирование и оценка гипотез для элемента White Gap. Пример Укажем программе, что порог гипотезы просвета не может превысить 150 dot. MaxGapLevel (150dt);
Void MinGapLevel( Distance ) | См. диалог Свойства элемента White Gap, закладка White Gap, Lower threshold, а также описание свойств элемента White Gap в разделе Формирование и оценка гипотез для элемента White Gap.
Void MinGapWidth( Distance ) | См. диалог Свойства элемента White Gap, закладка White Gap, Min width/height, а также описание свойств элемента White Gap в разделе Формирование и оценка гипотез для элемента White Gap. Пример Укажем программе, что минимальная высота искомого горизонтального просвета 50 dot. Mode: Horizontal; MinGapWidth (50dt);
Void Type( ImageObjectType ) | Позволяет искать просвет среди объектов определенного типа. (По умолчанию просвет ищется среди любых объектов, найденных на изображении.) Пример Укажем программе, что надо искать просвет только среди текста. Type: AnyText+InvertedTextObject;
Void UseRawText( Logic ) | Позволяет использовать при поиске среди текста нераспознанные текстоподобные объекты, которым при предраспознавании был присвоен тип Raw Text. Для включения данного режима необходимо вызвать метод с параметром True. По умолчанию используется только распознанный текст (значение False).

Подробнее

Формирование и оценка гипотез для элемента White Gap


Элемент Barcode

Имя параметра | Описание
Void Type( BarcodeTypes ) | См. диалог Свойства элемента Barcode, закладка Barcode, Barcode Type. Пример Укажем программе, что искомый штрих-код имеет тип Interleaved 25. Type: BarcodeType_Interleaved25; Void Orientation( BarcodeOrientations )
Void Orientation( BarcodeOrientations ) | См. диалог Свойства элемента Barcode, закладка Barcode, Orientation. Пример Укажем программе, что искомый штрих-код имеет ориентацию слева направо. Orientation: BarcodeOrientation_LeftToRight;
Void MaxXOutsidePart( Real ) | Задает часть объекта, которая может выступать по горизонтали за пределы области поиска. Принимает значение от 0 до 1. В гипотезу попадают объекты, выступающие за область поиска на указанную либо меньшую часть.
Void MaxYOutsidePart( Real ) | Задает часть объекта, которая может выступать по вертикали за пределы области поиска. Принимает значение от 0 до 1. В гипотезу попадают объекты, выступающие за область поиска на указанную либо меньшую часть.


Элемент Date

Имя параметра | Описание
Void DateFormat( DateFormats ) | См. диалог Свойства элемента Date, закладка Date, Format, Date. Пример Укажем программе, что искомая дата должна иметь формат месяц, день, год DateFormat: MonthDayYear;
Void Language( String ) | См. диалог Свойства элемента Date, закладка Date, Language
Void MinQuality( Real ) | Задает минимально допустимое качество рассматриваемой гипотезы
Void Separators( String ) | См. диалог Свойства элемента Date, закладка Date, Separators. Пример Укажем программе, что искомая дата в качестве разделителей полей даты может содержать точку (.) или слэш (/). Separators: "./";
Void DayFormat( DayFormatVariants ) | См. диалог Свойства элемента Date, закладка Date, Format, Day
Void MonthFormat( MonthFormatVariants ) | См. диалог Свойства элемента Date, закладка Date, Format, Month. Пример Укажем программе, что в искомой дате месяц может писаться словом или двумя цифрами. MonthFormat: DigitsWithLeadingZeroMonth + WordMonth;
Void YearFormat( YearFormatVariants ) | См. диалог Свойства элемента Date, закладка Date, Format, Year
Void MinDate( String ) | Строка в формате dd/mm/yyyy, задающая параметр Date. См. диалог Свойства элемента Date, закладка Date, Date interval, поле from
Void MaxDate( String ) | Строка в формате dd/mm/yyyy, задающая параметр Date. См. диалог Свойства элемента Date, закладка Date, Date interval, поле to. Пример Укажем программе, что искомая дата должна находиться в диапазоне между 1 января 2000 года и 31 декабря 2004 года (независимо от формата даты). MinDate: "01/01/2000"; MaxDate: "31/12/2004";
Void MaxXOutsidePart( Real ) | Задает часть символа, которая может выступать по горизонтали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void MaxYOutsidePart( Real ) | Задает часть символа, которая может выступать по вертикали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void MaxRelativeGapInLine( Real ) | Максимальное расстояние между соседними символами в процентах от высоты строки.


Элемент Currency

Имя параметра | Описание
Void Currency( String ) | Задает возможные названия валют. Варианты названий должны разделяться запятой, также возможны пробелы после запятой. См. диалог элемента Currency, свойство Currency name Пример: Currency: "USD, $, EUR, EURO";
Void CurrencyOmissionQuality( Real ) | Задает качество за пропуск названия валюты. См. диалог элемента Currency, свойство Missing name penalty
Void CurrencyPosition( CurrencyPositionTypes ) | Позволяет задать положение названия валюты относительно искомого числового значения – слева или справа. См. диалог элемента Currency, свойство Currency name position Пример: CurrencyPosition: CurrencyPos_Left;
Void MinimalValue( Real ) | Задает наименьшее допустимое значение для числового значения. См. диалог элемента Currency, свойство Minimum value
Void MaximalValue( Real ) | Задает наибольшее допустимое значение для числового значения. См. диалог элемента Currency, свойство Maximum value
Void Separators( String ) | Задает символы, допустимые для разделения целой и дробной части числового значения. См. диалог элемента Currency, свойство Possible fraction separators Пример: Separators: ",.";
Void AllowSeparatorOmission( Logic ) | Позволяет указать, обязательно ли в числовое значении должен присутствовать разделитель дробной и целой части. См. диалог элемента Currency, свойство Allow missing separator
Void AllowFractionalPartOmission( Logic ) | Позволяет указать, обязательно ли числовое значение должно содержать дробную часть. См. диалог элемента Currency, свойство Allow missing fraction
Void FindOnlyIntegers( Logic ) | Задает специальный режим поиска, при котором ищутся только целые числа. Символы, заданные функцией Separators (или на диалоге) игнорируются, и автоматически выставляется AllowSeparatorOmission = true и AllowFractionalPartOmission = false.
Void MaxXOutsidePart( Real ) | Задает часть символа, которая может выступать по горизонтали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void MaxYOutsidePart( Real ) | Задает часть символа, которая может выступать по вертикали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void MaxRelativeGapInLine( Real ) | Максимальное расстояние между соседними символами в процентах от высоты строки.


Элемент Phone

Имя параметра | Описание
Void MinDigitsCount( Int ) | Задает наименьшее допустимое количество цифр в телефонном номере. См. диалог элемента Phone, свойство Minimum number of digits
Void MaxDigitsCount( Int ) | Задает наибольшее допустимое количество цифр в телефонном номере. См. диалог элемента Phone, свойство Maximum number of digits
Void Prefixes( String ) | Задает возможные префиксы телефонного номера. Варианты префикса должны разделяться запятой, также возможны пробелы после запятой. См. диалог элемента Phone, свойство Prefixes for phone numbers Пример: Prefixes: "тел, тел., телефон";
Void PrefixOmissionQuality( Real ) | Задает качество за пропуск префикса телефонного номера. См. диалог элемента Phone, свойство Missing prefix penalty
Void Separators( String ) | Задает символы, которые использованы для разделения цифр телефонного номера. См. диалог элемента Phone, свойство Possible digit separators Пример: Separators: "-/";
Void AddCodeDelimiters( String, String ) | Задает символы открывающей и закрывающей скобки в коде города. Параметры функции – строки из одного символа. Первый параметр – символ открывающей скобки, второй – символ закрывающей. См. диалог элемента Phone, свойство Area code/city code brackets Пример: AddCodeDelimiters: "{", "}";
Void PossibleDigitQuality( Real ) | Задает качество за один неверный символ в номере телефона. По умолчанию 0.97.
Void UniformDigitStringQuality( Real ) | Задает качество за телефонный номер, состоящий из одних цифр, распределенных равномерно на изображении. Служит для различения номера телефона с другими последовательностями цифр, такими как индекс, номер счета и т.д. По умолчанию 0.97.
Void MaxXOutsidePart( Real ) | Задает часть символа, которая может выступать по горизонтали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void MaxYOutsidePart( Real ) | Задает часть символа, которая может выступать по вертикали за пределы области поиска. Указывается в долях символа (от 0 до 1). В гипотезу попадают символы, выступающие за область поиска на указанную либо меньшую величину.
Void MaxRelativeGapInLine( Real ) | Максимальное расстояние между соседними символами в процентах от высоты строки.


Элемент Table

Имя параметра

Описание

Параметры поиска столбцов

Void AddHeaderKeyWord( String keyWord, TableBlockColumn column, Real omissionQuality, Logic wholeWordMode, Logic multiLine )

Задает ключевое слово для поиска заголовка столбца.

См. диалог свойств элемента Table, диалог Properties of column, опция Detect by keyword in title.

Void AddHeaderKeyHypothesis( Hypothesis hypothesis, TableBlockColumn column )

Задает заголовок столбца с помощью найденной гипотезы.

См. диалог свойств элемента Table, диалог Properties of column, опция Use found element as column title.

Void AddHeaderKeyHypothesis( DistInterval left, DistInterval top, DistInterval right, DistInterval bottom, TableBlockColumn column )

 Задает заголовок столбца с помощью явного задания координат.

Void AddColumnType( TableColumnType type, TableBlockColumn column, String regExp )

Задает тип содержимого столбца. Третий параметр следует указывать, только если тип – регулярное выражение.

См. диалог свойств элемента Table, диалог Properties of column, свойство Type of column content.

Void ColumnOmissionQuality( Real quality, TableBlockColumn column )

При использовании фиксированных последовательностей задает качество за отсутствие столбца в таблице, если фиксированная последовательность столбцов была найдена, но при этом один из столбцов не был найден в таблице.

Если параметр не задан, используется значение по умолчанию 0.9.

При использовании правил последовательности столбцов не используется.
Void MissingContentPenalty( Real quality, TableBlockColumn column )

Задает штрафующий коэффициент, на который будет домножено качество гипотезы, если тип содержимого найденного столбца отличается от заданного в параметрах поиска.

Если параметр не задан, используется значение по умолчанию 0.98.

См. диалог свойств элемента Table, диалог Properties of column, свойство Missing content penalty.

Void MissingContentPenalty ( Real quality, TableBlockColumn column ) | Задает штрафующий коэффициент, на который будет домножено качество гипотезы при несовпадении обнаруженного и заданного типа содержимого столбца (см. диалог свойств элемента Table, диалог Properties of column, свойство Missing content penalty). При использовании правил последовательности столбцов задает штрафующий коэффициент, на который будет домножено качество гипотезы, если столбец, входящий в правило последовательности столбцов, не был найден при наложении гибкого описания. Если параметр не задан, используется значение по умолчанию 0.98.

Void ColumnBounds( Distance left, Distance right, TableBlockColumn column )

Задает ограничение на левую и правую границы области поиска столбца таблицы.

См. диалог элемента Table, диалог Properties of column, свойство Absolute area constraints.

Void ExactColumnBorders( Xcoordinate left, XCoordinate right, TableBlockColumn ) Задает точные границы столбца.
Данный параметр можно использовать для поиска таблицы, у которой заранее известно расположение некоторых (или всех) столбцов.

Параметры, задающие последовательность столбцов

Void AddPossibleColumnsOrder( String orderName, TableBlockColumnArray array )

Задает один из вариантов фиксированной последовательности столбцов.

См. диалог элемента Table, закладка Order, опция Fixed column order.

Void ColumnsRelation( TableBlockColumnArray )

Задает одно правило последовательности столбцов.

См. диалог элемента Table, закладка Order, опция Rules for column order.

Параметры поиска заголовка

Void HasHeader( Logic )

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

См. диалог элемента Table, закладка Header, свойство Look for header

Void HeaderOptional( Real q1, Real q2 )

Устанавливает признак опциональности для заголовочной части таблицы аналогично функции Void Optional ( Real q1, Real q2 ) для элементов.

Void HeaderSearchArea( Rect )

Задает прямоугольник поиска заголовочной части таблицы. Если используется эта функция, то область поиска заголовочной части будет пересечением этого прямоугольника и описывающего прямоугольника области поиска всей таблицы.

См. диалог элемента Table, закладка Header, свойство Absolute area constraints.

Void MaxHeaderHypothesesCount( Int )

Задает наибольшее число гипотез, которые будут построены при поиске заголовочной части таблицы.

См. диалог элемента Table, закладка Header, свойство Number of hypotheses for header.

Void MinHeaderKeyElements( Int )

Наименьшее число ключевых элементов, необходимое для нахождения заголовочной части таблицы. По умолчанию 2.

Void ExtendHeaderLocalization( XInterval, YInterval, XInterval, YInterval )

Расширяет локализацию заголовочной части таблицы.

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

Параметры поиска футера

Void HasFooter( Logic )

Флаг указывает, следует ли искать итоговую часть таблицы.

См. диалог элемента Table, закладка Footer, свойство Look for footer.

Void FooterOptional( Real q1, Real q2 )

Устанавливает признак опциональности для итоговой части таблицы аналогично функции Void Optional ( Real q1, Real q2 ) для элементов.

Void FooterSearchArea( Rect )

Задает прямоугольник поиска итоговой части таблицы. При использовании этой функции область поиска итоговой части вычисляется как пересечение заданного в аргументе функции прямоугольника и описывающего прямоугольника области поиска всей таблицы.

См. диалог элемента Table, закладка Footer, свойство Absolute area constraints.

Void FooterHasTopSeparator()

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

Void AddFooterKeyWord( String )

Задает ключевое слово для итоговой части таблицы.

См. диалог элемента Table, закладка Footer, опция Search by keyword.

FooterWholeWordMode ( Logic )

При поиске итоговой части с помощью ключевых слов, флаг определяет, нужно ли рассматривать в качестве гипотез только целые текстовые объекты (см. диалог свойств элемента Table, закладка Footer, опция Whole words only). Если имеет значение True, то гипотезы, состоящие из частей слов, не рассматриваются.

По умолчанию имеет значение False.

См. диалог элемента Table, закладка Footer, опция Whole words only.

Void FooterNearestToTop ( Logic )

Флаг указывает, что при поиске итоговой части по ключевым словам, из всех найденных вариантов выбирается самый высокий. Если флаг выставлен в значение False, то рассматриваются все найденные варианты.

Качество футера входит в качество таблицы, и потом выбирается гипотеза таблицы, лучшая по качеству.

По умолчанию True.

Void AddFooterKeyHypothesis( Hypothesis )

Задает итоговую часть таблицы с помощью найденной гипотезы.

См. диалог элемента Table, закладка Footer, опция Use found element.

Void AddFooterKeyHypothesis( XInterval, YInterval, XInterval, YInterval )

Задает итоговую часть таблицы с помощью явного задания координат.

Параметры поиска тела таблицы

Void DontFindBody()

Позволяет пропустить поиск тела таблицы. Служит для отладки.

Void BodyOptional(Real q1, Real q2 )

Устанавливает признак опциональности для тела таблицы аналогично функции Void Optional ( Real q1, Real q2 ) для элементов.

Void IgnoreVerticalSeparators()

Не учитывать вертикальные сепараторы в теле таблицы при делении на столбцы (по умолчанию учитываются)

Void IgnoreSeparatorsFromHeader()

Не учитывать вертикальные сепараторы из заголовка таблицы при делении на столбцы (по умолчанию учитываются)

Void AutoDetectTopAndBottom( Logic )

Искать верхнюю и нижнюю границы таблицы автоматически. По умолчанию true. В случае, если флажок выставлен в false, то используется весь текст в области поиска табличного элемента.

Параметры деления тела таблицы на строки

Void SingleLineTable( Logic )

Флаг указывает, что в одной строке таблицы находится только одна строка текста.

См. диалог элемента Table, закладка Rows, галочка One line of text corresponds to one row при выбранной опции Detect rows automatically.

Void SingleLineMasterColumn( Logic )

Флаг указывает, что в одной строке таблицы определяющего столбца находится только одна строка текста.

См. диалог элемента Table, закладка Rows, галочка One line of text corresponds to one row при выбранной опции Use master columns to detect rows.

Void MaxRowVerticalGap( Distance )

Задает наибольшее вертикальное расстояние между двумя строчками таблицы. Превышение заданного расстояния означает окончание тела таблицы. По умолчанию параметр не ограничен.

Void MinRowVerticalGap( Distance )

Задает наименьшее вертикальное расстояние между двумя строчками таблицы. Если расстояние меньше данного, то строки объединяются в одну.

По умолчанию 0.

Void MaxMasterColumnRowGap( Distance )

Задает наибольшее расстояние между двумя строчками таблицы в определяющем столбце. Превышение заданного расстояния означает окончание тела таблицы. По умолчанию параметр не ограничен.

Void MinMasterColumnRowGap( Distance )

Задает наименьшее вертикальное расстояние между двумя строчками таблицы в определяющем столбце. Если расстояние меньше данного, то строки объединяются в одну. По умолчанию 0.

Void IgnoreHorizontalSeparators()

Не учитывать горизонтальные разделители при разбиении на строчки.

Void DivideRowsBySeparators()

Делить на строчки только по горизонтальным разделителям, не учитывая текст.

Void DivideRowsByMasterColumn( TableBlockColumn )

Использовать текст данного столбца при делении на строки. Можно вызывать функцию несколько раз. Если в варианте таблице не будет нужного столбца, то используется столбец из следующего вызова функции и т.д., если нет всех, то делим на строчки по всей таблице.

См. диалог элемента Table, закладка Rows, опция Use master columns to detect rows.

Void MasterColumnTextAlignment( TextAlignmentInTableCell )

Задает выравнивание текста в ячейке таблицы в определяющем столбце (Master Column). Может быть TextAlignment_CellTop или TextAlignment_CellBottom. Пример: MasterColumnTextAlignment: TextAlignment_CellBottom; - текст прижат к нижней границе ячейки.

Void AddStopWord( String )

Задает слово, которое не должно выделяться в отдельные строки таблицы.

См. диалог элемента Table, закладка Rows, свойство Stop words.

Void RowSplitters( YCoordinateArray, Logic isBodyTopIncluded = true, Logic isBodyBottomIncluded = true )

Устанавливает разделители для деления таблицы на строки.

  • isBodyTopIncluded == true - устанавливается верх тела таблицы;
  • isBodyBottomIncluded == true - устанавливается низ тела таблицы;
  • isBodyTopIncluded == false - верх тела таблицы ищется автоматически;
  • isBodyBottomIncluded == false - низ тела таблицы ищется автоматически.
Заданные сепараторы, не попадающие в область поиска тела таблицы, игнорируются.

Пример
let yArray = RepeatableGroup.AllInstances.GetYArray(1);
RowSplitters( yArray );

Параметры многостраничных таблиц

Void HeaderOnEachPage( Logic has = true ) Задает, что заголовок таблицы присутствует на каждой странице (в начале каждой одностраничной подтаблицы).

См. диалог элемента Table, закладка Header, свойство Header is on each page

Void AddHeaderKeyHypotheses( HypothesisInstances, TableBlockColumn ) Задает заголовок столбца на нескольких страницах с помощью набора гипотез некоторого подэлемента повторяющейся группы.

См. диалог элемента Coulumn, свойство Use found element as column title

Void FooterOnEachPage( Logic has = true ) Задает, что итоговая часть таблицы присутствует на каждой странице.

См. диалог элемента Table, закладка Footer, свойство Footer is on each page

Void AddFooterKeyHypotheses( HypothesisInstances ) Задает итоговую часть таблицы на нескольких страницах с помощью набора гипотез некоторого подэлемента повторяющейся группы.

См. диалог элемента Table, закладка Footer, свойство Use found element as footer

Void PreviousInstances( TableHypothesisInstances ) | Задаёт предыдущие экземпляры таблицы в случае, если таблица находится внутри повторяющейся группы. Предполагается, что экземпляры идут сверху вниз, границы столбцов на одной странице имеют те же положения, а с разных страниц могут иметь небольшие смещения по горизонтали. Предыдущие экземпляры используются для (улучшения) поиска столбцов, если таблица не имеет заголовка (Header) или он не найден.


Элемент Repeatable Group

Следующие свойства повторяющейся группы следует задавать в разделе Pre-Search Relations for all instances. Подробнее см. Дополнительные условия поиска для Repeatable Group.

Имя параметра | Описание
Void MinRepetitions( Int ) | Задает минимальное число экземпляров группы в документе. См. Диалог Свойства, закладка Repeatable Group, свойство Min repetitions.
Void MaxRepetitions( Int ) | Задает максимальное число экземпляров группы в документе. См. Диалог Свойства, закладка Repeatable Group, свойство Max repetitions.
Void PaginalMode( Logic value = true ) | Задает постраничный режим поиска экземпляров повторяющегося элемента. См. Диалог Свойства, закладка Repeatable Group, свойство Paginal mode.
Void MinRepetitionsOnPage( Int ) | Задает минимальное число экземпляров на страницу. Если минимально допустимое число экземпляров на текущей странице не найдено, повторяющаяся группа не считается найденной. См. Диалог Свойства, закладка Repeatable Group, свойство Min repetitions on page.
Void MaxRepetitionsOnPage( Int ) | Задает максимальное число экземпляров на страницу. Если найдено нужное число экземпляров на текущей странице, то поиск на текущей странице заканчивается, поиск переходит на следующую страницу. См. Диалог Свойства, закладка Repeatable Group, свойство Max repetitions on page.


Элемент First Found

Групповой элемент First Found не имеет специфических методов и свойств. Общие методы и свойства элементов описаны в следующих разделах:

  • Функции, ограничивающие область поиска.
  • Управление поиском.
  • Отладочные функции, возвращающие информацию о заданной области поиска.


Элемент Labelled Field

Элемент Labeled Field

Элемент Labeled Field представляет из себя групповой элемент с предопределенными подэлементами. В режиме работы с элементом как с единым целым его подэлементы невидимы и вызов их методов невозможен. Для доступа к методам подэлементов превратите элемент Labeled Field в обычный групповой элемент с помощью команды контекстного меню элемента.

Элемент Labeled Field не имеет специфических методов и свойств. Общие методы и свойства элементов описаны в следующих разделах:

  • Функции, ограничивающие область поиска.
  • Управление поиском.
  • Отладочные функции, возвращающие информацию о заданной области поиска.


Элемент Region

Элемент Region не имеет специфических методов и свойств. Общие методы и свойства элементов описаны в следующих разделах:

  • Функции, ограничивающие область поиска.
  • Управление поиском.
  • Отладочные функции, возвращающие информацию о заданной области поиска.


Гипотеза элемента Object Collection

Int NumberOfObjects() Число классифицированных объектов, попавших в область гипотезы


Гипотеза элемента Character String

String Value() Значение распознанного текста на изображении, попавшего в область гипотезы


Гипотеза элемента Static Text

String Value() | Значение распознанного текста на изображении, попавшего в область гипотезы
Int LineCount() | Число строк текста гипотезы
Rect LineRect( Int n ) | Прямоугольник строки текста с индексом n Замечание: Прямоугольники, получаемые с помощью данной функции, отсортированы по их положению на странице. Порядок сортировки сверху вниз (прямоугольники с меньшим индексом находятся выше на странице), индекс изменяется от 0 до LineCount() - 1.
XCoordinate LineLeft( Int n ) | Абсцисса крайней левой точки прямоугольника строки текста с индексом n
YCoordinate LineTop( Int n ) | Ордината верхней точки прямоугольника строки текста с индексом n
XCoordinate LineRight( Int n ) | Абсцисса крайней правой точки прямоугольника строки текста с индексом n
YCoordinate LineBottom( Int n ) | Ордината нижней точки прямоугольника строки текста с индексом n
XCoordinate LineXCenter( Int n ) | Абсцисса центра прямоугольника строки текста с индексом n
YCoordinate LineYCenter( Int n ) | Ордината центра прямоугольника строки текста с индексом n
Distance LineWidth( Int n ) | Ширина строки текста с индексом n
Distance LineHeight( Int n ) | Высота строки текста с индексом n


Гипотеза элемента Paragraph

String Value() Значение распознанного текста на изображении, попавшего в область гипотезы


Гипотеза элемента Barcode

String Value() Значение распознанного штрих-кода


Гипотеза элемента Date

Int Day() | Значение дня в составе даты
Int Month() | Значение месяца в составе даты
Int Year() | Значение года в составе даты
String Value() | Значение распознанного текста на изображении, попавшего в область гипотезы


Гипотеза элемента Currency

Real Value() | Найденное числовое значение
Rect IntegerPartRect() | Прямоугольник, содержащий цифры до разделителя. Всегда непустой.
Rect FractionalPartRect() | Прямоугольник, содержащий цифры после разделителя. Пустой, если дробная часть отсутствует.
String CurrencyName() | Найденное значение названия валюты. Возвращается пустая строка, если оно не нашлось.
Rect CurrencyNameRect() | Прямоугольник, содержащий название валюты. Пустой, если оно не нашлось.


Гипотеза элемента Phone

String Value() | Значение распознанного текста на изображении, попавшего в область гипотезы
String Prefix () | Найденное значение префикса перед номером телефона. Возвращается пустая строка, если он не нашелся.
Rect PrefixRect() | Прямоугольник, содержащий префикс перед номером телефона. Прямоугольник пустой, если префикс не найден.


Гипотеза элемента Table

Для получения одностраничной гипотезы используются методы:

Int SubTablesCount() | Количество одностраничных подтаблиц
OnePageTableHypothesis SubTable( Int number ) | Возвращает подтаблицу с указанным номером
OnePageTableHypothesis LastSubTable() | Возвращает последнюю подтаблицу

Методы одностраничной табличной гипотезы OnePageTableHypothesis:

Logic HasHeader() | Содержит ли гипотеза таблицы найденный (ненулевой) заголовок
Logic HasFooter() | Содержит ли гипотеза таблицы найденный (ненулевой) футер
Logic HasBody() | Содержит ли гипотеза таблицы найденное (ненулевое) тело
Hypothesis Header() | Гипотеза заголовка таблицы
Hypothesis Footer() | Гипотеза футера таблицы
Hypothesis Body() | Гипотеза тела таблицы
Int ColumnsCount() | Число найденных столбцов таблицы
Int RowsCount() | Число найденных строк таблицы
Logic HasColumn( TableBlockColumn) | Содержит ли гипотеза таблицы указанный столбец
Int ColumnIndex( TableBlockColumn ) | Порядковый номер указанного столбца в гипотезе таблицы. Нумерация столбцов начинается с 0. Если столбец не найден, метод возвращает –1.
TableHypColumn Column( TableBlockColumn ) | Столбец гипотезы табличного элемента, соответствующий указанному столбцу табличного блока. Обращение к ненайденному столбцу вызовет ошибку при наложении гибкого описания.
TableHypColumn Column (Int columnIndex) | То же, что и метод TableHypColumn Column (TableBlockColumn), только по номеру столбца в гипотезе таблицы. Нумерация столбцов начинается с 0.
Rect RowRect (Int rowIndex) | Прямоугольник строки таблицы с индексом rowIndex. Нумерация строк начинается с 0.
Rect CellRect (Int columnIndex, Int rowIndex) | Прямоугольник ячейки таблицы, которая находится в столбце с индексом columnIndex и строке с индексом rowIndex. Нумерация столбцов и строк начинается с 0.
Rect CellRect (@FormTemplateBlock TableBlockColumn column, Int rowIndex) | Прямоугольник ячейки таблицы, которая находится в указанном столбце и строке с индексом rowIndex. Нумерация строк начинается с 0.


Гипотеза столбца таблицы

У гипотезы табличного элемента можно получить read-only доступ к найденным столбцам. Для обращения к найденному столбцу нужно вызвать метод Column( TableBlockColumn ), см. Гипотеза элемента Table.

Logic HasLeftSeparator() | Ограничен ли столбец черным разделителем слева
Logic HasRightSeparator() | Ограничен ли столбец черным разделителем справа
Logic HasLeftSeparatorInHeader() | Ограничен ли заголовок столбца черным разделителем слева
Logic HasRightSeparatorInHeader() | Ограничен ли заголовок столбца черным разделителем слева
XCoordinate Left() | Левая граница столбца
XCoordinate Right() | Правая граница столбца
Distance Width() | Ширина столбца


Гипотеза элемента Repeatable Group

Hypothesis LastFound() | Последний найденный экземпляр. При использовании в отношениях элемента, не входящего в данную повторяющуюся группу, берется последний найденный экземпляр этой группы. При использовании в отношениях подэлементов самой повторяющейся группы берется предыдущий полностью достроенный экземпляр этой группы.
Hypothesis CurrentInstance() | Текущий экземпляр повторяющейся группы при поиске подэлементов повторяющегося элемента. Используется для построения отношений между подэлементами еще недостроенного текущего экземпляра повторяющейся группы.
Hypothesis Instance( Int instanceNumber ) | Экземпляр номер instanceNumber
HypothesisInstances AllInstances() | Все найденные экземпляры повторяющейся группы. При использовании в отношениях подэлементов самой повторяющейся группы берутся все предыдущие полностью достроенные экземпляры этой группы.
Logic HasInstances() | Возвращает, нашлись ли уже экземпляры
Int InstancesCount() | Количество найденных экземпляров


Гипотеза элемента First Found

Гипотеза элемента First Found является гипотезой найденного подэлемента группы. Методы и свойства гипотезы определяются типом найденного подэлемента.


Гипотеза элемента Labelled Field

Гипотеза элемента Labeled Field

Элемент Labeled Field представляет из себя групповой элемент с предопределенными подэлементами. Гипотеза элемента строится по правилам построения гипотезы группового элемента на основании гипотез подэлементов и не имеет специфических свойств. Общие свойства для гипотез всех элементов описаны в разделе Гипотезы всех типов элементов.

Также возможен доступ к гипотезам подэлементов. Свойства гипотезы подэлемента Label совпадают со свойствами гипотезы элемента Static Text. Гипотеза подэлемента Field может иметь следующие специфические свойства в зависимости от типа контента:

Тип поля | Свойство | Описание
Any text | Text | Текст гипотезы.
Fixed variants | Keyword | Слова, вошедшие в гипотезу. Для каждого слова указывается количество ошибок.
Number | Text | Текст гипотезы.
Currency | Value | Найденное числовое значение.
 | Currency name | Найденное наименование валюты.
Date | Day | Число.
 | Month | Месяц.
 | Year | Год.
Phone | Number | Найденный телефонный номер.
 | Prefix | Найденный префикс.
Regular expression | Text | Текст гипотезы.


Гипотезы всех типов элементов

Гипотеза элемента может быть найденной или ненайденной. Найденная гипотеза содержит один или несколько объектов изображения или их фрагментов (исключение составляет элемент White Gap, который может не содержать ни одного объекта изображения).

Найденная гипотеза простого элемента на изображении всегда представляет собой связный регион. Гипотезы элементов типа White Gap, Separator, Barcode всегда представлены одним прямоугольником.

Если гипотеза строится на основе множества найденных объектов изображения, например, гипотеза элемента Paragraph, то регион гипотезы строится на основе массива прямоугольников найденных объектов. Сформированный таким образом регион можно получить при помощи метода Region гипотезы. При показе региона гипотезы на изображении, а также при формировании блока на основе гипотезы элемента, края региона не огибают в точности каждый из прямоугольников объектов изображения. Вместо этого границы области несколько сглаживаются в целях облегчения визуального восприятия региона. Сформированный таким образом регион можно получить при помощи метода SimplifiedRegion гипотезы. С помощью методов Region и SimplifiedRegion можно получить сформированный регион как в разделе Advanced pre-search relations на закладке Advanced (при описании области поиска элемента), так и в поле Region expression при описании свойств блока на основе уже найденных элементов.

Если гипотеза является ненайденной, то она совпадает с нечетким прямоугольником своей области поиска. При показе ненайденной гипотезы на изображении рисуется внешний прямоугольник нечеткого прямоугольника.

Границы Left, Top, Right, Bottom любой гипотезы представляют собой интервал. У найденной гипотезы каждый из этих интервалов является вырожденным, т.е. Left.Start = Left.End, Top.Start = Top.End и т.д. У ненайденной гипотезы интервалы сторон совпадают с соответствующими интервалами ее области поиска.

Обращение к сформированным гипотезам и их свойствам в коде в соответствующих диалогах свойств элементов и блоков дает дополнительные возможности по настройке гибкого описания. Доступ к гипотезам элементов осуществляется через имена элементов. В случае обращения к гипотезе текущего элемента в разделе Advanced Post-search relations доступ к ее свойствам может происходить с использованием только названия свойства, исключая имя самого элемента.

Обращение к гипотезе элемента, а также всем ее свойствам, происходит в режиме read-only. Обращение к гипотезам элементов доступно в разделах Advanced Pre-search relations и Advanced Post-search relations на закладке Advanced в диалогах свойств элементов и Region expression в диалоге свойств блока. При этом в разделе Advanced Pre-search relations можно обращаться к сформированным гипотезам (и их свойствам) всех элементов, лежащих выше данного в дереве элементов, в разделе Advanced Post-search relations доступны сформированные гипотезы всех вышележащих элементов и гипотеза данного элемента, в разделе Region expression свойств блока доступны гипотезы (и их свойства) всех элементов. В таблице приведены свойства, доступные у гипотез элементов любого типа.

Logic IsNull() | Является ли гипотеза нулевой (если элемент не найден, свойство IsNull гипотезы равно True).
Logic IsFound() | Является ли гипотеза ненулевой (элемент найден, свойство IsNull гипотезы равно False). Равносильно not IsNull.
XInterval Left() | Левая граница гипотезы, горизонтальный интервал в глобальных координатах
YInterval Top() | Верхняя граница гипотезы, вертикальный интервал в глобальных координатах
XInterval Right() | Правая граница гипотезы, горизонтальный интервал в глобальных координатах
YInterval Bottom() | Нижняя граница гипотезы, вертикальный интервал в глобальных координатах
XInterval XCenter() | Абсцисса центра гипотезы, горизонтальный интервал в глобальных координатах
YInterval YCenter() | Ордината центра гипотезы, вертикальный интервал в глобальных координатах
DistInterval Width() | Ширина гипотезы, интервал расстояний в глобальных координатах
DistInterval Height() | Высота гипотезы, интервал расстояний в глобальных координатах
FuzzyRect FuzzyRect() | Нечеткий прямоугольник гипотезы в глобальных координатах
Rect Rect() | Описывающий прямоугольник гипотезы в глобальных координатах. Совпадает с внешним прямоугольником нечеткого прямоугольника гипотезы.
Region Region() | Регион гипотезы в глобальных координатах.
Region SimplifiedRegion() | Регион гипотезы в глобальных координатах, упрощенный для улучшения визуального восприятия.
ImageObjectSet Set() | Объекты изображения, попавшие в состав гипотезы
ImageObjectSet ExcludeSet() | Объекты изображения, попавшие в область изображения, исключенную из области поиска гипотезы методами типа Exclude
RectArray Rects() | Массив прямоугольников, входящих в состав гипотезы. Для большинства элементов совпадает с массивом прямоугольников найденных объектов. Для элементов White Gap и Region найденные объекты отсутствуют
Int HypothesesCount() | Число гипотез, которые есть в области поиска для данного элемента. Внимание! Функцию можно использовать только в случае, если допустимое минимальное и максимальное число страниц документа равно 1, т.е. найденный документ заведомо одностраничный. При использовании этой функций в рамках многостраничного документа, при наложении шаблона возникнет ошибка.
PageInterval Pages() | диапазон страниц, на котором находится гипотеза
PageArea PageAreaGlobal( Int PageNumber ) | возвращает часть гипотезы, расположенную на данной странице в глобальных координатах
PageArea PageAreaLocal( Int PageNumber ) | возвращает часть гипотезы, расположенную на данной странице в локальных координатах страницы

Пример обращения к свойствам гипотезы

Перед обращением к свойству гипотезы простого или составного элемента необходимо проверить, не является ли гипотеза нулевой (обратиться к ее свойству IsNull), т.к. обращение к свойству нулевой гипотезы (а по сути, ненайденного элемента) вызовет ошибку. Рассмотрим следующий пример. Для этого можно воспользоваться проектом Примера 1, входящим в состав данного дистрибутива.

Допустим, у нашей формы есть идентификатор, представленный штрих-кодом. И мы хотим, чтобы гибкое описание накладывалось исключительно на формы, у которых значение штрих-кода 1556897142240, а на формы с другим значением идентификатора данное описание не накладывалось. Для решения данной задачи можно поступить следующим образом. В разделе Advanced post-search relations для элемента, описывающего свойства и условия поиска штрих-кода (в случае Примера 1 – это элемент IdentityNumber), запишем такой код:
if value != "1556897142240" then Quality: 0;

Нажмем кнопку Apply или Check. Никаких синтаксических ошибок компилятор не обнаружил. Казалось бы, все правильно и с точки зрения логики. Запустим процедуру наложения гибкого описания на любой странице из Примера 1. Возникает сообщение об ошибке: "Error in element “MainGroup.IdentityNumber”, Advanced relations section: Attempt to access undefined hypothesis MainGroup.IdentityNumber".

Данное поведение объясняется следующим образом: находится гипотеза элемента штрих-кода. Значение штрих-кода сравнивается с заданным в коде. Если оно отличается, выражением Quality: 0; качество такой гипотезы обнуляется. Потом формируется нулевая гипотеза данного элемента, для которой программа также пытается проверить условие value != "1556897142240". Поскольку у нулевой гипотезы обращаться к value нельзя (у нее просто нет такого свойства), то программа сообщает, что «гипотеза не определена» ("Undefined hypothesis").
Подводя итог вышесказанному, скорректируем код следующим образом:

if not IsNull then {
if value != "1556897142240" then Quality: 0;
}

Замечание. Однако данный код приведет к неналожению гибкого описания только в том случае, когда элемент является обязательным. Если это не так, то окончательный код должен выглядеть следующим образом:

if not IsNull then {
if value != "1556897142240" then Quality: 0;
}
else {Quality: 0;}

Иначе обнулится только качество настоящей гипотезы. Это приведет к формированию нулевой гипотезы. А для нее уже условие if not IsNull не выполнится. Поэтому качество итоговой (нулевой) гипотезы останется таким, каким оно было задано в свойствах элемента (0,97, если оставлено значение по умолчанию), и наложение гибкого описания продолжится, хотя и без данного элемента.

Если же дописать else {Quality: 0;}, то эта строка выполнится для всех гипотез (в том числе нулевой). И наложение описания прервется, т.к полная цепочка гипотез элементов тоже обнулится на этом элементе.

Сравнение методов Region Region() и Region SimplifiedRegion()

Методы Region Region() и Region SimplifiedRegion() позволяют получить регион элемента, однако метод Region Region() дает точный регион:

а метод Region SimplifiedRegion() позволяет получить прямоугольник, построенный по крайним координатам точного региона:


Отладочная печать

В разделах Advanced Pre-Search Relations и Advanced Post-Search Relations описания элемента можно использовать функцию Print, выводящий информацию на печать. Таким образом можно распечатывать данные о некоторых свойствах построенных гипотез.

Формат вызова функции печати:

Void Print( String text )

Для выведения отладочной информации в языке гибких описаний существуют глобальные функции, формирующие строковое представление различных типов языка (см. таблицу).

Функция
String Str( Int )
String Str( Logic )
String Str( Real )
String Str( XInterval )
String Str( YInterval )
String Str( DistInterval )
String Str( Rect )
String Str( FuzzyRect )
String Str( Hypothesis )
String Str( RectArray )
String Str( Region )
String Str( Area )
String Str( Quality )
String Str( Distance )
String Str( PageInterval )

Для оформления выводимой на печать строки символами табуляции, возврата каретки и т.п. используется глобальная функция Chr( Int char ), возвращающая строковое представление символа по его Unicode-коду.

Примеры вызова функции отладочной печати:

Print: Str( Group1.Item1.Width );
Print: “Is Item1 Null ? - ” + Str( Group1.Item1.IsNull );
Print: "Calculate formula: ( 5 * 18 );" + Chr( 13 ) +Chr( 10 ) + "Result is: " + Str( 5 * 18 ) + Chr( 9 ) + "// example";
Print: Str( Group1.Item1.Rect );

Результатом нескольких последовательных вызовов функции Print в одном из Advanced-разделов будет текст, состоящий из нескольких строк. Текст выводится на печать в окне свойств активной гипотезы в свойствах Pre-Search Print и Post-Search Print.


Советы и рекомендации

В данном разделе приведено описание некоторых характерных приемов создания шаблонов, которые можно использовать для поиска полей на изображениях низкого качества. На практике часто встречаются изображения с различными дефектами сканирования, вызванными некорректными настройками сканера. Например, изображение может быть слишком светлым или слишком темным, если при сканировании использовались неверные настройки яркости, и т.п. В результате часть информации на изображении может быть потеряна (засвечена), часть может быть покрыта так называемым «мусором», т.е. темными точками и штрихами.

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

Все описанные повреждения изображений приводят к ухудшению качества предраспознавания текста. Качество предраспознавания можно улучшить, выбрав полный режим распознавания (Thorough). Однако не во всех описанных ситуациях это может помочь, к тому же это увеличивает время обработки изображения.

При создании шаблона в FlexiLayoutStudio обычно используется следующий подход. В шаблоне заранее предусматривается, что результаты предраспознавания могут быть неточными, т.е. несколько отличаться от написанного текста. Обычно этот факт уже учитывается в стандартных настройках элементов, как, например, допустимое число ошибок в элементе Static Text или доля неалфавитных символов в Character String. Вообще говоря, на этапе поиска полей хорошее качество предраспознавания не требуется. Хорошее качество необходимо при распознавании уже найденных полей в FlexiCapture, там для этого создаются специализированные типы данных на каждое отдельное поле, позволяющие существенно улучшить распознавание. Предраспознавание же в FlexiLayoutStudio производится на всей странице одним и тем же языком распознавания, и, как показывает практика, этого обычно достаточно для поиска полей документа.

Как правило, в реальных проектах создание всего лишь нескольких элементов позволяет быстро получить работающий прототип шаблона, корректно обрабатывающий изображения хорошего качества. Таким образом, обычно можно быстро и легко создать версию шаблона, обеспечивающую поиск полей на ~70% изображений. Такой шаблон уже можно начинать использовать в FlexiCapture для ввода данных с изображений. Параллельно можно дорабатывать шаблон, обучая его извлекать информацию с изображений низкого качества. Тщательность доработки зависит от стоящей перед автором шаблона задачи и доступного времени.

Доработка шаблона включает в себя обнаружение элементов, не найденных на изображении, и попытку их найти при помощи дополнительных элементов (иногда другого типа), содержащих менее строгие параметры поиска.

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

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

Проект FlexiLayout Studio, содержащий тестовые изображения и отлаженное гибкое описание, находится в

%allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Описание текстовых полей, содержащих буквы в рамках

Поиск даты в случае хорошего и плохого распознавания

Задание нескольких вариантов значений статического текста. Поиск статического текста со схожими значениями

Исключение элементов с помощью Exclude

Использование составных элементов для улучшения организации гибкого шаблона и поиска элементов

Задание значений для поиска однострочных элементов Static Text

Использование функции RestrictSearchArea для ограничения области поиска

Поиск однострочных полей фиксированного или произвольного формата при разном качестве распознавания

Использование функций Nearest и FuzzyQuality для поиска элементов

Оптимизация поиска составного элемента

Свойство Optional составного элемента

Поиск цифровых строк

Вспомогательный элемент с нулевой гипотезой – как средство упрощения гибкого описания


Описание текстовых полей, содержащих буквы в рамках

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

Если искомые на форме поля данных представляют собой разметку типа «буквы в рамках» или «буквы в изолированных рамках», поиск границ таких полей через разделители может оказаться довольно сложным занятием, а описание элементов может получиться довольно громоздким, особенно при отсутствии или неустойчивом распознавании заголовков к данным полям. Кроме того, для таких полей очень существенно, чтобы в блок попали не только данные поля, но и сама рамка целиком. А в случае тонких разделителей возможны ситуации, при которых они могут находиться не целиком, а частично. В этом случае верхнюю, нижнюю, правую и левую границы поля предпочтительно искать через элементы типа White Gap. Границы поля описываются с помощью специального алгоритма в диалоге свойств блока в поле Expression. При этом верхнюю границу поля можно определить, как нижнюю границу верхнего просвета, нижнюю границу поля – как верхнюю границу нижнего просвета, левую границу поля – как правую границу левого просвета, и правую границу поля – как левую границу правого просвета.

Проект FlexiLayout Studio, содержащий тестовые изображения и отлаженное гибкое описание, находится в

%allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Пример

Допустим, на изображении найдены все 4 просвета (LeftGapName, RightGapName, TopGapName, BottomGapName), необходимые для описания поля данных, представленного на рисунке.

Тогда код в окне Expression будет выглядеть так:

Rect outputRect;
Let FieldLeft = LeftGapName.Rect.Right;
Let FieldRight = RightGapName.Rect.Left;
Let FieldTop = TopGapName.Rect.Bottom;
Let FieldBottom = BottomGapName.Rect.Top;
outputRect = Rect(FieldLeft, FieldTop, FieldRight, FieldBottom);
OutputRegion = outputRect;

Замечание. Вместо LeftGapName, RightGapName, TopGapName и BottomGapName должны стоять имена соответствующих элементов-просветов. При необходимости можно задать запас поля по ширине и высоте с помощью функции Inflate.

Если искомые на форме поля данных являются многострочными полями с разметкой типа «буквы в рамках» или «буквы в изолированных рамках», причем строки не отделяются друг от друга просветами, в этом случае через элементы типа White Gap предпочтительно искать верхнюю, нижнюю, правую и левую границы поля целиком. А поиск отдельных строк ведется уже в свойствах блока путем описания соответствующего алгоритма в поле Expression. Для приведенного примера высота отдельной строки может быть получена путем деления высоты поля на 2.


Поиск даты в случае хорошего и плохого распознавания

Данная глава описывает некоторые характерные приемы создания шаблонов, которые можно использовать для поиска полей на изображениях низкого качества. На практике часто встречаются изображения с различными дефектами сканирования, вызванными некорректными настройками сканера. Например, изображение может быть слишком светлым или слишком темным, если при сканировании использовались неверные настройки яркости, и т.п. В результате часть информации на изображении может быть потеряна (засвечена), часть может быть покрыта так называемым «мусором», т.е. темными точками и штрихами.

В программе FlexiLayout Studio предусмотрен специальный элемент Date, который позволяет задавать условия поиска даты. Однако в ходе создания гибкого описания могут выявиться объективные причины, по которым использование этого элемента для поиска даты может оказаться недостаточным. Причиной для возникновения этой ситуации может стать несоответствие реальной даты ни одному из форматов, допустимых при описании элемента Date. В частности, при задании месяца в поле даты словом, программа FlexiLayout на настоящий момент допускает только два языка (русский и английский). А, следовательно, при обработке изображений документов, представленных на любом другом языке, дата неизбежно будет противоречить заданному формату, и не будет найдена при использовании элемента типа Date.

Другой причиной может стать наличие на изображении не удаляемых элементов формы, например, дата может быть подчеркнута (имеется в виду ситуация, когда между подчеркиванием и датой нет просвета), перечеркнута (например, вследствие сканирования) или вписана в знакоместа, с черными ограничителями (рамками, гребенкой). Невозможность поиска даты с помощью специализированного элемента Date может быть также связана с наличием мусора в области поиска, а также в случае, если дата вписана не печатными символами, а от руки.

Рассмотрим на примере проекта SearchOfDate.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\Date), как можно организовать поиск поля даты.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

В проекте находятся 5 страниц:

Страница 1 - формат даты можно описать с помощью элемента Date;

Страница 2 – дата содержит название месяца на французском языке;

Страница 3 – дата подчеркнута;

Страница 4 – в поле даты находится мусор;

Страница 5 – поле даты заполнено от руки.

Попробуем найти дату на всех изображениях, в том числе на тех, где формат даты отличается от формата, поддержанного элементом типа Date.

Все элементы, имеющие логическое отношение к полю даты объединяются в группу DateGroup. Вначале в ней располагается элемент для поиска заголовка поля даты. В нашем проекте - это элемент типа Static Text с именем DateHeader и единственным значением «Date:».

Примечание: Задание условий для поиска всех элементов на закладке Relations не составляет сложности и выходит за рамки рассмотрения, их можно посмотреть непосредственно в проекте.

Затем создаем элемент типа Date с именем DateField. С помощью этого элемента будет осуществлен поиск тех полей даты, для описания формата которых достаточно свойств элемента типа Date.

Как можно видеть в пакете проекта, с помощью элемента Date удается найти дату только на первой странице.

Для поиска полей даты на всех остальных страницах создается элемент типа Character String. В нашем проекте это элемент DateAsString. В качестве алфавита в нем задается все множество символов, которые предположительно могут встретиться на обрабатываемых изображениях.

Примечание: Если содержимое поля даты может быть структурировано (имеет конкретный формат, который по каким-либо причинам не совпадает ни с одним из форматов элемента Date), то вместо задания алфавита может быть целесообразным описать этот формат с помощью регулярного выражения. Однако, при этом надо быть уверенным в хорошем качестве обрабатываемых изображений, поскольку задание регулярного выражения предполагает точное соответствие искомого поля заданной структуре, в то время как задание алфавита может допускать наличие некоторого процента ошибок (задается в свойствах элемента), а потому является более гибким на случай, если полное отсутствие неточностей распознавания нельзя гарантировать. Если заранее известно, что формат даты предполагает написание месяца словом на языке, совпадающем с языком предраспознавания, заданным в свойствах шаблона, то может оказаться целесообразным разбить поле даты на три составляющие (число, месяц, год) и искать поле месяца отдельно с помощью элемента типа Static Text с указанием всех возможных значений (собственно, названий месяцев полных и/или сокращенных на данном языке). А поля день и год искать уже в виде строк (регулярных выражений) элементами типа Character String справа и слева от поля месяца.

Для оптимизации процедуры наложения гибкого шаблона (для ускорения процедуры наложения шаблона в случае, если формат даты совпал с одним из стандартизованных форматов элемента Date) в секции Advanced pre-search relations для элемента DateAsString записано следующее условие:

if (DateField.IsNull == FALSE) then Dontfind();

или, что то же самое:

if not DateField.IsNull then Dontind();

Это означает, что попытка поиска поля даты в виде строки будет осуществляться только в том случае, если дату не удалось найти с помощью специализированного элемента Date.

Как можно видеть в пакете проекта, с помощью элемента DateAsString удается найти дату на всех остальных страницах пакета, на которых дата не была найдена с помощью элемента типа Date.

Однако на странице 4 найденная строка лишь частично включает поле даты. Если посмотреть результаты предраспознавания для поля даты (для этого надо нажать кнопку Show Raw Objects на панели инструментов), то станет ясна причина такого частичного нахождения даты: дело в том, что в области поиска даты находятся не только текстовые объекты, а еще объекты других типов – в данном случае Picture (картинка) и Punctuation mark (знаки препинания). Такая ситуация характерна для изображений с низким качеством – не всегда текстовые объекты обнаруживаются в процессе предраспознавания.

Для того чтобы найти все объекты, составляющие содержимое поля даты, создан элемент типа Object Collection с именем DateAsObjectCollection. В свойствах элемента указываются все типы объектов, которые при предраспознавании были обнаружены в поле даты. Для оптимизации процедуры наложения гибкого шаблона в секции Advanced pre-search relations для элемента DateAsObjectCollection, также как и для элемента DateAsString записано следующее условие:

if (DateField.IsNull == FALSE) then Dontfind();

Примечание: Мы не можем добавить в свойства Advanced элемента DateAsObjectCollection условие if (DateAsString.IsNull == FALSE) then Dontfind(); поскольку, как мы выяснили в ходе рассмотрения данного примера, нельзя исключить ситуацию, при которой найденная строка может включать только часть даты.

На этом создание элементов, описывающих условия поиска поля даты можно считать законченным. В качестве Source element для блока Date в дереве проекта указана группа элементов SearchElements.DateGroup.AlternativeDateGroup, состоящая из элементов DateField, DateAsString и DateAsObjectCollection. Поскольку при описании свойств элементов DateAsString и DateAsObjectCollection был использован метод Dontfind(), реальный регион найденного блока будет соответствовать либо региону найденной гипотезы элемента Date, либо объединению регионов элемента DateAsObjectCollection с регионом элемента DateAsString. В последнем случае мы ожидаем, что регион элемента DateAsString будет частью региона элемента DateAsObjectCollection, так что результатом объединения будет регион элемента DateAsObjectCollection.

Примечание: В данном случае мы можем указать в качестве Source element группу элементов SearchElements.DateGroup.AlternativeDateGroup, поскольку ситуация достаточно простая. Регион группы состоит из объединения регионов найденных подэлементов. Метод Dontfind() позволяет не искать некоторые подэлементы. Таким образом, регион составного элемента SearchElements.DateGroup.AlternativeDateGroup будет совпадать с регионом нужного нам найденного подэлемента. В данном случае использование метода Dontfind() позволило нам не только оптимизировать процесс поиска блока (ускорить процедуру наложения шаблона), но и упростить описание блока.

В качестве альтернативы можно было бы использовать код, заданный в секции Expression.

Rect OutputRect;

let dateGroup = SearchElements.DateGroup.AlternativeDateGroup;
if (dateGroup.DateField.IsNull == FALSE) then
outputRect = dateGroup.DateField.Rect;
else
outputRect = dateGroup.DateAsObjectCollection.Rect;
OutputRegion = outputRect;

Использование Expression предоставляет дополнительные возможности. Например, мы могли бы проверить, что регион элемента DateAsString действительно является частью региона элемента DateAsObjectCollection.

Примечание: Поиск поля даты при помощи элемента Character String без ограничения формата строки или при помощи элемента типа Object Collection, как в данном примере, дает хороший результат в случае, если удается четко ограничить область поиска данного поля. Если же в области поиска присутствует несколько строчек, то для поиска поля необходимо наложить ограничения на формат строки – например, задав регулярное выражение или более строгий алфавит. Иначе в качестве результата может быть выбрана не та гипотеза, которую мы хотели найти. В случае использования элемента типа Character String можно воспользоваться ограничениями на длину строки, число концов слов и длину пробела внутри строки для отсеивания неподходящих гипотез. В случае с элементом типа Object Collection в гипотезу будут включены все объекты изображения, попавшие в область поиска и удовлетворяющие ограничениям на размеры отдельного объекта.


 Задание нескольких вариантов значений статического текста Поиск статического текста со схожими значениями

Задание нескольких вариантов значений статического текста. Поиск статического текста со схожими значениями

Для поиска различного рода заголовков форм, таблиц, полей (а также любого текста, присутствующего на всех или многих изображениях документа) в программе FlexiLayout предусмотрен элемент типа Static Text. Если на разных изображениях, которые предполагается обрабатывать с помощью одного и того же гибкого шаблона, встречаются разные варианты заголовков, по смыслу относящиеся к одному и тому же элементу формы (например, у поля «Номер счета» могут быть заголовки Invoice, Invoice:, Invoice № и т.п.), то в диалоге свойств элемента Static Text необходимо задать все варианты значений статического текста, даже если они отличаются только знаками препинания, поставленными после значимого слова.

Это необходимо делать по следующим причинам:

  1. Для формирования гипотезы, соответствующей заданному значению. Например, если не задать вариант с двоеточием: «Invoice:», а задать только «Invoice», - то двоеточие не попадет в гипотезу заголовка. Тогда оно может попасть в область поиска номера счета, который, будет искаться справа от статического текста. Если поиск номера допускает наличие нецифровых (или незаданных) символов, то двоеточие может попасть в гипотезу элемента, ищущего номер счета.
  2. Для того чтобы при поиске заголовка не штрафовать гипотезу за наличие в ней символов, не указанных при задании значения в окне Search text. Например, если задать в секции Search text значение “Invoice:”, а на обрабатываемых изображениях встретится также заголовок “Invoice#”, то, если для данного элемента допускается некоторый процент ошибок (в данном случае, не менее одной ошибки), гипотеза заголовка будет сформирована, но ее качество будет оштрафовано.
  3. При имеющихся вариантах гипотез типа "Invoice|Invoice:" программа более длинной гипотезе даст чуть более высокую оценку, чтобы при прочих равных условиях гипотеза "Invoice:" была предпочтительнее. А именно, при наличии варианта с «:» вариант без ":" будет оштрафован на 0.001, т.к. строка “Invoice” является подстрокой “Invoice:”. Штраф более короткого заголовка, который является подстрокой другого, при наличии на форме обоих вариантов позволяет выиграть более длинной гипотезе.

Рассмотрим на примере проекта StaticText.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\Variants of StaticText), каким образом задание значений статического текста влияет на нахождение заголовка и самого поля “Номер счета”.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

В проекте находятся 5 страниц:

Страница 1 - поле «Номер счета» имеет заголовок “INVOICE”;

Страница 2 – поле «Номер счета» имеет заголовок “Invoice:”;

Страница 3 – поле «Номер счета» имеет заголовок “Invoice #:”;

Страница 4 – поле «Номер счета» имеет заголовок “Invoice -”.

Страница 5 – поле «Номер счета» имеет заголовок “Invoice:”, а также на странице присутствует
поле “Invoice date”, в составе заголовка которого встречается слово “Invoice”;

В диалоге свойств элемента Static Text с именем InvoiceHeader задан список всех значений заголовка, которые могут встретиться на обрабатываемых формах (в нашем случае – это перечисленные выше значения). Регистр написания вариантов заголовков не имеет значения.

Invoice|Invoice:|Invoice#:|Invoice-.

Примечание: Для ускорения процедуры поиска элемента заголовка все варианты пишутся без пробела, однако наличие или отсутствие пробела в тексте гипотезы не оказывает влияние на качество гипотезы.

Для простоты будем считать, что номер счета всегда расположен правее заголовка. Для поиска номера счета создан элемент типа Character String с именем InvoiceNumber. Для него задан алфавит и условия поиска на закладке Relations. Эти настройки не содержат сложностей для понимания. Поэтому останавливаться на них не будем. Их можно посмотреть непосредственно в проекте.

В дереве проекта создан текстовый блок Invoice. В качестве Source element в нем указан элемент InvoiceNumber.

Как можно видеть в пакете проекта после запуска процедуры анализа всех страниц, заголовок и номер счета на всех страницах найдены правильно.

Теперь попробуйте временно удалить все значения статического текста в элементе InvoiceHeader, оставив лишь первое значение (Invoice) и наложите шаблон на все страницы. Вы увидите, что заголовок и номер счета найдены правильно только на первой странице, на которой заголовок полностью совпадает с заданным значением (Invoice). На страницах 2-4 в номер счета попала также часть заголовка. А на странице 5 поле номера вообще было найдено ошибочно.

Теперь верните все удаленные значения. Рассмотрим результат анализа 5 страницы, на которой слово Invoice присутствует дважды. Как можно видеть, программа сформировала 5 гипотез для элемента InvoiceHeader. Из них максимальный показатель качества (Chain quality = 1, в нашем случае совпадает с Pre-search quality) имеет гипотеза, соответствующая заголовку “Invoice:”. Также были сформированы гипотезы, имеющие значения “Invoice” и “Invoice d”, являющиеся производными от значений, заданных для элемента InvoiceHeader с учетом допустимого процента ошибок. Эти гипотезы были оштрафованы (как упоминалось выше при рассмотрении причин необходимости задания всех значений статического текста), и в итоге их качество оказалось хуже.


Исключение элементов с помощью Exclude

При создании гибкого шаблона не всегда удается ограничиться описанием области поиска поля данных в терминах “выше-ниже-правее-левее”. Обычно это происходит, когда в область поиска попадают посторонние объекты (элементы формы или объекты появившиеся на изображении в результате сканирования). Такие объекты не должны попасть в блок для распознавания, т.е. и их надо каким-то образом исключить при описании соответствующего элемента. Примером может служить поле адреса на рисунках, приведенных ниже. Имеется в виду взаимное расположение заголовков “Address:”, “(Address)”, которые необходимо исключить из распознавания, и собственно адреса, который необходимо распознавать.

Для этих целей служит функция Exclude, которая позволяет исключить из области поиска элемента область, задаваемую при вызове данной функции. Это может быть регион гипотезы (найденной или не найденной), прямоугольник или массив прямоугольников найденных элементов, а также регион, построенный из набора объектов изображения, входящих в состав какой-либо найденной гипотезы (см. метод ExcludeSet).

Рассмотрим на примере проекта Exclude.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\Exclude), как работает функция Exclude.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

В проекте находятся 4 страницы:

Страница 1 - поле адреса является многострочным. Заголовок “Address:”, расположен на первой строке адреса. Т.е. нельзя сказать, что поле данных находится правее или ниже заголовка. Но заголовок необходимо исключить из распознавания;

Страница 2 – поле адреса не имеет заголовка;

Страницы 3 и 4 – строка “(Address)” находится внутри поля данных. Но ее необходимо исключить из распознавания.

На всех страницах в нашем примере поле адреса располагается ниже поля с названием компании. Поэтому сначала мы создаем элемент типа Static Text с именем CompanyHeader для поиска заголовка данного поля и задаем его значение.

Затем мы создаем элемент типа Static Text с именем AddressHeader для поиска заголовка поля адреса. В качестве значений статического текста мы задаем Address:|(Address). Т.е. перечисляем все варианты строк, которые нам надо будет найти, а затем исключить из поля адреса. Описываем условие поиска этих строк в секции Relations, говоря, что данные строки необходимо искать ниже (Below) элемента CompanyHeader.

Примечание: Элемент заголовка обязательно должен быть создан раньше, чем элемент соответствующего поля адреса, поскольку в функции Exclude можно обращаться только к элементам, находящимся выше текущего элемента в дереве проекта.

Запускаем процедуру наложения шаблона на все страницы (Match FlexiLayout), чтобы убедиться, что заголовок поля адреса найден на всех страницах, где он действительно присутствует.

Поскольку поле адреса в нашем случае многострочное, для его поиска в проекте создан элемент типа Paragraph. Мы назвали его Address и также как в случае заголовка поля адреса, задали, что его необходимо искать ниже (Below) элемента CompanyHeader.

Как видно после запуска процедуры наложения шаблона, на 1, 3 и 4 страницах в поле адреса попала также и строка заголовка.

Теперь снова откроем диалог свойств элемента Address и перейдем на закладку Search Constraints. Нажмем кнопку Add… рядом с секцией Exclude elements и в списке выберем элемент AddressHeader.

После сохранения свойств элемента снова запустим процедуру наложения шаблона на всех страницах. Как видно в пакете проекта, регион блока, соответствующий полю адреса, приобрел непрямоугольную форму, поскольку из него был вырезан регион, соответствующий заголовку.

Примечание 1: Секция Exclude elements позволяет исключить из области поиска текущего элемента регион найденной гипотезы другого элемента. Если же необходимо исключить более сложную геометрическую фигуру, либо нужно сначала вычислить некоторый регион, а затем уже исключить его из области поиска, то следует воспользоваться функциями Exclude, ExcludeRect, ExcludeSet в секции Advanced pre-search relations диалога свойств элемента.

Примечание 2: Регион блока по определению состоит из прямоугольников, поставленных сверху друг на друга, так что любая (мысленно проведенная) горизонтальная прямая пересекает регион только один раз, т.е. вертикальных зубцов в блоке быть не может по определению. Поэтому если полезная информация и строка, которую необходимо исключить, располагаются, как показано на рисунке ниже (т.е. примерно или строго на одном уровне), заголовок не удастся исключить из поля данных на этапе создания гибкого шаблона. В этом случае исключение заголовка может быть осуществлено уже после распознавания в FlexiCapture из распознанного текста c помощью правила “Замена значений из списка”.


Использование составных элементов для улучшения организации гибкого шаблона и поиска элементов

Поиск элементов с использованием составных элементов (Group) проходит наиболее оптимально, поскольку объединение элементов в группы уменьшает число возможных сочетаний разных гипотез различных элементов друг с другом, что ускоряет поиск результирующей гипотезы всего шаблона. Кроме того, если группирование элементов отражает логику строения исходного документа, это позволяет лучше структурировать описание гибкого шаблона, что повышает его наглядность.

Объединение некоторого набора элементов в группу, т.е. в составной элемент, позволяет при поиске последующих элементов рассматривать этот набор элементов как единое целое, имеющее собственную завершенную гипотезу (реально состоящую из гипотез элементов группы), а значит, и оценку качества всей группы в целом. Перебор возможных сочетаний гипотез элементов между собой происходит внутри группы, а в дальнейшем поиске последующих элементов участвует только заданное число лучших гипотез группы (по умолчанию =1.).

Все дерево элементов целиком представляет собой один составной элемент, лучшая гипотеза которого и содержит результат наложения шаблона.

Проиллюстрируем работу с группами на примере проекта GroupSample.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\Group\Project1). У нас имеется изображение, на котором мы хотим находить поля с номером счета, датой счета и суммой.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Как видно на изображении (так же обычно дело обстоит со всеми финансовыми документами), номер документа и дата документа (в данном случае, счета) являются соседними полями. Даже, если их расположение на другой форме окажется иным, эти поля все равно будут находиться в соседстве друг с другом. Кроме того, они связаны между собой логикой документа, поскольку описывают определенные реквизиты счета. Т.е. образуют некоторый логический блок. Поэтому для улучшения наглядности нашего шаблона объединим их в группу InvoiceRequisiteGroup.

Примечание: Перед созданием группы мы создали специальный идентификационный элемент. О назначении таких элементов говорится подробнее в разделе “Обработка гибких форм в FlexiCapture и способы их идентификации”. В данном примере мы на этом подробно останавливаться не будем. Этот элемент был создан только для того, чтобы проиллюстрировать “разветвление” дерева гипотез при наличии или отсутствии групп в его составе. Будем считать, что все элементы в дереве, кроме идентификатора, не являются обязательными, и качество нулевой гипотезы у них всех имеет значение по умолчанию 0,97.

Первым элементом в группе располагается элемент Static Text с именем InvoiceNumHeader, описывающий условия поиска заголовка поля “Номер счета”. В качестве значения для этого элемента задана строка “Invoice”.

Основываясь на анализе изображений, которые есть в нашем распоряжении, правее заголовка будем искать собственно номер счета с помощью элемента с именем InvoiceNum.

Под строкой с номером счета аналогично был создан элемент для поиска заголовка поля даты InvoiceDateHeader. Для поиска собственно даты мы создали группу DateGroup с подэлементами InvoiceDate и InvoiceDateAsString. Назначение создания группы для поиска даты подробно описано в разделе “Поиск даты в случае хорошего и плохого распознавания”.

Для поиска поля, содержащего сумму счета, мы создали два элемента: для поиска заголовка – элемент типа StaticText с именем TotalSumHeader (значение “Totalsum(EUR):” задано без пробелов), а для поиска собственно суммы – элемент типа Character String с именем TotalSum.

Примечание: Подробно на настройках элементов останавливаться не будем. Их можно посмотреть непосредственно в проекте.

Обратим внимание, что строка “Invoice”, заданная в качестве значения для элемента InvoiceNumHeader, на тестовых изображениях присутствует трижды: в виде заголовка к полю “Номер счета”, в виде подстроки в заголовке к полю “Дата счета” и внизу счета, в виде подстроки в условиях платежа “Current invoice is…”. Притом в заголовке “INVOICE”, который мы и должны найти с помощью элемента InvoiceNumHeader, присутствует мусор, приведший к появлению ошибки в этом заголовке. В то время как в остальных строках слово “invoice” не содержит никаких помех, и качество соответствующих гипотез должно оказаться выше, чем у гипотезы искомого заголовка.

Посмотрим, что получится при наложении шаблона на примере первого тестовые изображения в пакете.

После запуска процедуры наложения шаблона по команде Match увидим, что дерево гипотез представляет собой одну цепочку.

Дерево гипотез проекта состоит из одной цепочки.
Качество группы совпадает с качеством лучшей цепочки в группе.

По двойному щелчку мыши откроем группу InvoiceRequisiteGroup, чтобы посмотреть, какие гипотезы были сформированы для ее подэлементов, и какая цепочка в группе оказалась лучшей и почему.

Мы видим, что для элемента InvoiceNumHeader сформированы три гипотезы (по количеству обнаруженных строк “invoice”). Причем показатель качества интересующей нас гипотезы из-за наличия мусора оказался ниже (Chain quality составил примерно 0.99), поскольку вместо слова “INVOICE” программа распознала “INVOIC”. В то же время у остальных двух гипотез качество оказалось наилучшим (Chain quality = 1).

Поскольку при создании элемента InvoiceNum мы задали, что номер может состоять из произвольного количества цифр, и искать его надо правее заголовка, а на нашем имидже все эти условия соблюдаются во всех трех случаях, это позволило программе продолжить цепочку для каждой из гипотез заголовка поля “Номер счета”. Причем, хотя Pre-search quality для каждой гипотезы элемента InvoiceNum равно 1, худшей по-прежнему является именно та цепочка, которая для нас является правильной. Это происходит потому, что оценка качества цепочки осуществляется путем перемножения оценок качества гипотез, входящих в цепочку. Для искомого заголовка это качество на данном этапе составило порядка 0,99. Поэтому, если бы в группе не было больше ни одного элемента, конечный выбор на данном этапе оказался бы неправильным.

Примечание: Мы не задавали Post-search relations ни для одного элемента, поэтому для каждого элемента Post-search quality = 1, и о качестве каждой конкретной гипотезы можно судить по ее показателю Pre-search quality.

Поиск лучшей цепочки идет внутри группы. Анализируется и сравнивается качество всех цепочек.
Качество группы будет определяться качеством лучшей найденной цепочки группы.

Как уже было сказано выше, при описании элемента InvoiceDateHeader мы задали, что его следует искать под строкой с номером счета. Однако для всех цепочек, у которых на данный момент было лучшее качество (Chain quality было равно 1), гипотезы элемента, соответствующего заголовку поля даты не были найдены. И, как следствие, во всех этих цепочках были сформированы нулевые гипотезы элемента InvoiceDateHeader. Поскольку мы не меняли значение качества нулевой гипотезы, определенное по умолчанию, результирующее качество (Chain quality) всех соответствующих цепочек понизилось и составило 0,97. В то же время для цепочки, у которой до этого момента качество было хуже, элемент, соответствующий заголовку поля даты, нашелся. Качество его гипотезы составило примерно 0,993. Оно отличается от 1, вследствие того, что на изображении, в заголовке поля даты содержится мусор, приведший к тому, что распознанное программой значение заголовка содержит ошибку и отличается от заданного в свойствах элемента InvoiceDateHeader. В результате найденная гипотеза оказалась оштрафована и итоговая оценка качества (Chain quality) составила уже порядка 0,98 (это значение получилось вследствие перемножения 0,99 и 0,993). Но, тем не менее, поскольку итоговое качество этой цепочки превысило показатели качества 0,97 всех остальных цепочек, на данном этапе она оказалась лучшей цепочкой.

Поскольку для нахождения поля даты мы создали составной элемент DateGroup, в котором предусмотрено, что по крайней мере один из элементов не должен найтись, если нашелся другой (использовалась функция Dontfind), и в силу особенностей бланка и сделанных настроек для элемента InvoiceDateAsString (алфавит допускает цифры), программа для всех цепочек смогла найти поле даты. Хотя по сути правильной среди них является только одна гипотеза.

Поскольку в каждой группе один элемент оказался найден, а другой нет, итоговое качество цепочки внутри каждой группы DateGroup оказалось равным 0,97 (результат перемножения 1 и 0,97 (качества нулевой гипотезы по умолчанию)). Т.е. в нашем случае получилось, что итоговое качество цепочек DateGroup никак не может повлиять в сторону улучшения или ухудшения на “соотношение сил”, которое сложилось на момент нахождения элемента InvoiceDateHeader. Т.е. качество каждой из цепочек просто будет домножено на 0,97.

В итоге оказалась сформирована единственная гипотеза составного элемента InvoiceRequisiteGroup, соответствующая лучшей цепочке в группе. Ее качество составило примерно 0,953. Т.е. “групповой подход” позволил выиграть правильной гипотезе даже несмотря на то, что на начальном этапе качество этой цепочки было хуже.

Для иллюстрации того, как бы выглядело дерево гипотез, если бы в шаблоне не было составных элементов, был создан проект GroupSample.fsp (папка Group\Project2). Вид дерева представлен на рисунке ниже. Как следует из рисунка, после нахождения элемента FormID дерево гипотез «разветвляется» из-за наличия нескольких гипотез элемента InvoiceNumHeader. Что приводит к тому, что программа вынуждена сравнивать показатели качества каждой цепочки, каждый раз начиная с самого первого ее элемента, и заканчивая последним элементом. Кроме того, при создании шаблона для какой-либо сложной формы (а рассматриваемая нами форма к таким не относится), подобная организация гибкого описания, без использования составных элементов, привела бы к чрезмерному «разрастанию» дерева гипотез не только в длину, но и в ширину, что затруднило бы анализ результатов наложения шаблона.

Примечание: Помещение всех искомых элементов в одну корневую группу крайне не рекомендуется. Это допустимо только для очень простых шаблонов, содержащих менее 10 элементов, что в реальных задачах практически не встречается. По мере увеличения числа элементов в корневой группе число возможных цепочек гипотез растет в соответствии с законами комбинаторики до тех пор, пока не сработает ограничение на число гипотез элемента во всех ветках дерева гипотез, равное 10000 для любого элемента, либо не выполнится ограничение на объем памяти, отведенный под дерево гипотез. В том и другом случае шаблон может просто не наложиться.

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

Не сгруппированное дерево выглядит очень «разветвленным», что делает неудобным его просмотр.
Кроме того, поскольку качество итоговой цепочки получается путем перемножения показателей качества всех гипотез, входящих в цепочку, объем вычислений для поиска «лучшего пути» при разветвленной структуре дерева может значительно возрасти, что приведет к снижению скорости наложения шаблона.


Задание значений для поиска однострочных элементов Static Text

Если требуется найти участок статического текста, про который заведомо известно, что он всегда (на всех страницах обрабатываемой формы) будет однострочным, то рекомендуется задавать его значение без пробелов. Это позволит ускорить процедуру поиска элемента. На качестве найденной гипотезы наличие или отсутствие пробелов никак не отражается.

Примечание: Это утверждение верно только в случае отсутствия ошибок распознавания в статическом тексте заголовка. Дело в том, что под допустимым количеством ошибок (которое в случае элемента типа Static Text регулируется двумя параметрами - Max number of errors и Max error percentage) понимается количество ошибок в слове. Т.е., если, например, максимальное количество ошибок (Max number of errors) равно 1 и, заголовок состоит из 3 слов, а значение статического текста задано без пробелов, это означает, что в заголовке может содержаться не более одной ошибки. Заголовок без пробелов воспринимается, как одно слово, независимо от того, сколько слов, отделенных пробелами присутствует в реальном заголовке на изображении. Но, если значение статического текста задано с пробелами, то указанное допустимое количество (или процент) ошибок будет относиться уже к каждому слову, отделенному пробелом внутри строки, заданной в секции Search text. При обнаружении ошибок распознавания в статическом тексте гипотеза элемента штрафуется по определенному алгоритму. Качество гипотезы при наличии и отсутствии пробелов в значении статического текста при этом может получиться разное.

Проиллюстрируем работу со статическим текстом на примере проекта Spaces.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\Spaces in StaticText\Project1).

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLSers\Public\ABBYY\FlexiCapture10\Samples.

В проекте находятся 2 страницы:

Страница 1 – качество изображения хорошее;

Страница 2 – в заголовке поля данных есть мусор.

Поиск поля данных “Имя отца” будем вести относительно заголовка “Please indicate your father’s name here:” (“Пожалуйста, укажите здесь имя Вашего отца”).

В проекте мы создали элемент типа Static Text с именем NameOfFatherHeader. Для него мы задали значение заголовка в одно слово, т.е. написали заголовок без пробела Pleaseindicateyourfather'snamehere:. Регистр написания значения заголовка может быть любым. Для всех остальных свойств элемента мы оставили значения параметров по умолчанию. Максимальное допустимое количество ошибок в заголовке составляет 10 символов (30% от 35 символов, составляющих заданное значение).

Как видно в пакете проекта после запуска процедуры наложения шаблона по команде Match, заголовок успешно найден на обеих страницах. Однако на 2 странице Chain quality гипотезы элемента NameOfFatherHeader составило порядка 0,994 из-за штрафа, наложенного на гипотезу в силу того, что в распознанном статическом тексте обнаружена одна ошибка, вызванная наличием мусора.

Примечание: Для того чтобы увидеть результат предраспознавания искомого заголовка, надо нажать кнопку “L” (“Show Recognized Lines”) на панели инструментов, и указать курсором текст заголовка. Результат предраспознавания заголовка на 2 странице выглядит так “ PLEASEINDICATE|OURFATHER'SNAMEHERE:”. Также фактически найденный статический текст можно увидеть, если выделить курсором гипотезу элемента NameOfFatherHeader в окне Tree of Hypotheses и в окне Properties-Hypothesis поставить курсор в строку Keyword. В этом случае результат распознавания и обнаруженное количество ошибок (если они есть) высветится в нижней части окна Properties-Hypotheses.

Для поиска поля данных “Имя отца” мы создали элемент типа Character String, поскольку искомое поле однострочное, а его содержимое постоянно меняется (в отличие от значений статического текста). Мы назвали элемент FathersName и задали его условия поиска на закладке Relations. Затем в дереве проекта создали одноименный блок и указали, что его регион совпадает с регионом элемента FathersName (указали имя элемента FathersName в секции Source element).

Теперь посмотрим на тех же самых страницах, каков будет результат наложения шаблона в случае, когда значение элемента NameOfFatherHeader будет задано с пробелами.

Для этого мы создали проект Spaces.fsp (папка Spaces in StaticText\Project2). Значение элемента NameOfFatherHeader выглядит следующим образом: Please indicate your father's name here:. Все прочие настройки остались без изменения (полностью совпадают с настройками, сделанными в проекте Spaces.fsp, находящемся в папке Spaces in StaticText\Project1).

Как видно в пакете проекта после запуска процедуры наложения шаблона по команде Match, заголовок успешно найден на обеих страницах. Однако теперь на 2 странице Chain quality гипотезы элемента NameOfFatherHeader составило порядка 0,987 из-за штрафа, наложенного на гипотезу в силу того, что в распознанном статическом тексте обнаружена одна ошибка, вызванная наличием мусора.

Примечание: Обратите внимание, что в случае наличия пробелов в строке значения, заданной в секции Search text, каждое слово рассматривается отдельно и количество ошибок определяется для каждого слова в составе строки. Результирующее качество гипотезы статического текста зависит от качества гипотез отдельных слов.


Использование функции RestrictSearchArea для ограничения области поиска

Функция RestrictSearchArea позволяет задать область поиска элемента в виде прямоугольника, массива прямоугольников, а также в виде региона.

В документах достаточно часто встречается ситуация, когда искомое поле на разных страницах может по-разному располагаться относительно заголовка. Например, на одних страницах, поле может находиться правее заголовка, а на других – под ним. В этом случае область поиска целесообразно задавать в виде массива прямоугольников. О том, как можно использовать функцию RestrictSearchArea в такой ситуации, подробно рассмотрено в разделе “Использование функций Nearest и FuzzyQuality для поиска элементов”.

Также может оказаться целесообразным использование функции RestrictSearchArea взамен дублирования условий поиска, если они одинаковы для нескольких элементов.

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

Рассмотрим, как можно использовать функцию RestrictSearchArea в случае поиска поля даты. Обычно рекомендуется искать поля даты с использованием как минимум двух типов элементов: Date и Character String. Но и этих двух элементов при низком качестве исходных изображений может оказаться недостаточно. Подробнее организация поиска поля даты рассмотрена в разделе “Поиск даты в случае хорошего и плохого распознавания”.

Проиллюстрируем работу этой функции на примере проекта SearchOfDate.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\RestrictSearchArea). Фактически, этот проект является копией одноименного проекта, расположенного в папке Date\FCS project, в котором условия поиска всех элементов (DateField, DateAsString и DateAsObjectCollection) были одинаковы, и выглядели, как показано на изображении ниже.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Но в текущем проекте мы вместо того, чтобы дублировать условия, описанные на закладке Relations для элементов DateAsString и DateAsObjectCollection, использовали функцию RestrictSearchArea, написав следующий код в секции Advanced pre-search relations на закладке Advanced:

if (DateField.IsNull == FALSE) then Dontfind();

else RestrictSearchArea (DateField.Rect);

Данный код означает, что попытка поиска поля даты в виде строки и коллекции объектов будет осуществляться только в том случае, если дату не удалось найти с помощью специализированного элемента Date. Причем искаться оба эти элемента будут именно в той области, в которой не удалось найти элемент DateField. Дело в том, что метод DateField.Rect вернет описывающий прямоугольник гипотезы элемента DateField. Поскольку гипотеза не найдена, то этот описывающий прямоугольник будет совпадать с областью поиска. Таким образом, мы задаем область поиска элементов DateAsString и DateAsObjectCollection совпадающую с прямоугольником, описывающим область поиска ненайденного элемента DateField.


Поиск однострочных полей фиксированного или произвольного формата при разном качестве распознавания

Для нахождения однострочных полей в программе FlexiLayout Studio предусмотрен элемент типа Character String. Если искомое поле имеет фиксированный формат, его можно описать в свойствах соответствующего элемента на закладке Character String в поле Regular expression. Однако использование регулярного выражения для поиска элемента подразумевает печатное заполнение и хорошее качество соответствующего фрагмента изображения, поскольку описание с помощью регулярного выражения не допускает наличия в поле ошибок, которые могут возникнуть, например, при попадании в область поиска мусора или при наличии белесых участков (плохом качестве печати). Наличие каких-либо ошибок в поле, описанном с помощью регулярного выражения, приведет к тому, что элемент не будет найден. Также, нельзя использовать регулярные выражения при заполнении поля от руки, даже если структура поля поддается описанию. Тем не менее, найти такое поле можно.

Рассмотрим на примере проекта StructuredStrings.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\Structured strings), как можно организовать поиск однострочного поля “Номер счета”, имеющего одинаковый формат на всех страницах.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

В проекте находятся 4 страницы:

Страница 1 и 2 - поле “Номер счета” заполнено печатным способом, качество изображения хорошее;

Страница 3 – поле “Номер счета” заполнено печатным способом, но в поле имеется мусор;

Страница 4 – качество изображения хорошее, но поле “Номер счета” заполнено от руки.

Поле “Номер счета” мы будем искать относительно заголовка. Поэтому вначале необходимо создать элемент, описывающий условия поиска заголовка. Для поиска заголовка был создан элемент типа Static Text с именем InvoiceNumberHeader и значением “InvoiceN:”.

Поле “Номер счета” – однострочное. Поэтому для его поиска мы вначале создали элемент типа Character String с именем NumAsRegularExpression. Как можно видеть при просмотре страниц в пакете, формат поля “Номер счета” можно описать с помощью следующего регулярного выражения:

NNNN"-"NN"-"[A-Z]"/"NN или (что то же самое) [0-9]{4}"-"[0-9]{2}"-"[A-Z]"/" [0-9]{2}

Что означает, что номер состоит из последовательности:

“четыре цифры – две цифры – одна прописная буква (на латинице)/две цифры”

Как можно видеть в пакете проекта, после запуска процедуры наложения шаблона по команде Match для страниц 3 и 4 были сформированы нулевые гипотезы для элемента NumAsRegularExpression, т.е. элемент оказался не найден. На странице 3 наличие мусора привело к несоответствию данных поля структуре, описанной регулярным выражением. Если открыть страницу 3 и нажать кнопку “L” (“Show Recognized Lines”) на панели инструментов, то результат предраспознавания номера счета на этой странице выглядит так “10&0-20-A/04”. На 4 странице номер счета заполнен от руки. При просмотре результата предраспознавания (Z.OOO-41-C/03) видно, что он также не соответствует описанному формату.

Для преодоления данной проблемы предлагается следующее решение. Создаем еще один элемент типа Character String с именем NumAsAlphabet. Задаем для него те же условия поиска, что и для ранее созданного элемента NumAsRegularExpression. И объединяем оба эти элемента в группу InvoiceNumber. Но в качестве описания элемента NumAsAlphabet задаем уже не регулярное выражение, а список всех допустимых символов.

В секции Advanced pre-search relations необходимо записать следующий код:

if (NumAsRegularExpression.IsNull == FALSE) then Dontfind();

Это означает, что попытка поиска номера счета в виде строки нефиксированного формата, описанной элементом NumAsAlphabet, будет осуществляться только в том случае, если его не удалось найти с помощью элемента NumAsRegularExpression, описывающего строку фиксированного формата.

Примечание: Для описания условий поиска элемента NumAsAlphabet можно воспользоваться методом drag&drop для копирования их из секции Relations элемента NumAsRegularExpression в одноименную секцию данного элемента. В качестве альтернативы можно записать в секции Advanced pre-search relations следующий код:

if (NumAsRegularExpression.IsNull == FALSE) then Dontfind();

else RestrictSearchArea (NumAsRegularExpression.Rect);

Данный код означает, что попытка поиска элемента NumAsAlphabet будет осуществляться только в том случае, если структура номера счета не соответствует заданному формату, т.е. не удалось найти элемент NumAsRegularExpression. Причем поиск элемента NumAsAlphabet будет осуществляться именно в той области, в которой не удалось найти элемент NumAsRegularExpression.

Снова запустим процедуру наложения шаблона на все страницы. Как можно видеть в пакете проекта, теперь поле номера счета успешно нашлось на каждой странице.

В дереве проекта мы создали текстовый блок с именем InvoiceNum. И в качестве Source element для него подключили группу SearchElements.InvoiceNumber. На этом создание шаблона для поиска поля “Номер счета” можно считать законченным.

Примечание: Если по какой-либо причине описанный выше прием окажется недостаточным для нахождения поля (независимо от того фиксированный у него формат или произвольный), то в группе можно создать еще один элемент (элемент типа Object Collection). В данном проекте – это элемент типа Object Collection с именем NumAsObjectCollection, который при том качестве изображений, которые присутствуют в нашем проекте, по сути, не нужен, приводится здесь только в качестве примера, и потому он исключен из рассмотрения (для него выполнена команда Disable). Включение дополнительного элемента типа Object Collection может понадобиться, когда результаты предраспознавания на разных страницах практически непредсказуемы, но область поиска удается задать достаточно точно, не боясь, что в гипотезу попадет ненужная информация.

Может возникнуть вопрос: зачем нужно создавать элемент с регулярным выражением, если все равно в некоторых случаях поле ищется без его использования? Дело в том, что использование регулярного выражения повышает надежность поиска. Если удалось найти подобный элемент, то можно быть уверенным, что нашлась именно та строка, которую мы искали. Эту информацию можно использовать в дальнейшем при поиске других элементов, опираясь на надежно найденный элемент и используя его в отношениях с другими элементами. При ослаблении условий на формат искомой строки снижается уверенность в том, что найденный элемент – тот, что нужно.

Это может получиться, например, при наличии большого количества мусора или белесых участков на рассматриваемом фрагменте изображения. В этом случае, при использовании для поиска элемента типа Character String с заданным алфавитом плохое качество изображения может привести к превышению допустимого процента ошибок (параметр Percentage of non-alphabet characters). В результате либо элемент совсем не будет найден, либо он будет найден, но в него попадет только часть данных искомого поля. Пример такой ситуации приведен на рисунке ниже.


Использование функций Nearest и FuzzyQuality для поиска элементов

Внимание! Для простоты рассмотрим одностраничный документ.

При обработке форм довольно часто возникают ситуации, когда условий, описывающих месторасположение одних элементов относительно других элементов в терминах “выше-ниже-левее-правее” оказывается недостаточно, поскольку в области поиска может одновременно оказаться несколько объектов, удовлетворяющих заданным условиям. В этом случае их приходится отличать по другим признакам, в частности - по дистанции между объектами. Для этих целей в программе FlexiLayout Studio предусмотрены функции FuzzyQuality и функции из группы Nearest (т.е. Nearest, NearestX, NearestY).

Область действия и назначение этих функций несколько отличается.

Функция Nearest может использоваться только в секции Advanced pre-search relations. Она указывает программе, что из нескольких гипотез элемента при прочих равных условиях необходимо искать ближайшую к некоторому элементу или точке на изображении, заданной параметрами функции Nearest. В секции Advanced pre-search relations элемента можно использовать только одну функцию из группы Nearest. После ее срабатывания из нескольких рассматриваемых гипотез остается только одна, причем это происходит на этапе выдвижения гипотез элемента, т.е до выполнения кода, указанного в секции Advanced post-search relations. Вообще говоря, нет гарантии, что эта гипотеза окажется лучшей (будет соответствовать искомому фрагменту изображения), поскольку Advanced post-search relations играют важную роль в оценке, и следовательно, выборе гипотезы элемента. А здесь выбор происходит уже на этапе создания гипотез, не на основе качества гипотезы, а на основе близости ее к указанной точке. При использовании функции Nearest нужно иметь это в виду. Если для выбора правильной гипотезы важно учитывать условия, записанные в секции Advanced post-search relations (например, ограничение на ширину найденной гипотезы), то вместо функций группы Nearest рекомендуется использовать функцию FuzzyQuality.

Функция FuzzyQuality может использоваться исключительно в секции Advanced post-search relations. В отличие от функций группы Nearest, она не выбирает одну гипотезу из нескольких, а влияет на оценку качества всех найденных гипотез в зависимости от свойств этих гипотез и параметров, заданных в аргументах функции FuzzyQuality. Отличие от функций группы Nearest заключается также в том, что для одного элемента в секции Advanced post-search relations функция FuzzyQuality может использоваться несколько раз. Т.е. на гипотезу при необходимости может быть наложено несколько различных условий с разными оценками качества. Все полученные оценки будут перемножены, таким образом сформируется Post-search quality гипотезы.

Функция FuzzyQuality имеет следующий синтаксис.

FuzzyQuality: x, {f1, f2, f3, f4};

Она работает по такому алгоритму: проверяется вхождение значения параметра х в нечеткий интервал, задаваемый параметрами f1, f2, f3, f4. Смысл данного интервала аналогичен смыслу нечетких интервалов, которые определены для некоторых параметров элемента Character String.

Проиллюстрируем работу функций Nearest и FuzzyQuality на следующих изображениях.

Как видно на изображениях, форма счета относится к разряду неформализованных, поскольку поля меняют свое взаимное расположение. Будем искать на данной форме поля “Номер счета” и “Дата счета”.

Для решения этой задачи мы создали проект 1.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\FuzzyAndNearest\Project1).

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Для оптимальной организации шаблона, и следуя логике расположения искомых полей данных на форме, все искомые элементы мы объединим в одном составном элементе InvoiceGroup. Мы можем начать создание шаблона с создания элемента, описывающего условия поиска заголовка поля “Номер счета”. Но, при анализе всех изображений видно, что слово “Invoice”, из которого состоит заголовок, присутствует на форме несколько раз. А, поскольку взаимное расположение полей все время разное, мы не можем задать программе условия поиска, которые гарантировали бы правильное нахождение слова “Invoice”. Оно может быть найдено, например, в составе заголовка “Invoice date”. Чтобы исключить эту путаницу, мы начали создание шаблона с описания заголовка поля даты с помощью элемента типа Static Text с именем DateHeader. В секции Search text мы задали два значения заголовка Invoicedate:|Invoicedate (перечислили варианты написания заголовка на изображениях). Регистр написания значения заголовка может быть любой.

Примечание: О том, почему необходимо задавать оба варианта, несмотря на незначительное отличие заголовков, можно подробнее узнать в разделе “Задание нескольких вариантов значений статического текста. Поиск статического текста со схожими значениями”.

Поле даты мы будем искать относительно заголовка. В проекте создана группа DateAlternative, состоящая из двух элементов: специализированного элемента Date, предназначенного для поиска даты в одном из допустимых стандартных форматов, и элемента типа Character String с именем DateAsString, созданного на случай, если формат искомого поля по каким-то причинам будет отличаться.

Примечание: Подробнее о принципах организации шаблона для поиска полей даты можно посмотреть в разделе “Поиск даты в случае хорошего и плохого распознавания”.

Как видно на изображениях, поле даты может находиться как правее заголовка “Invoice date”, так и под ним. Если мы воспользуемся стандартным способом описания условий поиска элемента на закладке Relations (эти условия приведены в проекте в иллюстративных целях, но отключены), то область поиска будет слишком большой, и в нее могут попасть поля, которые при некоторых условиях могут быть приняты за дату (пример приведен на изображении). Это может произойти, например, если дата не соответствует формату элемента Date.

Чтобы исключить рассмотрение лишней области мы поступили по-другому. В секции Advanced pre-search relations мы задали следующий код:

let Header = InvoiceGroup.DateHeader;

if not Header.IsNull then

{ let rect1 = Rect (Header.Rect.Right, Header.Rect.Top-20dt,

PageRect.Right, Header.Rect.Bottom+20dt);

let rect2 = Rect (Header.Rect.Left - 200dt, Header.Rect.Bottom,

Header.Rect.Right + 150dt, Header.Rect.Bottom+200dt);

RectArray ar;

ar = RectArray ( rect1 );

ar.Add ( rect2 );

RestrictSearchArea( ar );

}

else

{ Above: PageRect.Top + PageRect.Height/2;

}

В этом коде мы проверяем, был ли найден заголовок поля даты. Если он найден, мы формируем область поиска даты в виде массива прямоугольников (в нашем случае – из двух). Один прямоугольник “отвечает” за поиск даты правее заголовка, другой – под ним. Если заголовок не был найден, поиск поля даты будет идти в верхней полуплоскости изображения.

Применительно к той странице, изображение которой было приведено для случая задания условий поиска на закладке Relations, область поиска после срабатывания данного кода будет иметь уже иную, непрямоугольную форму. Как видно на изображении, из нее были исключены все лишние объекты.

Примечание: Первая строка кода (let Header = InvoiceGroup.DateHeader;) позволяет упростить последующий код за счет определения переменной Header и присваивания ей значения элемента DateHeader.

Для элемента DateAsString мы не стали дублировать вышеприведенный код, а записали следующее условие поиска в секции Advanced pre-search relations:

if not Date.IsNull then Dontfind();

else RestrictSearchArea (Date.Rect);

Это означает, что если элемент Date не будет найден, поиск элемента DateAsString будет вестись в прямоугольнике, описывающем область поиска элемента Date.

Примечание: Если необходимо, чтобы область поиска элемента DateAsString была не прямоугольной формы (состояла из массива прямоугольников), как в случае элемента Date, то вместо вызова RestrictSearchArea (Date.Rect) следует продублировать соответствующий код, указанный в секции Advanced pre-search relations элемента Date.

Далее мы создали элемент типа Static Text с именем InvoiceHeader для поиска заголовка поля “Номер счета“ и задали искомое значение “Invoice”. Поскольку форма не формализованная, мы не можем задать никакие конкретные условия поиска.

Запустив процедуру наложения шаблона на всех изображениях, мы видим, что правильно заголовок был найден только на первой странице. На страницах 2 и 4 слово “Invoice” было ошибочно обнаружено в заголовке поля даты. На странице 3 оно было найдено внизу страницы, а в силу срабатывания алгоритма оптимизации, остальные гипотезы заголовка не были сформированы, несмотря на то, что слово “Invoice” присутствует трижды на данном изображении.

Примечание: Более подробная информация об оптимизации поиска элементов в группе приведена в разделе “Оптимизация поиска группы”.

Для решения возникших проблем мы поступили следующим образом. Для исключения из области поиска заголовка “Invoice” области заголовка поля даты, мы добавили элемент DateHeader в секции Exclude elements (см. изображение ниже).

Примечание: Если бы мы начали создавать шаблон не с заголовка DateHeader, а с заголовка InvoiceHeader, мы бы не имели возможность использовать функцию Exclude, поскольку с ее помощью можно исключать только элементы, описанные в дереве проекта выше текущего элемента.

А для исключения ошибочного нахождения слова “Invoice” внизу страницы поместили следующий код в секции Advanced pre-search relations.

NearestY: PageRect.Top;

Этот код сообщает программе, что необходимо искать элемент, ближайший к верхнему краю страницы.

После наложения шаблона видим, что на странице 2 используемый нами прием не помог, в силу того, что на данной странице заголовок поля даты не был найден из-за наличия мусора на изображении. В то же время, на данной странице условие, заданное в функции Nearest, соблюдается для обеих строк “Invoice”, поскольку они располагаются на одном уровне. А поскольку качество распознавания строки “Invoice” в обоих случаях хорошее, благодаря алгоритму оптимизации вместо двух гипотез была сформирована одна. И, к сожалению, она оказалась неправильной.

Для поиска поля “Номер счета” мы создали в шаблоне элемент типа Character String с именем InvoiceNumber. По аналогии с элементом поиска поля даты, в секции Advanced pre-search relations задаем условия поиска поля “Номер счета” в виде массива прямоугольников.

let Header = InvoiceGroup.InvoiceHeader;

if not Header.IsNull then

{ let rect1 = Rect (Header.Rect.Right, Header.Rect.Top-20dt,

PageRect.Right, Header.Rect.Bottom+20dt);

let rect2 = Rect (Header.Rect.Left - 200dt, Header.Rect.Bottom,

Header.Rect.Right + 150dt, Header.Rect.Bottom+200dt);

RectArray ar;

ar = RectArray( rect1 );

ar.Add( rect2 );

RestrictSearchArea( ar );

}

else

{ Above: PageRect.Top + PageRect.Height/2;

}

Nearest: Header;

Кроме того, мы задали в этом коде еще одно условие. Мы сообщили программе, что элемент InvoiceNumber является ближайшим к элементу заголовка.

После запуска процедуры наложения шаблона мы видим, что на 2 и 4 страницах поле “Номер счета” найдено ошибочно. Причем на 4 странице – несмотря на то, что сам заголовок поля был найден правильно.

Примечание: В качестве альтернативы (имеется в виду для изображений, которые присутствуют в данном проекте) вместо Nearest: Header; можно было бы записать NearestY: Header.Rect.YCenter; т.е. этим мы бы сообщили программе, что искомое поле является ближайшим к центру заголовка по вертикали. Это могло бы решить проблему ошибочного нахождения поля “Номер счета” для страницы 4. Но таким способом на странице 2 проблему ошибочного нахождения поля решить не удается, поскольку из-за ошибочного нахождения заголовка “Номер счета” обнаруживается в поле даты.

Теперь посмотрим, как можно использовать в данном случае функцию FuzzyQuality.

Для этого мы создали проект 2.fsp (папка FuzzyAndNearest\Project2).

Этот проект с точки зрения настроек является практически полным аналогом одноименного проекта, рассмотренного ранее.

Но есть одно существенное отличие. В секции Advanced pre-search relations мы не стали использовать функцию Nearest. Вместо этого в секции Advanced post-search relations мы задали следующий код:

if not IsNull then

{ FuzzyQuality: Rect.Top - PageRect.Top, {0,0,0,50000} * dt;

FuzzyQuality: 500dt-Width, {0,0,0,100000} * dt;

if not InvoiceHeader.IsNull then

{ FuzzyQuality: Rect.XCenter - InvoiceHeader.Rect.XCenter, {-10000,0,0,50000} *dt;

FuzzyQuality: Rect.YCenter - InvoiceHeader.Rect.YCenter, {-10000,0,0,10000} *dt;

}

}

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

Запись FuzzyQuality: Rect.Top - PageRect.Top, {0,0,0,50000} * dt; означает, что если была сформирована ненулевая гипотеза элемента (предварительно идет проверка if not IsNull), то рассматривается расстояние между местом нахождения элемента и верхним краем страницы. Т.е. рассчитывается разница (Rect.Top - PageRect.Top) и проверяется вхождение этой разницы в нечеткий интервал {0, 0, 0, 50000}*dt. Такая запись нечеткого интервала означает прямую линейную зависимость между штрафом, налагаемым на качество гипотезы, и расстоянием между элементом и верхним краем страницы. Чем дальше элемент от верха, тем больше штрафуется соответствующая гипотеза. Как условно показано на схеме (а), при выбранном значении параметра, отвечающего за правую границу нечеткого интервала, максимальный штраф (1) будет соответствовать расстоянию 50000dt, а расстоянию в 1000 dot (1 dot = 1/300 дюйма) будет соответствовать штраф 0,02, в 100dt – штраф 0,002.

Примечание: При подборе параметров, соответствующих границам интервала, следует оценивать соответствующие фактические данные на тестовых изображениях. Чем меньше значение параметра, тем больше угол наклона прямой, тем больше будет штраф на единицу длины. Необходимо выбирать такие значения параметров (особенно, когда для элемента пишется несколько проверок с участием функции FuzzyQuality), при которых штраф правильной гипотезы не приведет к снижению ее качества до такой степени, что оно окажется ниже качества нулевой гипотезы. Если в результате штрафа качество всех гипотез (в том числе правильной гипотезы), окажется ниже качества нулевой гипотезы, то может быть выбрана нулевая гипотеза, т.е. элемент не будет найден.

(а)

Запись FuzzyQuality: 500dt - Width, {0,0,0,100000}*dt; означает, что рассматривается отличие ширины найденного объекта, соответствующего гипотезе от 500dt. Т.е. рассчитывается разница (500dt - Width) и проверяется вхождение этой разницы в нечеткий интервал {0, 0, 0, 100000}*dt. Чем уже найденный объект, тем больше штрафуется соответствующая гипотеза, т.е. при прочих равных условиях предпочтение отдается более длинным номерам счета. Это условие можно использовать на случай, когда на изображении в области поиска поля присутствует мусор. Если при распознавании программой он воспринимается как символ, соответствующий заданному алфавиту (это можно увидеть, например, на странице 2), то для него также может быть сформирована гипотеза, которую необходимо исключить из дальнейшего рассмотрения путем более сильного штрафования.

Примечание: Значение 500dt выбрано на глаз, исходя из того, что максимально возможная длина строки в поле “Номер счета” не превысит этого значения. Заданные в этом выражении параметры определяют, что максимальный штраф (0,005) соответствовал бы нулевой ширине поля “Номер счета”. Для всех прочих значений ширины между 0 и 500dt штраф будет ниже.

Запись FuzzyQuality: Rect.XCenter - InvoiceHeader.Rect.XCenter, {-10000,0,0,50000} *dt; означает, что если была сформирована ненулевая гипотеза элемента заголовка поля “Номер счета” (предварительно идет проверка if not InvoiceHeader.IsNull), то рассматривается расстояние между центром найденного элемента InvoiceNumber и центром заголовка InvoiceHeader по горизонтали. Т.е. рассчитывается разница (Rect.XCenter - InvoiceHeader.Rect.XCenter) и проверяется вхождение этой разницы в нечеткий интервал {-10000, 0, 0, 50000}*dt. Такая запись нечеткого интервала учитывает те случаи, когда поле “Номер счета” может располагаться под заголовком. В этом случае, чем дальше элементы будут друг от друга (причем допускается отклонение в любую сторону от центра заголовка), тем больше будет штрафоваться соответствующая гипотеза. Максимальное качество (штраф = 0) будет в случае, когда поле и заголовок четко центрированы по вертикали. Неравенство левой и правой границ нечеткого интервала объясняется простым наблюдением – номер счета обычно пишут рядом с полем заголовка и правее него, гораздо реже – под ним. Поэтому “правые” гипотезы, мы будем штрафовать меньше.

Как условно показано на схеме (б), при выбранных значениях параметров, отвечающих за левую и правую границы нечеткого интервала, максимальный штраф (1) будет соответствовать смещению поля “Номер счета” влево относительно заголовка на 10000dt и вправо относительно поля заголовка на 50000dt. Смещению в 1000 dot для “левого” интервала будет соответствовать штраф 0,1, а в 100dt – штраф 0,01. Для “правого” интервала размер штрафа составит 0,02 и 0,002 соответственно.

(b)

Запись FuzzyQuality: Rect.YCenter - InvoiceHeader.Rect.YCenter, {-10000,0,0,10000} *dt; аналогична предыдущей. Но она предусмотрена для случаев, когда поле “Номер счета” может находиться на одном уровне по горизонтали или даже чуть выше поля заголовка. Размер штрафа в данном случае одинаков при любом смещении относительно горизонтали. Границы интервала выбраны, исходя из той же логики, что и раньше – мы хотим обеспечить преимущество гипотез, соответствующих схеме “поле правее заголовка”. Однако, как видно в проекте, заданные настройки не помешали правильно найти номер счета, и в случае его размещения под заголовком (страница 3).

После наложения шаблона на все страницы видим, что оба искомых поля найдены успешно.

Таким образом, можно сделать вывод, что функция FuzzyQuality является более эффективным и гибким инструментом по сравнению с функциями группы Nearest, что особенно важно при обработке неформализованных форм.


Оптимизация поиска составного элемента

Если все гипотезы цепочки элементов, входящих в составной элемент (Group), имеют качество 1, то остальные гипотезы этих элементов не рассматриваются.

Примечание: Это делается в целях оптимизации работы шаблона, с тем, чтобы ускорить процедуру его наложения и избежать чрезмерного “разрастания” дерева гипотез. Хотя не всегда оптимальная с точки зрения программы, гипотеза соответствует искомому объекту изображения. Это может быть вызвано тем, что в ходе настройки соответствующих элементов были описаны свойства и условия поиска, которых оказалось недостаточно для однозначного определения местоположения искомого объекта. Поэтому, если такая ситуация произошла, необходимо в первую очередь проанализировать сделанные настройки.

Проиллюстрируем это на примере проекта GO.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\GO\1). Будем искать поле “Номер счета”.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

В проекте находятся 2 страницы:

Страница 1 – качество изображения хорошее;

Страница 2 – в заголовке искомого поля на изображении присутствует мусор.

Мы создали группу InvoiceGroup, в которой размещаются элементы для поиска заголовка поля (элемент типа Static Text с именем InvoiceHeader и значением “INVOICE”), и элемент типа Character String с именем InvoiceNumber - для поиска собственно поля “Номер счета”. На закалкде Relations элемента InvoiceNumber мы задали условия поиска поля данных относительно заголовка.

Примечание: Регистр написания значения заголовка в секции Search text может быть любой.

Обратим внимание, что строка “Invoice”, заданная в качестве значения для элемента InvoiceHeader, на тестовых изображениях присутствует трижды: в виде заголовка к полю “Номер счета”, в виде подстроки в заголовке “Invoice date:” и внизу счета, в виде подстроки в условиях платежа “Current invoice is…”. На основании чего можно предположить, что и сформированных гипотез при наложении шаблона также окажется три. Посмотрим, что получится при наложении шаблона на примере первого тестовые изображения в пакете.

После запуска процедуры наложения шаблона по команде Match увидим, что дерево гипотез внутри группы InvoiceGroup имеет всего одну завершенную цепочку, а не три, как мы предположили вначале. Причем завершенная цепочка гипотез вовсе не соответствует искомому заголовку.

Если посмотреть на свойства гипотез каждого элемента в сформированной цепочке, то можно увидеть что качество каждой гипотезы (Chain quality) равно 1. Т.е. в данном случае сработал принцип оптимизации - при нахождении идеальной с точки зрения качества (т.е. с качеством 1) цепочки генерация гипотез прекращается.

Примечание: Чтобы увидеть дерево гипотез группы, необходимо дважды щелкнуть мышью на имени составного элемента в дереве гипотез проекта, либо нажать enter, либо выбрать пункт Show Details локального меню.

Принцип, по которому при формировании гипотезы предпочтение отдается тому или иному объекту изображения (несмотря на одинаковое качество), заложен внутри алгоритма программы.

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

Во-первых, мы не задали никаких условий, где надо искать элемент InvoiceHeader. Во-вторых, при описании элемента InvoiceNumber мы задали, что числовая строка может быть любой длины (поскольку мы не можем предсказать, какой длины будет строка номера). Также мы задали, что искать ее надо правее элемента заголовка, примерно на одном с ним уровне (с небольшим запасом по высоте). Как можно видеть, для всех трех слов “invoice” эти условия соблюдаются. Поэтому после неверного нахождения заголовка автоматически последовало ошибочное обнаружение поля “Номер счета”. Т.е. необходимо каким-либо способом наложить дополнительные, ограничительные условия, с тем, чтобы конкретизировать программе задачу поиска, чтобы лучшей в итоге оказалась правильная гипотеза, а все прочие оказались бы оштрафованы. Т.е., чтобы шаблон оказался оптимальным не только по быстродействию.

Если рассматривать нашу форму, как формализованную, т.е., если предположить, что взаимное положение полей на всех изображениях, которые мы будем обрабатывать с помощью данного шаблона, будет одинаково, то самый простой способ – это “сообщить” программе, что нас интересует строка “Invoice”, расположенная ближе всех остальных к верхнему краю листа. Т.е. записать в секции Advanced pre-search relations элемента InvoiceHeader код: Nearest: PageRight; (попробуйте раскомментировать эту строчку в секции Advanced pre-search relations и посмотрите, как изменится поведение шаблона). Мы можем так поступить, поскольку заголовок искомого поля “Номер счета” является единственным ближайшим элементом к верхнему краю страницы. Если бы это было не так, или взаимное расположение полей на разных страницах менялось (т.е. форма не являлась формализованной), функция Nearest не помогла бы решить нашу задачу.

Для иллюстрации того, как можно по-другому решить нашу задачу, в том числе, если форма не является формализованной, мы создали проект GO.fsp (папка GO\2).

Как видно на всех изображениях, между числовой строкой и словом “invoice” расстояние будет наименьшим в искомом поле “Номер счета”. Соблюдение этой закономерности на всех страницах дает нам возможность повлиять на качество сформированных гипотез, если мы зададим в секции Advanced post-search relations элемента InvoiceNumber следующий код:

if (not InvoiceHeader.IsNull) and (not IsNull) then

{ FuzzyQuality: Rect.Left - InvoiceHeader.Rect.Right, {0, 0, 0, 10000}*dt; }

Он означает, что, если оба элемента найдены, для гипотезы элемента InvoiceNumber вычисляется разница между левой границей прямоугольника данного элемента и правой границей прямоугольника элемента InvoiceHeader (т.е. расстояние между найденными элементами). И проверяется вхождение этой разницы в нечеткий интервал {0, 0, 0, 10000}*dt. Такая запись нечеткого интервала означает прямую линейную зависимость между штрафом, налагаемым на качество гипотезы, и расстоянием между элементами. Т.е. чем дальше элементы находятся друг от друга, тем выше штрафующий коэффициент (функция FuzzyQuality возвращает качество, на которое домножается post-search качество гипотезы – его можно увидеть в окне свойств гипотезы). Значение правой границы интервала (10000dt) было подобрано опытным путем. При подборе следует учитывать данные о расстоянии между соответствующими объектами на тестовых изображениях.

Как следует из схемы, приведенной ниже, при заданных нами границах диапазона, максимальный штраф (1) будет соответствовать расстоянию 10000dt. Расстоянию в 1000dt будет соответствовать штраф 0,1. Расстоянию в 100dt – 0,01 и т.д.

Т.е для реальных расстояний порядка 100-300 dot, наблюдаемых на наших изображениях, вычисленный штрафующий коэффициент будет 0.99-0.97.

Примечание: Более подробная информация о функциях Nearest и FuzzyQuality приведена в разделе “Использование функций Nearest и FuzzyQuality для поиска элементов”.

На изображениях, которые находятся в нашем пакете, максимальному штрафу подверглась гипотеза, соответствующая ошибочно найденному полю “Номер счета” со значением 2005, а минимальному – гипотеза, соответствующая искомому полю. Поскольку наложение штрафа привело к тому, что Post-search quality всех гипотез элемента InvoiceNumber стало отличным от 1, при поиске лучшей цепочки теперь рассматриваются все гипотезы обоих элементов составного элемента InvoiceGroup.

Обратите внимание на то, что поле “Номер счета” было правильно найдено и на странице 2, несмотря на то, что в заголовке “INVOICE” присутствует мусор, приведший к появлению ошибки в этом заголовке, и, следовательно, к дополнительному штрафованию соответствующей гипотезы.


Свойство Optional составного элемента

При создании составного элемента по умолчанию флажок Optional element у него снят, т.е. элемент является по умолчанию обязательным. При наложении шаблона для обязательного составного элемента формируется ненулевая гипотеза, даже если для всех его элементов сформированы нулевые гипотезы. У такой гипотезы можно обратиться в коде Advanced-секций к гипотезам подэлементов для проверки их свойств. Если составной элемент является опциональным, то для него также формируется нулевая гипотеза по обычным правилам, т.е. когда не нашлось ни одной ненулевой гипотезы с качеством выше, чем качество нулевой.

Рекомендуется не устанавливать флажок Optional element для составного элемента. Дело в том, что если составной элемент необязательный (Optional element) и не найден (его качество оказалось ниже качества нулевой гипотезы или для него была вызвана функция Dontfind()), то обращение к какому-либо из подэлементов составного элемента вызовет ошибку, т.к. у нулевой гипотезы группы гипотезы подэлементов не определены. Чтобы избежать такой ошибки, нужно предварительно сделать проверку на IsNull составного элемента. В случае, если IsNull возвращает True, обращаться к подэлементам нельзя.

Зачем может понадобиться опциональный групповой элемент и его нулевая гипотеза? Это нужно, если на изображении целая группа полей может отсутствовать. Тогда при некоторых условиях искать ее бессмысленно. Таким образом, можно ускорить поиск элементов, вызвав метод DontFind() для группового элемента.

Примечание: Под обращением подразумевается написание кода в любой из секций на закладке Advanced или в свойствах блока в окне Expression. Если обращение к свойствам подэлемента составного элемента происходит при задании условий поиска в секции Relations, то проверка на IsNull осуществляется автоматически. В этом можно убедиться, нажав кнопку Code на закладке Advanced.

Для иллюстрации был создан проект GroupSample.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\Optional Group).

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

В диалоге свойств составного элемента InvoiceRequisiteGroup мы установили флажок Optional element. На закладке Advanced в секции Advanced pre-search relations задали следующий код:

if FormID.IsNull then Dontfind();

Мы проверяем наличие элемента - идентификатора типа формы. С помощью элемента FormID, созданного перед составным элементом InvoiceRequisiteGroup, ищем статический текст с определенным значением (“ID2015”). Если значение идентификатора на форме совпадает со значением, заданным в секции Search text, то для элемента FormID формируется ненулевая гипотеза. Иначе статический текст FormID не находится и мы сообщаем программе, что не надо искать составной элемент InvoiceRequisiteGroup. Т.е. мы таким способом сформировали нулевую гипотезу составного элемента InvoiceRequisiteGroup, который является необязательным.

В проекте создан элемент TotalSumHeader для поиска заголовка поля суммы. В секции Advanced pre-search relations этого элемента задан код:

Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;

Он означает, что поиск заголовка будет идти ниже заголовка поля даты, описанного элементом InvoiceDateHeader. А этот элемент в свою очередь является подэлементом составного элемента InvoiceRequisiteGroup.

Запустим процедуру наложения шаблона на обеих страницах пакета. Для страницы 1 процедура наложения прошла успешно. А при попытке наложить шаблон на страницу 2 программа выдала сообщение об ошибке: “Page 2: Error in element “SearchElements.TotalSumHeader”, Advanced generator parameters section: Attempt to access undefined hypothesis: SearchElements.InvoiceRequisiteGroup”.

Это произошло потому, что на второй странице значение идентификатора формы равно ID 2589. Поскольку это значение отличается от заданного в свойствах элемента FormID, для составного элемента InvoiceRequisiteGroup, благодаря вызову функции Dontfind(), оказалась сформирована нулевая гипотеза. Т.е. мы в коде попытались обратиться к несуществующей гипотезе.

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

if not( SearchElements.InvoiceRequisiteGroup.IsNull ) then

{ Below: SearchElements.InvoiceRequisiteGroup.InvoiceDateHeader, 0 * dot;}

Примечание: Если закомментировать код, приведенный в секции Advanced pre-search relations и включить флажок рядом с аналогичным условием поиска элемента TotalSumHeader в секции Relations, то, нажав кнопку Code на закладке Advanced, можно увидеть, что автоматически скомпилированный код уже будет содержать проверку на IsNull.


Поиск цифровых строк

Для поиска цифровых строк используют элемент типа Character String. При очень хорошем качестве изображений в качестве словаря можно задать регулярное выражение. В случае, когда качество изображений в пакете варьируется, необходимо задать список символов, которые могут содержаться в соответствующем поле. При неудовлетворительном качестве изображения или заполнения цифры могут распознаваться, как другие символы. Например, “8” может быть распознана как “В”, “7” как “?”, “5” как “S”, “4” как “H”, комбинация букв “LI” (или “Ч” в случае кириллицы), “1” как “I”, “0” как “О” или “С” и т.д. Это может происходить, например, при “слипании” цифр, что довольно часто наблюдается при заполнении на пишущей машинке.

В принципе степень “похожести” результата распознавания на оригинальный символ очень сильно зависит от качества изображения. Если на всех или большинстве обрабатываемых изображениях прослеживается тенденция ошибочного распознавания тех или иных символов, то для правильного нахождения соответствующего поля данных рекомендуется добавить обнаруженные варианты распознавания в разрешенный алфавит в окне Edit Alphabet соответствующего элемента Character String. Задавая эти символы, вы сообщаете программе, что в случае их обнаружения в области поиска, за них не следует штрафовать соответствующую гипотезу.

Примечание: Безусловно, нет необходимости задавать ВСЕ возможные варианты распознавания. Если качество изображений плохое, то просмотр всех изображений с целью выявления таких ошибок может вылиться в трудоемкую задачу. Если результаты распознавания цифровых строк из-за плохого качества непредсказуемы, то следует при поиске поля опираться не на допустимый набор символов, а на другие свойства элемента, такие как длина строки, длина пробела внутри строки и пр.

Необходимо задать символы, похожие по начертанию на цифры. Для них вероятность ошибочного распознавания выше, чем для всех остальных. При необходимости можно задать и другие символы, если распознавание их вместо цифр происходит регулярно.

Проиллюстрируем это на примере проекта 1.fsp (папка Digital strings\Project1).

В проекте находятся 3 страницы.

Страница 1 – цифра 4 распознана как комбинация букв “LI”;

Страница 2 – подстрока 13 распознана как буква “е”;

Страница 3 – цифра 0 распознана как “a”, 2 и 5 распознаны как “S”, 6 и 8 – как “B”.

Для нахождения цифровой строки мы создали элемент типа Character String с именем DigitalString и задали в качестве алфавита только цифры. Допустимый процент неалфавитных символов мы задали 20.

После запуска процедуры наложения шаблона на всех страницах цифровое поле на странице 3 оказалось найдено не полностью. Качество гипотезы составило примерно 0,98. На страницах 1 и 2 строка оказалась найдена. Но в силу того, что в ней были обнаружены символы, не заданные в алфавите, соответствующие гипотезы оказались оштрафованы и составили примерно 0,978 и 0,982 соответственно.

Теперь посмотрим, каков будет результат наложения шаблона в случае, если дополнить алфавит символами, которые были распознаны вместо цифр: L, I, e, a, B, S.

Результат наложения шаблона можно увидеть в проекте 2.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\Digital strings\Project2). Все остальные настройки в обоих проектах совпадают.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Как видно в пакете на странице 3 строка теперь находится целиком. Качество найденных гипотез на всех страницах составило 1.


Вспомогательный элемент с нулевой гипотезой – как средство упрощения гибкого описания

Данный прием можно использовать, когда необходимо проверять одни и те же громоздкие условия при поиске нескольких элементов. Суть приема в том, что проверка условий или необходимые сложные вычисления производятся один раз в некотором вспомогательном элементе. В результате проверки условий данный элемент либо ищется, либо не ищется, так что наличие найденной или ненайденной гипотезы выполняет роль флага, сигнализирующего о выполнении или невыполнении условий. Данный вспомогательный элемент создается так, чтобы он всегда находил что-нибудь на изображениях, если специально не выполнить команду DontFind(), т.е. «не искать». Количество гипотез элемента при этом должно быть небольшим (во избежание разрастания дерева гипотез и замедления наложения шаблона). Для этих целей можно использовать, например, элементы типа Object Collection или Paragraph, для которых всегда формируется одна гипотеза, в которую включаются все объекты заданного типа из области поиска. В секции Advanced pre-search relations фиктивного элемента пишем набор условий, выполнение которых мы хотим проверять для нескольких интересующих нас элементов, находящихся в дереве проекта ниже фиктивного элемента. Если все заданные условия оказались соблюдены, говорим программе, что фиктивный элемент искать не надо (вызываем функцию Dontfind()). В этом случае для фиктивного элемента будет сформирована нулевая гипотеза, и это будет служить признаком выполнения всех заданных условий при поиске других элементов. Т.е. вместо того, чтобы снова проверять одни и те же громоздкие условия, при поиске элементов просто надо осуществить проверку фиктивного элемента на IsNull.

Примечание 1: Данный прием позволяет делать код более наглядным. Кроме того, если необходимо отредактировать заданные условия, это необходимо выполнить только при описании одного фиктивного элемента. Это снижает вероятность появления ошибок в отличие от ситуации многократного дублирования громоздкого кода, которая, практически, неизбежно приведет к появлению ошибок, как логических, так и синтаксических.

Примечание 2: В последующих версиях продукта планируется поддержать создание переменных в области видимости подэлементов групп. Таким образом, результат проверки условий можно будет передавать в значениях переменных различных типов. Предлагаемый прием является временным решением (workaround), позволяющим упростить код advanced-секций в текущей версии FlexiLayoutStudio.

Проиллюстрируем данный прием на примере проекта 1.fsp (папка %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\Tips and Tricks\Auxiliary element). На данных изображениях будем искать поля “Номер счета”, “Дата счета”, “Название компании”, “Адрес компании”.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Допустим, нам необходимо обрабатывать счета двух типов:

Поля “Название компании” и “Адрес компании” находятся выше поля “Номер счета”;

Поля “Название компании” и “Адрес компании” находятся ниже поля “Номер счета”.

Как видно на изображениях, поля “Название компании” и “Адрес компании” не имеют заголовков, что не позволяет использовать стандартный прием поиска поля данных относительно его заголовка. Но прослеживается определенная закономерность: когда поле даты расположено правее, номера счета, реквизиты компании располагаются под полем “Номер счета” (страницы 1 и 3), а когда поле даты находится под полем счета, реквизиты компании находятся над полем “Номер счета” (страницы 2 и 4).

Исходя из обнаруженной закономерности, будет логично сначала определять местоположение полей “Номер счета” и “Дата счета”. А потом, искать два остальных поля относительно найденных полей, анализируя их взаимное расположение.

В проекте создан составной элемент InvoiceGroup, в котором находятся элементы (InvoiceHeader, InvoiceNum, DateHeader и составной элемент DateGroup), необходимые для поиска заголовков и самих полей “Номер счета” и “Дата счета”.

Примечание: Более подробную информацию о групповом подходе, применяемом при поиске полей даты, можно получить в разделе “Поиск даты в случае хорошего и плохого распознавания”. Подробнее остановимся лишь на описании условий поиска поля даты в данном проекте.

Как видно при просмотре изображений, у поля даты не всегда присутствует заголовок. Поэтому необходимо для поиска поля даты задавать два набора условий: когда заголовок найден, и, когда заголовок не найден (частный случай - когда на самом деле он на странице присутствует, но не обнаружен, например, из-за мусора).

if not DateHeader.IsNull then

{ RightOf: DateHeader.Rect.Right;

Below: DateHeader.Rect.Top - 30dt;

Above: DateHeader.Rect.Bottom + 30dt;

}

else

{ RectArray ar;

Let ar1 = Rect (InvoiceNum.Rect.Right, InvoiceNum.Rect.Top-30dt, PageRect.Right, InvoiceNum.Rect.Bottom + 30dt);

Let ar2 = Rect (InvoiceHeader.Rect.Left, InvoiceHeader.Rect.Bottom, InvoiceHeader.Rect.Right + 300dt, InvoiceHeader.Rect.Bottom + 150dt);

ar = RectArray (ar1);

ar.Add (ar2);

RestrictSearchArea (ar);

}

Если заголовок поля даты найден (проверяется условие if not DateHeader.IsNull), процедура поиска будет идти относительно собственного заголовка поля даты: правее заголовка, примерно на одном с ним уровне, допускается незначительный запас по вертикали:

{ RightOf: DateHeader.Rect.Right;

Below: DateHeader.Rect.Top - 30dt;

Above: DateHeader.Rect.Bottom + 30dt;

}

Иначе область поиска разбивается на две прямоугольных области: правее номера счета, на одном с ним уровне и под полем счета.

Примечание: Для простоты мы полагаем, что у нас изображения хорошего качества, и на них всегда находится поле номера счета и его заголовок. На самом деле, перед обращением к свойствам этих элементов следовало бы осуществить их проверку на IsNull, поскольку, если элементы окажутся не найдены, поиск будет вестись относительно областей поиска соответствующих элементов.

В секции Advanced post-search relations элемента Date мы написали следующий код:

if (DateHeader.IsNull) and (not IsNull) then

{if (not InvoiceHeader.IsNull) then

{ FuzzyQuality: Rect.Left - InvoiceHeader.Rect.Right, {0, 0, 0, 50000}*dt;

FuzzyQuality: Rect.Top - InvoiceHeader.Rect.Bottom, {-50000, 0, 0, 50000}*dt;

}

if (not InvoiceNum.IsNull) then

{ FuzzyQuality: Rect.Left - InvoiceNum.Rect.Right, {0, 0, 0, 50000}*dt;

FuzzyQuality: Rect.Top - InvoiceNum.Rect.Bottom, {-50000, 0, 0, 50000}*dt;

}

}

Он позволяет влиять на качество гипотезы даты в зависимости от ее удаленности от заголовка поля счета и самого поля “Номер счета” в случае, если заголовок самого поля даты не найден. Чем больше расстояние до указанных полей, тем сильнее будут оштрафованы соответствующие гипотезы. Т.е. мы ищем поле даты, ближайшее к полю номера счета.

Примечание: Подробная информация об использовании функции FuzzyQuality приведена в разделе “Использование функций Nearest и FuzzyQuality для поиска элементов”.

Для элемента DateAsString заданы аналогичные условия поиска. Только в секции Advanced post-search relations кроме указанного выше кода есть дополнительная строка.

FuzzyQuality: 600dt - Width, {0, 0, 0, 50000}*dt;

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

Кроме того, на закладке Search Constraints элемента DateAsString мы задали, что при поиске поля даты в виде строки необходимо исключать прямоугольник элемента InvoiceNum. Дело в том, что для простоты мы решили не дублировать для элемента DateAsString все те же условия поиска, которые мы задавали в секции Advanced pre-search relations для элемента Date. И мы определили область поиска как RestrictSearchArea (Date.Rect);. Т.е. сообщили программе, что поиск объектов элемента DateAsString необходимо вести в области нечеткого прямоугольника элемента Date. Как мы помним, область поиска поля даты в элементе Date была описана в виде массива прямоугольников. В случае, когда для элемента Date формируется нулевая гипотеза, в качестве прямоугольника (Rect) данного элемента берется описывающий прямоугольник области поиска. Как можно видеть на изображении ниже, в него попадает и поле “Номер счета”, описываемое элементом InvoiceNum. При определенных условиях (например, при наличии большого количества мусора в поле даты) не исключена ситуация, когда вместо поля даты строковый элемент DateAsString обнаружит поле с номером счета, поскольку для данного элемента задан набор символов (в том числе цифры) без каких-либо ограничений по формату.

После описания элементов, необходимых для поиска полей “Номер счета” и “Дата счета”, можно уже приступать к поиску полей “Название компании” и “Адрес компании”.

В проекте создан элемент типа Paragraph с именем ShamElement, который играет роль вспомогательного элемента, используемого исключительно для проверки взаимного расположения полей “Номер счета” и “Дата счета”.

В секции Advanced pre-search relations вспомогательного элемента мы задали следующий код:

Let Date1 = InvoiceGroup.DateGroup.Date;

Let Date2 = InvoiceGroup.DateGroup.DateAsString;

Let DateGroup = InvoiceGroup.DateGroup;

Let InvoiceHeader = InvoiceGroup.InvoiceHeader;

Let InvoiceNumber = InvoiceGroup.InvoiceNum;

if ((not InvoiceHeader.IsNull) or (not InvoiceNumber.IsNull)) and

(

((Date1.IsNull == FALSE) and ((max (InvoiceHeader.Rect.YCenter - Date1.Rect.YCenter, Date1.Rect.YCenter - InvoiceHeader.Rect.YCenter ) < 30dt) or (max (InvoiceNumber.Rect.YCenter - Date1.Rect.YCenter, Date1.Rect.YCenter - InvoiceNumber.Rect.YCenter ) < 30dt)) and ((Date1.Rect.Left - InvoiceHeader.Rect.Right > 100dt) or (Date1.Rect.Left - InvoiceNumber.Rect.Right > 50dt)))

or

((Date2.IsNull == FALSE) and ((max (InvoiceHeader.Rect.YCenter - Date2.Rect.YCenter, Date2.Rect.YCenter - InvoiceHeader.Rect.YCenter ) < 30dt) or (max (InvoiceNumber.Rect.YCenter - Date2.Rect.YCenter, Date2.Rect.YCenter - InvoiceNumber.Rect.YCenter ) < 30dt)) and ((Date2.Rect.Left - InvoiceHeader.Rect.Right > 100dt) or (Date2.Rect.Left - InvoiceNumber.Rect.Right > 50dt)))

)

then

{ Dontfind(); }

else

{ Below: PageRect.Top; }

Несмотря на простоту условий, которые мы проверяем с помощью данного кода, он получился довольно громоздким. Смысл его сводится к следующему. Если поле даты, найденное с помощью одного из элементов Date или DateAsString, расположено правее поля номера счета, но на одном с ним уровне (допуском 30dt по вертикали), мы сообщаем программе, что вспомогательный элемент искать не будем, для него будет сформирована нулевая гипотеза. Во всех остальных случаях будет осуществляться поиск элемента ShamElement ниже верхнего края страницы. Поскольку мы создали вспомогательный элемент типа Paragraph и не задали никакие дополнительные условия поиска, в него войдут все текстовые объекты, присутствующие на странице и будет сформирована единственная гипотеза.

Интуитивно практически все проверяемые условия понятны. Поэтому подробнее остановимся лишь на некоторых, которые могут быть не вполне очевидны.

max (InvoiceHeader.Rect.YCenter - Date1.Rect.YCenter, Date1.Rect.YCenter - InvoiceHeader.Rect.YCenter ) < 30dt

Данное выражение проверяет, что поле даты (в данном случае, если она найдена с помощью элемента Date) расположено практически на одном уровне по вертикали с элементом заголовка поля “Номер счета”. Причем допустимо, чтобы дата располагалась немного выше или ниже заголовка (учитывается возможная погрешность заполнения и/или сканирования). Мы задали, что максимальное отклонение не должно превышать 30dt. Аналогично проверяется взаимное расположение по вертикали полей даты и номера счета.

Date1.Rect.Left - InvoiceHeader.Rect.Right > 100dt

Данное выражение проверяет, что поле даты расположено правее заголовка поля “Номер счета“ (координата левой границы даты больше координаты правой границы заголовка). Мы задали запас 100dt с учетом того, что между заголовком и датой должен находиться еще собственно номер счета. Аналогично проверяется расположение поля даты правее поля “Номер счета”.

Все условия проверки дублируются для элемента DateAsString.

Для проверки правильности написанного кода запустим процедуру наложения шаблона на всех страницах. Мы видим, что на страницах 1 и 3, на которых поле даты расположено правее номера счета, как и ожидалось, для элемента ShamElement оказалась сформирована нулевая гипотеза. А на остальных двух страницах оказались выделены текстовые фрагменты.

Для поиска реквизитов компании в проекте создан составной элемент CompanyGroup. В него вошли элемент CompanyName типа Character String (поскольку имя компании на тестовых изображениях пишется в одну строку) и элемент Address типа Paragraph для поиска блока адреса компании.

Использование вспомогательного элемента позволило максимально упростить код при описании условий поиска элемента в секции Advanced pre-search relations. Т.е. если вспомогательный элемент не найден (для него сформирована нулевая гипотеза), это служит признаком того, что поле даты расположено правее поля счета. В этом случае поиск поля “Название компании” будет осуществляться под полем “Номер счета”. Если вспомогательный элемент найден, поиск поля “Название компании” будет идти над полем “Номер счета”.

if ShamElement.IsNull then

{ Below: InvoiceGroup.InvoiceHeader;

Below: InvoiceGroup.InvoiceNum;

NearestY: PageRect.Top;

}

else

{ Above: InvoiceGroup.InvoiceHeader;

Above: InvoiceGroup.InvoiceNum;

}

Примечание: В данном случае мы можем использовать функцию Nearest, поскольку она позволяет однозначно и правильно определить поле названия компании (отсутствуют другие объекты, удовлетворяющие тем же условиям поиска).

В секции Advanced post-search relations элемента CompanyName мы задали следующий код.

if not IsNull then

{ FuzzyQuality: Rect.Left - PageRect.Left, {0, 0, 0, 50000}*dt;

FuzzyQuality: Rect.Top - PageRect.Top, {0, 0, 0, 50000}*dt;

FuzzyQuality: 100dt - Height, {0, 0, 0, 10000}*dt;

}

Данный код работает в том случае, когда осуществляется поиск однострочного поля “Название компании” над полем с номером счета. Как уже отмечалось ранее, искомые поля не имеют заголовков. В то же время взаимное расположение полей “Название компании” и “Адрес компании” на страницах 2 и 4 различно. И, как можно видеть, условиям Above: InvoiceGroup.InvoiceHeader; и Above: InvoiceGroup.InvoiceNum; соответствует не только строка с названием компании, но и строки в поле адреса.

Чтобы выбрать из множества сформированных гипотез единственную правильную, и используется код в секции Advanced post-search relations.

Записывая FuzzyQuality: Rect.Left - PageRect.Left, {0, 0, 0, 50000}*dt; и FuzzyQuality: Rect.Top -PageRect.Top, {0, 0, 0, 50000}*dt;, мы сообщаем программе, что сильнее необходимо штрафовать гипотезы, объекты которых находятся ближе к нижнему и правому краям изображения. Однако на странице 2 поле “Название компании” расположено левее поля адреса, но ниже его верхней строки. Поэтому описанных выше условий недостаточно, чтобы однозначно определить местоположение искомого поля “Название компании”. Поэтому мы записали еще одно условие.

FuzzyQuality: 100dt - Height, {0, 0, 0, 10000}*dt;

С помощью данной записи мы сообщаем программе, что необходимо проверять высоту строк для всех сформированных гипотез. Чем больше символы строки по высоте, тем выше качество соответствующей гипотезы.

После запуска процедуры наложения шаблона и просмотра результатов мы видим, что поле “Название компании” успешно найдено на всех страницах.

Для поиска поля адреса в секции Advanced pre-search relations элемента Address мы задали следующий код:

if ShamElement.IsNull then

{ Below: CompanyName;

Above: TotalSumHeader.Rect.Top;

}

else

{

Above: InvoiceGroup.InvoiceHeader;

Above: InvoiceGroup.InvoiceNum;

RightOf: CompanyName.Rect.Left;

Exclude: CompanyName;

}

Здесь мы опять прибегли к помощи вспомогательного элемента ShamElement, что позволило существенно упростить код.

На этом создание шаблона окончено. После запуска процедуры наложения на всех страницах пакета видим, что все поля успешно найдены.


Горячие клавиши

  • Меню File
  • Меню Edit
  • Меню View
  • Меню Batch
  • Меню Image
  • Меню FlexiLayout / Classifier
  • Меню Tools
  • Окно Image
  • Окно Hypotheses
  • Окно Batch
  • Окно FlexiLayout
  • Окно Properties

Меню File

Команда | Горячие клавиши
New Project | Ctrl+N
Open Project… | Ctrl+O
Save | Ctrl+S
Exit | Alt+X

К началу

Меню Edit

Команда | Горячие клавиши
Cut | Ctrl+X
Copy | Ctrl+C
Paste | Ctrl+V
Delete | Del
Select All | Ctrl+A

К началу

Меню View

Команда | Горячие клавиши
Batch | Alt+1
FlexiLayout / Classifier / Training | Alt+2
Properties | Alt+3
Image | Alt+4
Hypotheses | Alt+5

К началу

Меню Batch

Команда | Горячие клавиши
Match/Classify | Ctrl+E
Match Reference Document | Ctrl+Shift+E
Pre-Recognize | Ctrl+R
Delete Page Data… | Alt+Del

К началу

Меню Image

Команда | Горячие клавиши
Match | Ctrl+E
Next Page | Ctrl+NUM +
Previous Page | Ctrl+NUM -
Go to Page… | Ctrl+G
Next Document | Ctrl+Shift+NUM +
Previous Document | Ctrl+Shift+NUM -
Create New Block/Element | Ctrl+Space
Create Block | Alt+Space
Pre-Recognize | Ctrl+R
Hide Active Blocks or Elements | Ctrl+H
Image Window Scale>Zoom In | Ctrl+NUM*
Image Window Scale>Zoom Out | Ctrl+NUM/

К началу

Меню FlexiLayout / Classifier

Команда | Горячие клавиши
Disable | Ctrl+D
Train Element Parameters | Alt+S
Rename | F2
Test Element | Ctrl+T
Build | Ctrl+B

К началу

Меню Tools

Команда | Горячие клавиши
Find in Advanced Code… | Alt+F3
Options… | F12

К началу

Окно Image

Команда | Горячие клавиши
Match/Classify | Ctrl+E
Match Reference Document | Ctrl+Shift+E
Go to Page… | Ctrl+G
Pre-Recognize | Ctrl+R
Show Search Area | Alt+A
Hide Active Blocks or Elements | Ctrl+H
Delete Pages/Delete Active Boxes | Del
Scale>Zoom In | Ctrl+NUM*
Scale>Zoom Out | Ctrl+NUM/
Test Element | Ctrl+T
Properties… | Alt+Enter

К началу

Окно Batch

Команда | Горячие клавиши
Match/Classify | Ctrl+E
Match Reference Document | Ctrl+Shift+E
Delete Pages | Del
Delete Page Data… | Alt+Del
Properties… | Alt+Enter

К началу

Окно Hypotheses

Команда | Горячие клавиши
Show Details | Enter
Go One Level Up | Backspace
Expand Active | NUM +
Collapse Active | NUM -
Expand All | NUM *
Collapse All | Shift+NUM *
Show Search Area | Alt+A

К началу

Окно FlexiLayout

Команда | Горячие клавиши
Build FlexiLayout/Build Classifier | Ctrl+B
Cut | Ctrl+X
Copy | Ctrl+C
Paste | Ctrl+V
Delete | Del
Disable / Enable | Ctrl+D
Find in Code | Alt+F3
Test Element | Ctrl+T
Properties… | Alt+Enter

К началу

Окно Properties

Команда | Горячие клавиши
Copy value | Ctrl+C

К началу


Свойства объектов изображения, выделенных при предраспознавании

Данные свойства отображаются в окне Properties. Для того чтобы увидеть свойства объекта изображения выделите его в окне Image.

Совет. Свойства объектов изображения доступны только для чтения. Однако, значение свойства можно выделить и скопировать в диалог свойств элемента.

  • Recognized Words
  • Recognized Lines
  • Separator
  • Raw Objects
  • Barcode

Свойства объектов типа Recognized Word

Свойство | Описание
Object type | Указывается тип объекта - Text.
Surrounding rect | Указываются координаты прямоугольника, описанного вокруг объекта.
Width | Указывается ширина объекта.
Height | Указывается высота объекта.
Recognized text | Указывается текст, распознанный при предраспознавании.

К началу

Свойства объектов типа Recognized Line

Свойство | Описание
Object type | Указывается тип объекта - Recognized line.
Surrounding rect | Указываются координаты прямоугольника, описанного вокруг объекта.
Width | Указывается ширина объекта.
Height | Указывается высота объекта.
Recognized text | Указывается текст, распознанный при предраспознавании.

К началу

Свойства объектов типа Separator

Свойство | Описание
Object type | Указывается тип объекта - Separator.
Surrounding rect | Указываются координаты прямоугольника, описанного вокруг объекта.
Width | Указывается ширина объекта.
Height | Указывается высота объекта.
Orientation | Указывается направление разделителя: горизонтальное или вертикальное.

К началу

Свойства объектов типа Raw Objects

Свойство | Описание
Object type | Указывается тип объекта - Image (элементарный объект изображения).
Surrounding rect | Указываются координаты прямоугольника, описанного вокруг объекта.
Width | Указывается ширина объекта.
Height | Указывается высота объекта.
Data type Указывается тип элементарного объекта изображения:
  • Text,
  • Picture,
  • Punctuation mark,
  • Inverted text,
  • Checkmark.

К началу

Свойства объектов типа Barcode

Свойство | Описание
Object type | Указывается тип объекта - Barcode.
Surrounding rect | Указываются координаты прямоугольника, описанного вокруг объекта.
Width | Указывается ширина объекта.
Height | Указывается высота объекта.
Text | Указывается распознанное значение штрих-кода.
Type | Указывается тип штрих-кода.
Orientation Указывается ориентация штрих-кода:
  • Left-to-Right,
  • Bottom-to-Top,
  • Right-to-Left,
  • Top-to-Bottom.

К началу


Поддерживаемые форматы изображений

Тип | Цвет
BMP | ч/б, серый, цветной
PCX, DCX | ч/б, серый
PNG | ч/б, серый, цветной
JPEG, JPEG2000 | серый, цветной
TIFF ч/б – несжатый, CCITT3, CCITT3FAX, CCITT4, Packbits;
серый – несжатый, Packbits, JPEG;
цветной – несжатый, JPEG
PDF | Независимо от типа, файлы данного формата открываются только как изображения (требуется отдельная лицензия)
XPS | Цветной. Требуется Microsoft .Net Framework 3.0.
WIC-compatible | Цветной. Требуется наличие Windows Imaging Component (входит в Microsoft .Net Framework 3.0).
DjVu | ч/б, серый, цветной


Типы штрих-кодов, распознаваемых программой ABBYY FlexiLayout™ Studio

Программа ABBYY FlexiLayout Studio поддерживает распознавание штрих-кодов следующих типов:

  • Check Code 39,
  • Check Interleaved 25,
  • Codabar,
  • Code 128,
  • Code 39,
  • Code 39 without asterisk,
  • Code 93,
  • EAN 13,
  • EAN 8,
  • IATA-25,
  • Industrial 25,
  • Interleaved 25,
  • Matrix 25,
  • Patch Code,
  • PDF 417,
  • Postnet,
  • UCC-128,
  • UPC A,
  • UPC E,
  • QRCode,
  • Aztec,
  • DataMatrix.


Список поддерживаемых языков распознавания

Список OCR языков, поддерживаемых программой ABBYY FlexiLayout™ Studio

    • Abkhaz
    • Adyghe
    • Afrikaans
    • Agul
    • Albanian
    • Altai
    • Armenian (Eastern)
    • Armenian (Grabar)
    • Armenian (Western)
    • Avar
    • Aymara
    • Azeri (Cyrillic)
    • Azeri (Latin)
    • Bashkir
    • Basque
    • Belarusian
    • Bemba
    • Blackfoot
    • Breton
    • Bugotu
    • Bulgarian
    • Buryat
    • Catalan
    • Cebuano
    • Chamorro
    • Chechen
    • Chinese Simplified
    • Chinese Traditional
    • Chukchee
    • Chuvash
    • Corsican
    • Crimeam Tatar
    • Croatian
    • Crow
    • Czech
    • Dakota
    • Danish
    • Dargwa
    • Dungan
    • Dutch
    • Dutch (Belgian)
    • English
    • English Legal Terminology
    • English Medical Terminology
    • Eskimo (Cyrillic)
    • Eskimo (Latin)
    • Esperanto
    • Estonian
    • Even
    • Evenki
    • Faroese
    • Fijian
    • Finnish
    • French
    • Frisian
    • Friulian
    • Gagauz
    • Galician
    • Ganda
    • German
    • German (Luxembourg)
    • German (new spelling)
    • German Legal Terminology
    • German Legal Terminology (new spelling)
    • German Medical Terminology
    • German Medical Terminology (new spelling)
    • Greek
    • Guarani
    • Hani
    • Hausa
    • Hawaiian
    • Hebrew
    • Hungarian
    • Icelandic
    • Ido
    • Indonesian
    • Ingush
    • Interlingua
    • Irish
    • Italian
    • Japanese
    • Jingpo
    • Kabardian
    • Kalmyk
    • Karachay-balkar
    • Karakalpak
    • Kazub
    • Kawa
    • Kazakh
    • Khakass
    • Khanty
    • Kikuyu
    • Kirghiz
    • Kongo
    • Korean
    • Korean (Hangul)
    • Koryak
    • Kpelle
    • Kumyk
    • Kurdish
    • Lak
    • Latin
    • Latvian
    • Lezgi
    • Lithuanian
    • Luba
    • Macedonian
    • Malagasy
    • Malay (Malaysian)
    • Malinke
    • Maltese
    • Mansi
    • Maori
    • Mari
    • Maya
    • Miao
    • Minangkabau
    • Mohawk
    • Moldavian
    • Mongol
    • Mordvin
    • Nahuatl
    • Nenets
    • Nivkh
    • Nogay
    • Norwegian
    • Norwegian (Bokmal)
    • Norwegian (Nynorsk)
    • Nyanja
    • Occidental
    • Ojibway
    • Old English
    • Old French
    • Old German
    • Old Italian
    • Old Spanish
    • Ossetian
    • Papiamento
    • Polish
    • Portuguese
    • Portuguese (Brazilian)
    • Provencal
    • Quechua
    • Rhaeto-Romanic
    • Romanian
    • Romany
    • Rundi
    • Russian
    • Russian (Old Spelling)
    • Russian-English
    • Rwanda
    • Sami (Lappish)
    • Samoan
    • Scotish Gaelic
    • Selkup
    • Serbian (Cyrillic)
    • Serbian (Latin)
    • Shona
    • Slovak
    • Slovenian
    • Somali
    • Sorbian
    • Sotho
    • Spanish
    • Sunda
    • Swahili
    • Swazi
    • Swedish
    • Tabasaran
    • Tagalog
    • Tahitian
    • Tajik
    • Tatar
    • Thai
    • Tok Pisin
    • Tongan
    • Tswana
    • Tun
    • Turkish
    • Turkmen
    • Tuvinian
    • Udmurt
    • Uighur (Cyrillic)
    • Uighur (Latin)
    • Ukrainian
    • Uzbek (Cyrillic)
    • Uzbek (Latin)
    • Vietnamese
    • Welsh
    • Wolof
    • Xhosa
    • Yakut
    • Yiddish
    • Zapotec
    • Zulu


Диалог Options…

Диалог позволяет настроить цвета объектов и подсветки лексем в программе, выбрать единицы измерения, задать возможную ориентацию страниц в пакете, указать настройки, используемые при обучение шаблона гибкого описания, а также некоторые другие настройки. Диалог Options можно открыть из главного меню программы, выбрав пункт Tools>Options...

Показать диалог

Опция | Описание
Закладка Colors
Группа Layout colors
Позволяет настроить цвета объектов в программе: задать цвета разметки элементов, гипотез, области поиска и т.д. Для изменения цвета выделите нужный объект и нажмите на цветную кнопку. В появившемся диалоге выберите цвет.
Кнопки Reset и Reset All Кнопка Reset устанавливает значение по умолчанию для выбранного объекта.
Кнопка Reset All устанавливает значение по умолчанию для всех объектов.
Группа Text colors
Позволяет настроить цвета подсветки лексем при написании кода: задать цвета ключевых слов, переменных, комментариев и т.д. Для изменения цвета выделите нужный объект и нажмите на цветную кнопку. В появившемся диалоге выберите цвет.
Кнопки Reset и Reset All Кнопка Reset устанавливает значение по умолчанию для выбранного объекта.
Кнопка Reset All устанавливает значение по умолчанию для всех объектов.
Show image in black and white | Отображение цветных изображений в черно-белом режиме. Чтобы отображать изображения в цвете, снимите отметку с опции.
Закладка Orientation And Units
Группа Orientation correction
Correct orientations of pages Эта группа опций позволяет задать возможную ориентацию страниц в пакете. При выборе пункта меню Image>Correct Orientation программа будет автоматически пытаться подобрать ориентацию, согласно отмеченным здесь опциям и на основе выбранного языка предраспознавания. Если ни одна из опций не отмечена, ориентация не будет исправляться автоматически.
  • Rotated 180° - отметьте эту опцию, если в пакете могут встречаться страницы, перевернутые на 180°.
  • Rotated 90° clockwise - отметьте эту опцию, если в пакете могут встречаться страницы, повернутые на 90° по часовой стрелке.
  • Rotated 90° counterclockwise - отметьте эту опцию, если в пакете могут встречаться страницы, повернутые на 90° против часовой стрелки.
Группа Units
Позволяет выбрать единицы измерения, используемые в программе: dot, сантиметр, миллиметр, точка, дюйм. Все используемые величины (размеры элементов, расстояния) будут выражены в тех единицах измерения, которые выбраны в этом диалоге.
Закладка Training
Группа Navigation
Позволяет выбрать режим перехода по страницам при обучении шаблона гибкого описания. Можно перемещаться по страницам, на которых содержится:
  • any unmarked element - любой неразмеченный элемент
  • any unmarked field - любое неразмеченное поле
  • any unmarked static element - любой неразмеченный статический элемент
  • unmarked selected element - неразмеченный выбранный элемент
Группа Draft layout prediction
Predict layout automatically on navigation | Отметьте эту опцию, чтобы накладывать предварительный вариант описания при переходе по страницам.
Replace existing boxes on batch prediction | Отметьте эту опцию, если вы хотите удалять имеющиеся на изображении области при наложении предварительного варианта описания.
Add pages to training set automatically on navigation | Отметьте эту опцию для добавления страниц в набор, используемый при обучении, автоматически при перемещении по страницам.
Закладка Other
Группа Export
Отметьте эту опцию для автоматического увеличения версии при экспорте на единицу.
Группа Advanced code
Максимальное количество символов в каждом из полей закладки Advanced.
Группа Search area
Отметьте эту опцию для отображения области поиска.
Группа Prerecognition area
Отметьте эту опцию для отображения области предраспознавания.
Группа Appearance
Отметьте эту опцию для использования больших панелей инструментов. Для применения этой опции требуется перезапуск программы.


Редактор нечеткого интервала

Для упрощения задания нечеткого интервала в программе предусмотрен наглядный редактор нечеткого интервала. Редактор можно открыть из диалога свойств элемента Character String (закладка Character String, кнопка [image] ), а также из главного меню программы Tools>Fuzzy Interval Editor…

Показать диалог

В данном окне отображается наглядное графическое представление нечеткого интервала. По вертикали откладывается качество гипотезы, по горизонтали – линейный размер или количество символов. На графике также показаны координаты пересечения границ нечеткого интервала с горизонтальной осью.

Кнопки приближения и удаления позволяют изменить масштаб изображения нечеткого интервала. При этом происходит синхронное масштабирование изображения по горизонтальной и вертикальной оси. Также можно изменить масштаб выделенной области на изображении, используя кнопку "Zoom selected area". Кнопки [image] [image] [image] [image] позволяют сдвигать область в соответствующем направлении. Для отображения интервала по размеру области нажмите [image].

Ниже расположены поля, отображающие численное представление интервала. Интервал можно задать как на графике, редактируя его с помощью мыши, так и вводя численные значения в соответствующие поля.

Редактор нечеткого интервала может работать в двух режимах:

  1. Нечеткий интервал, используемый для единиц измерения длины, которые могут быть нецелыми. В этом случае в группе Interval type следует выбрать опцию Distance.

    Замечание. Если единицей измерения расстояния выбрана dot, то расстояние также указывается целыми числами.

  2. Нечеткий интервал для целых чисел, таких как длина строки в символах. В этом случае в группе Interval type следует выбрать опцию Integer.

    Замечание. Если редактор нечеткого интервала вызван из диалога свойств элемента Character String, то в зависимости от того, из какого поля он вызван, доступен только режим целых чисел для задания длины строки в символах, или только режим Distance для задания длины пробела.

Редактирование графика. Изменять интервал можно перемещая мышью зеленые маркеры вправо и влево. Можно перемещать наклонные участки, изменяя их угол наклона. При этом накладываются некоторые ограничения: нельзя переместить левый маркер правее правого и т.п. Численное представление синхронно подставляется в соответствующие поля внизу.

Редактирование в полях ввода. Поля Left, Left non-penalized, Right и Right non-penalized соответствуют представлению интервала в программе. Left и Right - крайние точки, Left non-penalized и Right non-penalized - нештрафуемые точки. Группы Left slope и Right slope позволяют задать угол наклона боковых участков как коэффициент штрафа за отход на расстояние Distance от нештрафуемой точки. Изменение параметров наклона передвигает крайнюю точку, не изменяя нештрафуемую точку. Изменение крайней и нештрафуемой точек приводит к изменению параметров наклона. При редактировании полей обновляется изображение и содержимое зависимых полей.

Результат работы с редактором нечеткого интервала

Если редактор нечеткого интервала вызван из диалога свойств элемента Character String, то при нажатии кнопки OK результат автоматически подставляется в соответствующее поле диалога свойств элемента.

Если редактор вызван из меню Tools, вы можете скопировать интервал из поля Result или Code. Поле Code предусмотрено специально для использования интервала при написании кода на закладке Advanced, например, при использовании нечеткого интервала в качестве аргумента функции FuzzyQuality. См. Использование функций Nearest и FuzzyQuality для поиска элементов.


Патенты

Патенты США № 5,490,216, 5,625,465, 5,768,416 и 6,094,505


Обучение на примерах

Настоящий раздел справки ABBYY FlexiLayout Studio предлагает три примера создания и отладки гибкого описания. Примеры содержат пошаговые инструкции, которые помогут вам при работе с программой.

Для простоты обучения данные примеры описывают одностраничные документы. Примеры обработки более сложных многостраничных документов можно найти в подкаталогах Contract, Invoice, Letter, Prices и др. каталога примеров %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS.

  • В первом примере описывается процесс создания гибкого описания для простейшей регистрационной формы. На данном примере вы научитесь создавать блоки и элементы различных типов, задавать простейшие условия поиска объектов изображения формы. Проект FlexiLayout Studio, содержащий тестовые изображения и отлаженное гибкое описание, находится в

    %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Halloween Form.

  • Во втором примере описывается процесс создания гибкого описания для формы с большим разнообразием полей. На ней вы сможете не только по шагам проследить процесс создания гибкого описания, но и разобрать некоторые нестандартные подходы, применяемые при описании местонахождения объектов изображения формы. Проект FlexiLayout Studio, содержащий тестовые изображения и отлаженное гибкое описание, находится в

    %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Recipe.

  • В третьем примере описывается процесс создания гибкого описания для простого счета. На ней вы научитесь создавать блоки и элементы табличного типа, а также познакомитесь с некоторыми подходами при работе с реальными изображениями. Изображения тестового пакета представляют собой типичные счета и содержат характерные для счетов поля данных, включая таблицу товаров. Таблица описана при помощи табличного блока и табличного элемента. Проект FlexiLayout Studio, содержащий тестовые изображения и отлаженное гибкое описание, находится в

    %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Invoice One-Page.

Замечание. Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.


Пример 1. Краткое описание формы Halloween Registration Form

Внимание! Для простоты в данном примере рассматривается одностраничный документ.

Данная форма является простейшим примером типичной регистрационной формы, на которой мы сможем по шагам проследить процесс создания гибкого описания. На данной форме мы научимся находить объекты изображения, соответствующие элементам типа Static Text, Character String, Barcode, Paragraph, Date, Separator, White Gap и Object Collection.

Конечной целью создания гибкого описания данной формы в FlexiLayout Studio является устойчивое нахождение на всех тестовых страницах местоположения следующих полей:

  • Name
  • Your Planet Name
  • Your spaceship number
  • Date you arrived at the Earth
  • Your identity number on the party
  • Your photo in fancy dress

Кроме того, необходимо добиться обнаружения текстового поля произвольной формы, в котором каждый гость приводит любую информацию, которую ему удалось найти по теме Halloween. В отличие от всех вышеперечисленных полей, заголовок этого текстового поля произволен.

Показать пример


Пример 1. Шаг 1. Создание нового проекта

Замечание. Проект - это набор файлов, создаваемый программой ABBYY FlexiLayout™ Studio и содержащий всю информацию о гибком описании FlexiLayout.

  1. Создайте новую папку Sample1.
  2. Запустите программу ABBYY FlexiLayout Studio.
  3. Создайте новый проект (выберите пункт меню File>New Project).
    Показать пример

  4. В открывшемся диалоге задайте имя проекта Sample1 и выберите тип проекта ABBYY FlexiLayout Project Files (*.fsp).

После создания проекта в папке Halloween Form будут созданы:

  • Sample1.fsp - файл проекта,
  • Sample1Batch – папка, в которую по умолчанию сохраняются изображения, добавляемые в пакет FlexiLayout,
  • Sample1Templates - папка, в которую по умолчанию сохраняется гибкое описание.


Пример 1. Шаг 2. Добавление изображений в пакет

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

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

  1. Перейдите в окно Batch.
  2. Выберите команду Add Images… в контекстном меню, либо в меню File основного меню программы.
Показать пример

  3. В диалоге Open Images нажмите кнопку Image Preprocessing Settings и в открывшемся окне отметьте опцию One document per file.
  4. Укажите файлы тестовых изображений.
    (файлы тестовых изображений первого примера хранятся в
    %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Halloween Form\Halloween FormBatch\<page number>\Images\bwPage.dat)

    Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

    Добавленные в пакет тестовые изображения отобразятся в окне Batch.

Показать пример

Замечание. При добавлении изображений можно сразу определить принцип эталонной сборки изображений в документы. Выбрав опцию One document per file, мы указываем программе, что каждое изображение является отдельным документом.
Подробнее об эталонной сборке см. Эталонная сборка страниц в документы


Пример 1. Шаг 3. Настройка свойств шаблона

Пример 1. Шаг 3. Настройка свойств гибкого описания

После создания нового проекта гибкое описание по умолчанию называется FlexiLayout1 (окно FlexiLayout).

Показать пример

Для удобства работы с гибким описанием рекомендуется его переименовать. Имя гибкого описания, задаваемое в программе ABBYY FlexiLayout Studio, определяет также имя шаблона, которое увидит пользователь в программе ABBYY FlexiCapture (после создания шаблона в программе ABBYY FlexiCapture на основе гибкого описания, созданного в ABBYY FlexiLayout Studio).

Для того чтобы задать свойства FlexiLayout (в том числе, для его переименования):

  1. Дважды щелкните по имени гибкого описания (в данном случае FlexiLayout1) левой кнопкой мыши (либо выберите Properties… в локальном меню, которое вызывается по нажатию правой кнопки мыши).
  2. Задайте имя гибкого описания в поле Name, например, RegistrationForm.

  3. Укажите параметры предраспознавания формы:

  • Text languages - наш документ является англоязычным, поэтому в качестве языка предраспознавания в списке выберите English.

  • В поле Text Type следует выбрать все необходимые способы заполнения документов, руководствуясь внешним видом тестовых изображений, или дополнительной информацией, получаемой от заказчика. В данном случае будем считать, что при заполнении документов не использовался ни матричный принтер, ни пишущая машинка. Поэтому оставляем Typographic (значение по умолчанию).

  • Режим предраспознавания Mode. При выборе режима следует руководствоваться в первую очередь качеством исходных изображений и размером шрифта.
    Изображения наших документов хорошего качества, на них нет мусора, на них практически отсутствуют текстовые участки, выполненные мелким шрифтом. Поэтому можно оставить режим Fast, предлагаемый по умолчанию. Это позволит ускорить процесс предраспознавания, как при отладке гибкого описания в программе FlexiLayout Studio, так и при наложении шаблона в программе ABBYY FlexiCapture. На этом процедура задания свойств гибкого описания закончена и можно приступать непосредственно к созданию элементов и блоков FlexiLayout.

    Multi-page parameters – наш документ является одностраничным. Поэтому задайте значения параметров Minimal number of pages и Maximal number of pages равными 1.

Показать пример

Для одностраничных документов нет необходимости в описании начала и конца документа с помощью предопределенных составных элементов Header и Footer. Поэтому их можно удалить из списка элементов гибкого описания.

Замечание. Для определения начала и конца документа в гибкое описание могут быть добавлены специальные элементы: Header и Footer. Если в процессе наложения гибкого описания не найден ни элемент Header ни элемент Footer, то число страниц в документе считается равным наибольшему числу страниц, указанному в свойствах гибкого описания. Для данного документа в свойствах гибкого описания мы указали 1.


Пример 1. Шаг 4. Предраспознавание

Перед созданием элементов гибкого описания необходимо понять, на какие объекты изображений формы мы можем опереться для поиска ее полей данных формы. Такими объектами могут служить только такие графические и/или текстовые фрагменты изображения, которые устойчиво находятся в процессе предраспознавания изображений формы.

Для того чтобы запустить процесс предраспознавания:

  1. Выделите все изображения в пакете.

  2. Выберите команду Pre-Recognize (меню Batch или локальное меню изображения).

    Показать пример

Замечание. Если тестовые изображения в пакете меняются и/или добавляются, необходимо перезапустить процедуру предраспознавания. Если предраспознавание изображения не было выполнено предварительно, то оно будет проделано в процессе наложения гибкого описания.


Пример 1. Шаг 5. Просмотр изображений и результатов предраспознавания

Откроем первую страницу пакета. Для этого дважды щелкните левой кнопкой мыши на соответствующей строке в окне Batch. Открытое изображение отобразится в окне Image в режиме Matched Layout.

По умолчанию результаты предраспознавания не видны на изображении страницы сразу после окончания предраспознавания.

Для просмотра результатов предраспознавания:

  • Выберите команду Show Image Objects в меню Image основного меню программы и укажите, какой тип объектов изображения вы хотите посмотреть на изображении.

    Показать пример

или

  • Выберите соответствующую кнопку на панели инструментов Extracted Objects.

Замечание. Также можно выбрать для просмотра все объекты Show All Objects.


Пример 1. Шаг 6. Предварительный анализ результатов предраспознавания и определение опорных элементов

Для анализа результатов предраспознавания бывает удобно просматривать объекты (изображения) каждого типа отдельно.

Нас интересуют только объекты которые, устойчиво обнаруживаются процедурой предраспознавания на каждом тестовом изображении, и которые впоследствии можно будет использовать в качестве опорных для поиска необходимых полей.

Предварительный просмотр результатов предраспознавания всех тестовых страниц показывает, что:

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

  2. На изображениях 3, 5 и 6 обнаруживаются разделители, отсутствующие на других изображениях. На них нельзя опираться при поиске полей формы.

  3. На изображениях 1 и 6 не все части фотографии распознаны как Image Object типа Picture. Поэтому для нахождения фотографии целиком поиска объекта типа Picture недостаточно, понадобятся дополнительные приемы. Их рассмотрим ниже при создании соответствующего элемента (Шаг 20: Описание поля Фотография).

Теперь можно приступать непосредственно к созданию и настройке опорных элементов и заданию критериев поиска блоков, соответствующих искомым полям.


Пример 1. Шаг 7. Создание идентификационного элемента

При обработке гибких форм в программе ABBYY FlexiCapture хотелось бы по возможности полностью исключить случайное распознавание форм, не относящихся к заданному типу. Одним из способов идентификации формы является задание, по крайней мере, одного обязательного элемента. Объект изображения, соответствующий этому элемент должен устойчиво обнаруживаться на всех документах данного типа (иначе гибкое описание не будет наложено на изображение).

В нашем случае в качестве идентификатора будем использовать четкий, хорошо распознающийся текст заголовка формы HALLOWEEN REGISTRATION FORM.

Замечание. Идентификационный элемент или идентификационный набор элементов можно описать в предопределенном составном элементе Header. В данном примере не рассматривается.

Заголовок формы нам понадобится исключительно для идентификации формы, а не для поиска полей, содержащих данные. Опишем его в шаблоне с помощью элемента типа Static Text.

Для того чтобы создать идентификационный элемент:

  1. Перейдите в окно FlexiLayout в главном окне программы ABBYY FlexiLayout Studio.

  2. В дереве FlexiLayout выделите SearchElements.

  3. Выберите команду Static Text в меню FlexiLayout>Add Element или в локальном меню элемента, пункт New.

  4. Задайте имя элемента IDHeader в поле Name.

  5. Выберите пункт Required element на закладке General (поскольку данный элемент мы решили сделать обязательным).

    Показать пример

  6. Перейдите на закладку Static Text.
    Показать пример

  7. В поле Search text укажите значение искомого текста HALLOWEEN REGISTRATION FORM.
    Ориентируясь на изображение первой страницы пакета, полагаем заголовок формы однострочным, поэтому запишем его без пробелов. Это позволит ускорить поиск однострочного статического текста.

  8. Задайте максимально допустимое количество ошибок в искомом тексте в процентах или в явной форме (числом). Зададим в поле Max error percentage максимально допустимый процент ошибок 20. Таким образом, для нашего искомого заголовка в 25 символов мы допускаем 5 ошибок.

Замечание. Подбор значения допустимого числа ошибок является творческим процессом и осуществляется путем подбора.


Пример 1. Шаг 8. Проверка нахождения заголовка формы, соответствующего идентификационному элементу

Для проверки обнаружения объекта, соответствующего идентификационному элементу IDHeader, необходимо наложить гибкое описание на каждое изображение пакета.

Для этого:

  1. Откройте каждое изображение пакета.

  2. Выберите команду Match (меню Image или локальное меню изображения).

При успешном наложении гибкого описания на изображении синим цветом выделяется регион объекта, соответствующего элементу IDHeader, а в окне Hypothethis сформированная гипотеза элемента IDHeader отображается значком [image]. При нажатии на него курсором мыши в окне Properties отображаются свойства гипотезы.

Показать пример

Просмотр результатов наложения гибкого описания на все изображения показывает, что на изображение 2 не удалось наложить гибкое описание. Причиной этого явился тот факт, что на данной странице заголовок написан в две строки, а в свойствах элемента IDHeader мы задали в качестве текста для поиска однострочный заголовок. (Гипотеза элемента отмечена значком [image].)


Пример 1. Шаг 9. Корректировка свойств идентификационного элемента

Для того, чтобы объект изображения, соответствующий идентификационному элементу устойчиво обнаруживался на всех документах, необходимо скорректировать свойства идентификационного элемента.

Для этого:

  1. Откройте диалог Properties со свойствами элемента.
  2. Перейдите на закладку Static Text.
    Показать пример

  3. Укажите значение поля Search text с пробелами: HALLOWEEN REGISTRATION FORM. Это будет означать, что для идентификации формы мы будем искать фразу, которая в общем случае может быть и не однострочной.

  4. Для задания многострочности искомой фразы отметьте опции Take spaces into account и Permit multiple lines.

  5. Задайте значение параметра Line break penalty равным 1. Это позволит сохранить качество сформированной гипотезы без изменения при переходе ее на следующую строку. Задание меньшего значения приведет к штрафованию гипотезы.

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


Пример 1. Шаг 10. Описание поля YOUR PLANET NAME

Результаты предразпознавания показывают, что на всех тестовых изображениях заголовки полей данных обнаруживаются устойчиво и являются уникальными в рамках данной формы. Кроме того, порядок следования полей на каждом изображении сохраняется, несмотря на различия в их абсолютном местоположении полей. Поэтому практически для настройки поиска всех полей имеет смысл:

  1. Создать элементы типа Static Text для поиска заголовков.

  2. Относительно них описать месторасположение элементов типа Character String, Paragraph, Barcode и т.д., созданных для поиска полей.

  3. Создать блоки (соответствующие полям), задав их месторасположение, совпадающим с регионами соответствующих опорных элементов.

Для того чтобы описать месторасположение блока, соответствующего полю Your Planet Name, необходимо:

  1. Создать элемент PlanetNameHeader (тип Static Text), соответствующий заголовку поля YOUR PLANET NAME.

  2. Создать элемент PlanetName (тип Character String), соответствующий самому полю YOUR PLANET NAME.

  3. Создать блок PlanetName (тип Text), соответствующий полю YOUR PLANET NAME.


Пример 1. Шаг 11. Описание заголовка поля YOUR PLANET NAME. Элемент PlanetNameHeader

Как можно заметить, полю, содержащему имя планеты, предшествует поле, содержащее имя гостя. Тем не менее, мы начнем именно с поиска поля YOUR PLANET NAME. Это необходимо для исключения неопределенности, которая может возникнуть, при поиске заголовков полей. Как можно видеть, слово NAME: входит в состав обоих заголовков. Поэтому при попытке найти слово NAME: без дополнительных ограничений будет сформировано несколько гипотез. Для избежания этой неоднозначности мы и будем искать сначала поле, содержащее имя планеты, а затем поле, содержащее имя гостя, наложив дополнительные ограничения на заголовок поля (Шаг 15).

Для того чтобы создать элемент PlanetNameHeader:

  1. Создайте элемент Static text с именем PlanetNameHeader.
    Оставим выбранным пункт Optional element. В отличие от элемента, соответствующего заголовку формы, который в целях идентификации был задан как обязательный, предполагается, что в общем случае все остальные элементы формы могут быть необязательными. Это позволяет формировать гипотезы (нулевые гипотезы), даже для тех элементов, для которых не будут найдены соответствующие объекты изображения.

    Показать пример

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста. Как можно видеть, на всех тестовых документах заголовок является однострочным. Поэтому мы можем написать заголовок поля без пробелов YOURPLANETNAME:.

  4. Задайте значение свойства Max error percentage равным 20, поскольку заголовок поля состоит из нескольких слов и является достаточно длинным.

Наложение гибкого описания показывает, что заголовок поля, содержащего имя планеты, успешно найден на всех тестовых изображениях.

Показать пример


Пример 1. Шаг 12. Описание поля YOUR PLANET NAME. Элемент PlanetName

Будем полагать, что значение поля YOUR PLANET NAME всегда является однострочным. Поскольку значение этого поля не является фиксированным, в отличие от заголовка поля, для его нахождения следует создать элемент типа Character String.

Для того чтобы создать элемент PlanetName:

  1. Создайте элемент типа Character String с именем PlanetName.

    Показать пример

  2. Выберите закладку Character String.

    Показать пример

  3. Задайте алфавит (все возможные символы, которые могут встретиться в названии планет и их спутников). Исходя из информации, полученной при просмотре тестовых изображений, предполагаем, что это - все символы латинского алфавита и круглые скобки.
    Для задания символов алфавита следует нажать кнопку Add… и выделить соответствующие символы в открывшемся диалоге Add New Alphabet.

Замечание. Выбранные символы отобразятся в столбце Character Set, поля Alphabets, закладки Character String.

  4. Задайте значение параметра Percentage of alphabet characters равным 100. Это значит, что при поиске объекта, соответствующего элементу PlanetName, в расчет будут приниматься только символы данного алфавита.

    Показать пример

Замечание. В общем случае для элемента может быть создано несколько разных алфавитов. В поле Percentage of alphabet characters можно задать максимально допустимую долю участия символов каждого из них в данном элементе.

  5. Снимите отметку с пункта Allow embedded hypotheses. Это позволит формировать гипотезы максимальной длины, удовлетворяющие всем условиям поиска. Иначе может быть сформировано несколько пересекающихся гипотез меньшей длины, каждая из которых состоит из кусочков, относящихся к одному из заданных алфавитов (с учетом параметра Percentage of non-alphabet characters, т.е. с добавлением допустимого числа неалфавитных символов), и удовлетворяет всем условиям поиска.

  6. В поле Percentage of non-alphabet characters задайте допустимую долю символов, не входящих в алфавит данного элемента, равную 10.
    Замечание. Значение данного свойства подбирается опытным путем и может быть изменено в процессе отладки гибкого описания.

  7. В поле Character count задайте нечеткий интервал {0, 3, 35, 100}, оценивающий длину цепочки символов. Предполагаем, что все возможные значения имен планет, которые могут встретиться в данном поле, будут включать от 3 до 35 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.

Замечание. Значение данного свойства подбирается опытным путем и может быть изменено в процессе отладки гибкого описания.

  8. Перейдите на закладку Relations.

    Показать пример

    В качестве опорного элемента (элемента, относительно которого задается положение искомого элемента) для элемента PlanetName будем использовать элемент PlanetNameHeader. Имя планеты всегда находится справа от заголовка поля, а также на одном уровне с ним. Поэтому помимо отношения правее, необходимо задать положение имени планеты относительно верхней и нижней границы элемента заголовка. Иначе в качестве гипотезы может быть найден любой текст, соответствующий заданному алфавиту, и лежащий в правой плоскости относительно элемента заголовка, в том числе выше или ниже него.
    Итак, будем искать имя планеты, заданное элементом PlanetName, справа от заголовка, заданного элементом PlanetNameHeader и находящееся на одном уровне с заголовком.

  10. Задайте положение элемента PlanetName справа от элемента PlanetNameHeader.
    Для этого нажмите кнопку Add и в открывшемся диалоговом окне выберите в поле Reference element элемент PlanetNameHeader. В выпадающем списке Type выберите значение Right of и оставьте значение свойства Offset равным 0. Нажмите кнопку Add Relation.

    Показать пример

  11. Задайте положение элемента PlanetName не ниже элемента PlanetNameHeader.

    Для этого нажмите кнопку Add и в открывшемся диалоговом окне выберите в поле Reference element элемент PlanetNameHeader. В выпадающем списке Type выберите значение Above и задайте значение свойства Offset равным -100 (значение подбирается опытным путем), чтобы описать область поиска с небольшим запасом по высоте заголовка. Отрицательное значение смещения позволяет задавать положение элемента выше нижней границы заголовка. Нажмите кнопку Add Relation.

  12. Задайте положение элемента PlanetName не выше элемента PlanetNameHeader.

    Для этого нажмите кнопку Add и в открывшемся диалоговом окне выберите в поле Reference element элемент PlanetNameHeader. В выпадающем списке Type выберите значение Below и задайте значение свойства Offset равным -100 (значение подбирается опытным путем), чтобы описать область поиска с небольшим запасом по высоте заголовка. Отрицательное значение смещения позволяет задавать положение элемента ниже верхней границы заголовка. Нажмите кнопку Add Relation.

Замечание. Неотрицательные смещения при указании в поле Reference boundary значения <whole> позволяют задавать только положение типа правее правой границы элемента, левее левой границы элемента, выше верхней границы элемента и ниже нижней границы элемента. Задание области поиска между верхней и нижней границами заголовка при указании в свойстве Reference boundary значений Top и Bottom с неотрицательным значением свойства Offset ограничивает область поиска высотой заголовка, что исключает обнаружение гипотез, слегка выходящих по вертикали за горизонтальные границы заголовка.


Пример 1. Шаг 13. Проверка нахождения поля, содержащего имя планеты

Для проверки правильности нахождения поля, соответствующего элементу PlanetName, перейдите в окно Batch. И для каждого изображения запустите процедуру наложения гибкого описания. Для этого:

  1. Откройте изображение.

  2. Выберите команду Match (меню Image или локальное меню изображения, окно Image).

Замечание. Для осуществления быстрой проверки достаточно выбрать команду Match в локальном меню пакета, предварительно выделив все необходимые изображения. А сами результаты можно просматривать в окне Image в режиме Matched Layout. Для более тщательной, но и более медленной проверки (с возможностью просмотра сформированных гипотез) необходимо выбрать команду Match, находясь непосредственно в режиме Matched Layout, для каждого открытого изображения отдельно.

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

Показать пример


Пример 1. Шаг 14. Описание поля YOUR PLANET NAME. Блок PlanetName

Для того чтобы создать блок, соответствующий полю YOUR PLANET NAME:

  1. Перейдите в окно FlexiLayout в главном окне программы ABBYY FlexiLayout Studio.

  2. В дереве FlexiLayout выделите объект Blocks.

  3. Выберите команду Add Block>Text в меню FlexiLayout (или в локальном меню New>Text).

    Показать пример

  4. В открывшемся диалоге Properties задайте имя блока, например, PlanetName в поле Name.

Замечание. Совпадение имени блока с именем элемента, соответствующего полю Your Planet Name не обязательно, но удобно для дальнейшей работы с гибким описанием.

  5. Выберите в качестве описания местоположения блока опцию Source element. В качестве исходного элемента выберите элемент PlanetName, нажав кнопку [image].

    Показать пример


Пример 1. Шаг 15. Описание поля NAME

Для того чтобы описать месторасположение блока, соответствующего полю NAME, необходимо:

  1. Создать элемент NameHeader (тип Static Text), соответствующий заголовку поля NAME.

  2. Создать элемент GuestName (тип Character String), соответствующий самому полю NAME.

  3. Создать блок GuestName, соответствующий полю NAME.

Процесс создания элементов и блока для данного поля аналогичен процессу создания элементов и блока для поля YOUR PLANET NAME (см. Шаг 10 - Шаг 14), поэтому мы остановимся более подробно лишь на отличительных особенностях:

  • При описании области поиска элемента NameHeader укажем, что он находится над элементом PlanetName Header. Тем самым мы исключаем возможность формирования ошибочной гипотезы, содержащей слово Name из заголовка Your planet name.

    Показать пример

  • В отличие от элемента PlanetName, зададим для элемента GuestName алфавит, состоящий исключительно из букв латинского алфавита и символа "-" . И в поле Character count зададим нечеткий интервал {0, 0, 50, INF}.

  • При описании области поиска элемента GuestName укажем в качестве опорного элемента элемент NameHeader.

  • При создании блока GuestName укажем в качестве исходного элемента элемент GuestName.


Пример 1. Шаг 16. Описание поля YOUR SPACESHIP NUMBER

Для того чтобы описать месторасположение блока, соответствующего полю YOUR SPACESHIP NUMBER, необходимо:

  1. Создать элемент SpaceShipHeader (тип Static Text), соответствующий заголовку поля YOUR SPACESHIP NUMBER.

  2. Создать элемент SpaceShip (тип Character String), соответствующий самому полю YOUR SPACESHIP NUMBER.

  3. Создать блок SpaceShip, соответствующий полю YOUR SPACESHIP NUMBER.

Процесс создания элементов и блока для данного поля аналогичен процессу создания элементов и блока для поля YOUR PLANET NAME (см. Шаг 10 - Шаг 14), поэтому мы остановимся более подробно лишь на отличительных особенностях:

  • В отличие от элемента PlanetName, зададим для элемента SpaceShip не алфавит, а регулярное выражение. Это обусловлено тем, что структура информации в поле YOUR SPACESHIP NUMBER одинакова на всех тестовых изображениях.
    Опишем номер космического корабля следующим регулярным выражением:

    [0-9]{5}[A-Z][A-Z][0-9]{2} (подробнее о задании регулярного выражения см. в справке к программе ABBYY FlexiCapture)

    Показать пример

  • При описании области поиска элемента SpaceShip укажем в качестве опорного элемента элемент SpaceShipHeader.

  • При создании блока SpaceShip укажем в качестве исходного элемента элемент SpaceShip.


Пример 1. Шаг 17. Описание поля DATE YOU ARRIVED AT THE EARTH

Для того чтобы описать месторасположение блока, соответствующего полю DATE YOU ARRIVED AT THE EARTH, необходимо:

  1. Создать элемент DateHeader (тип Static Text), соответствующий заголовку поля DATE YOU ARRIVED AT THE EARTH.

  2. Создать элемент ArrivalDate (тип Date), соответствующий самому полю DATE YOU ARRIVED AT THE EARTH.

  3. Создать блок ArrivalDate, соответствующий полю DATE YOU ARRIVED AT THE EARTH.

Процесс создания элементов и блока для данного поля аналогичен процессу создания элементов и блока для поля YOUR PLANET NAME (см. Шаг 10 - Шаг 14), поэтому мы остановимся более подробно лишь на отличительных особенностях:

  • В отличие от элемента PlanetNameHeader, укажем для элемента DateHeader значение поля Search text с пробелами: Date you arrived at the earth. Выберем опции Take spaces into account и Permit multiple lines и зададим значение свойства Line break penalty равным 1.

    Показать пример

  • Для поля DATE YOU ARRIVED AT THE EARTH (в отличие от поля YOUR PLANET NAME) создадим элемент ArrivalDate типа Date. Для элемента ArrivalDate на закладке Date следует указать все допустимые форматы записи даты. Предполагаем, что месяц будет всегда записан цифрами, а год всегда будет состоять из 4 цифр. Следовательно, отменим выбор пунктов Word (группа Month) и Two digits (группа Year). Остальные свойства оставим без изменения.

    Показать пример

  • При описании области поиска элемента ArrivalDate укажем в качестве опорного элемента элемент DateHeader.

  • При создании блока ArrivalDate в качестве исходного элемента выберем элемент ArrivalDate.


Пример 1. Шаг 18. Описание поля YOUR IDENTITY NUMBER ON THE PARTY

Для того чтобы описать месторасположение блока, соответствующего полю YOUR IDENTITY NUMBER ON THE PARTY, необходимо:

  1. Создать элемент BarcodeHeader (тип Static Text), соответствующий заголовку поля YOUR IDENTITY NUMBER ON THE PARTY.

  2. Создать элемент IdentityNumber (тип Barcode), соответствующий самому полю YOUR IDENTITY NUMBER ON THE PARTY.

  3. Создать блок IdentityNumber, соответствующий полю YOUR IDENTITY NUMBER ON THE PARTY.

Процесс создания элементов и блока для данного поля аналогичен процессу создания элементов и блока для поля YOUR PLANET NAME (см. Шаг 10 - Шаг 14), поэтому мы остановимся более подробно лишь на отличительных особенностях:

  • Для поля YOUR IDENTITY NUMBER ON THE PARTY (в отличие от поля YOUR PLANET NAME) создадим элемент IdentityNumber типа Barcode. Для элемента IdentityNumber на закладке Barcode укажем его тип EAN13 и ориентацию Left-to-Right.

    Показать пример

  • При создании блока IdentityNumber в качестве исходного элемента выберем элемент IdentityNumber.


Пример 1. Шаг 19. Описание поля ПРОИЗВОЛЬНЫЙ ТЕКСТ

При просмотре всех тестовых изображений можно заметить, что в отличие от всех случаев, рассмотренных выше, у поля ПРОИЗВОЛЬНЫЙ ТЕКСТ, располагающегося в нижней части формы, нет постоянного заголовка. Поэтому в качестве опорного объекта изображения нужно использовать не заголовок, а другие объекты. Для настройки нашего гибкого описания будем считать, что поле ПРОИЗВОЛЬНЫЙ ТЕКСТ содержит свой заголовок.

В качестве опорного элемента для элемента, созданного для поиска поля ПРОИЗВОЛЬНЫЙ ТЕКСТ, попробуем сначала использовать уже созданный элемент IdentityNumber, поскольку для всех тестовых изображений прослеживается закономерность размещения поля ПРОИЗВОЛЬНЫЙ ТЕКСТ ниже поля YOUR IDENTITY NUMBER ON THE PARTY.

Замечание. Как уже отмечалось выше, случайные разделители, присутствующие на некоторых страницах при поиске поля ПРОИЗВОЛЬНЫЙ ТЕКСТ использовать не следует.

Для того чтобы найти поле ПРОИЗВОЛЬНЫЙ ТЕКСТ, используя в качестве опорного элемент IdentityNumber необходимо:

  1. Создать элемент TextField типа Paragraph, соответствующий полю ПРОИЗВОЛЬНЫЙ ТЕКСТ.

  2. Задать положение элемента TextField на закладке Relations как Below элемента IdentityNumber.

При проверке нахождения поля ПРОИЗВОЛЬНЫЙ ТЕКСТ с помощью элемента IdentityNumber заметим, что на некоторых тестовых изображениях в сформированную гипотезу элемента TextField попадут также и цифры штрих-кода. Поэтому надо найти другой, более точный, способ описания местоположения поля ПРОИЗВОЛЬНЫЙ ТЕКСТ.

Создадим элемент типа White Gap с горизонтальной ориентацией, соответствующий просвету, находящемуся между штрих-кодом и произвольным текстом. Затем будем использовать его в качестве опорного для поиска поля ПРОИЗВОЛЬНЫЙ ТЕКСТ.

Для этого в дереве элементов элемент White Gap обязательно нужно поместить выше элемента TextField!

  1. Создайте элемент с именем BetweenGap типа White gap.

  2. На закладке White Gap укажите ориентацию элемента BetweenGap - Horizontal.

    Показать пример

  3. На закладке Relations укажите область поиска элемента BetweenGap как находящуюся ниже элемента IdentityNumber, но на расстоянии не более 200 dot от нижней границы элемента BarcodeHeader.

    Показать пример

  4. Создайте элемент с именем TextField типа Paragraph.

  5. Задайте положение элемента TextField на закладке Relations ниже (Below) элемента BetweenGap, Offset=0.

Наложив гибкое описание на все изображения пакета, заметим, что сформированная гипотеза элемента TextField не содержит лишних данных. Таким образом для элемента TextField будем использовать в качестве опорного элемент BetweenGap.

Для описания месторасположения блока, соответствующего полю ПРОИЗВОЛЬНЫЙ ТЕКСТ, создайте блок с именем TextField (тип Text), в качестве исходного элемента выберите элемент TextField.


Пример 1. Шаг 20. Описание поля YOUR PHOTO IN FANCY DRESS

Как уже отмечалось выше (Шаг 6), при просмотре результатов предраспознавания на изображениях 1 и 6 не все части фотографии распознаны как Image Object типа Picture.

Для получения полной фотографии найдем все типы Image Object, расположенные в области фотографии.

Для удобства описания всех частей фотографии и ограничения числа искомых гипотез объединим их в составной элемент и назовем его Photo.

Показать пример

Включим в элемент Photo (тип Group):

  • элемент PhotoPicture (тип Object collection), соответствующий фотографии,

  • элемент PhotoHeader (тип Static text), соответствующий заголовку YOUR PHOTO IN FANCY DRESS,

  • 4 разделителя вокруг фотографии, необходимые для ее поиска элемента.

Поскольку текст заголовка (YOUR PHOTO IN FANCY DRESS) является уникальным в данном документе, соответствующий ему элемент мы добавили первым, а разделители будем искать уже относительно него.

Для создания элемента, соответствующего заголовку:

  1. Создадим элемента с именем PhotoHeader типа Static text.

  2. Свойства элемента задаются по аналогии с заголовками полей, рассмотренными ранее.

Проверка показывает устойчивое обнаружение заголовка фотографии на всех тестовых изображениях.

Создадим элементы типа Separator для четырех разделителей вокруг фотографии и назовем их:

  • USeparator - верхний разделитель,

  • BSeparator - нижний разделитель,

  • LSeparator - левый разделитель,

  • RSeparator - правый разделитель,

На закладке Separator (диалог Properties) для каждого из 4 разделителей необходимо выбрать соответствующую ему ориентацию (Vertical или Horizontal). Пока остальные свойства разделителей на данной закладке оставим без изменения.

Показать пример

Теперь, ориентируясь на тестовые изображения, зададим область поиска для каждого из разделителей.

Для верхнего разделителя (элемент USeparator):

  • ниже заголовка фото, но не дальше, чем на 100 dot от его верхней границы (Below элемента PhotoHeader и Above элемента PhotoHeader, Offset = -100).

  • внутри области, которая не превышает по ширине длину заголовка, более чем на 80 dot с каждой стороны (Left of правой границы региона элемента PhotoHeader, Offset = -80, Element boundary = right и Right of левой границы элемента PhotoHeader, Offset = -80, Element boundary = left).

Для нижнего разделителя (элемент BSeparator) :

  • ниже, чем заголовок поля с именем гостя (Below элемента NameHeader),

  • выше, чем нижняя граница штрих–кода (Above элемента IdentityNumber, Reference boundary = bottom ) ,

  • внутри области, которая не превышает по ширине длину заголовка, более чем на 80 dot с каждой стороны (Left of правой границы элемента PhotoHeader, Offset = -80, Reference boundary = right и Right of левой границы элемента PhotoHeader, Offset = -80, Reference boundary = left).

Для левого разделителя (элемент LSeparator):

  • внутри области, которая по высоте может быть больше, чем расстояние между верхним и нижним разделителями, но не более чем на 50 dot с каждой стороны (Below элемента USeparator, Offset = -50 и Above элемента BSeparator, Offset = -50),

  • разделитель находится в окрестности левой границы верхнего разделителя, которая не может быть более 40 dot (Right of левой границы элемента USeparator, Offset = -20, Reference boundary = left и Left of левой границы элемента USeparator, Offset = -20, Reference boundary = left).

Для правого разделителя (элемент RSeparator):

  • внутри области, которая по высоте может быть больше, чем расстояние между верхним и нижним разделителями, но не более чем на 50 dot с каждой стороны (Below элемента USeparator, Offset = -50 и Above элемента BSeparator, Offset = -50),

  • в окрестности правой границы верхнего разделителя, которая не может быть более 40 dot (Right of правой границы элемента USeparator, Offset = -20, Reference boundary = right и Left of правой границы элемента USeparator, Offset = -20, Reference boundary = right).

Можно просмотреть, какими получились эти области поиска на данном изображении при наложении гибкого описания. Для этого в окне Tree of Hypotheses в локальном меню выделенной гипотезы выберите Show Search Area. Если условия были заданы с ошибкой, и область поиска получилась не там, где мы хотели, мы это сразу увидим. Или увидим, что даже для сформированной гипотезы область поиска стоит подкорректировать, например, она слишком мала и т.п.

Максимальный размер для всех разделителей определен опытным путем на основе изучения свойств объектов типа Separator, полученных в процессе предраспознавания.

Для того чтобы описать поле YOUR PHOTO IN FANCY DRESS:

  1. Создадим элемент с именем PhotoPicture типа Object collection.

  2. На закладке Relations зададим область поиска элемента PhotoPicture:

  • ниже верхнего разделителя (Below элемента USeparator),

  • выше нижнего разделителя (Above элемента BSeparator),

  • правее левого разделителя (Right of элемента LSeparator),

  • левее правого разделителя (Left of элемента RSeparator).

Далее создадим блок с именем PhotoPicture, в качестве исходного элемента выберем элемент Photo Picture.

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


Пример 1. Шаг 21. Экспорт гибкого описания

Перед тем, как подключить гибкое описание к шаблону в программе ABBYY FlexiCapture, его необходимо экспортировать в файл формата ABBYY FlexiLayout (*.afl).

Для того чтобы экспортировать гибкое описание:

  1. Выберите команду Export… в меню File.
  2. В открывшемся диалоге Export FlexiLayout укажите имя файла.

Полученное таким образом гибкое описание FlexiLayout можно использовать в программе ABBYY FlexiCapture.


Пример 1. Шаг 22. Подключение гибкого описания к определению документа в программе ABBYY FlexiCapture.

Экспортированное гибкое описание (файл формата ABBYY FlexiLayout) можно подключить к определению документа в программе ABBYY FlexiCapture. Для этого:

  1. Откройте программу ABBYY FlexiCapture.
  2. Создайте новый пакет или откройте существующий.
  3. Создайте новое определение документа или откройте существующее в Редакторе определения документа.

Замечание. Для того чтобы открыть существующее определение документа в Редакторе определения документа откройте диалог Определения документов (меню Проект > Определения документов...), в списке определений документов выберите нужное, нажмите кнопку Правка...

Показать пример

  3. Откройте диалог свойств раздела определения документа (Редактор определения документов, меню Вид > Свойства...).
  4. Перейдите на закладку Гибкое описание.
  5. Нажмите на кнопку Загрузить...
    Показать пример

  6. В открывшемся диалоге Открыть файл гибкого описания укажите файл гибкого описания (*.afl).

Замечание. Блоки определения документа будут созданы автоматически, в соответствии с гибким описанием. Для того чтобы увидеть блоки на изображении наложите определение документа (меню Сервис > Наложить раздел).


Пример 2. Краткое описание формы Easiest Recipes

Внимание! Для простоты в данном примере рассматривается одностраничный документ.

В данном руководстве ABBYY FlexiLayout Studio описывается процесс создания гибкого описания для документа с большим разнообразием полей по сравнению с Halloween Registration Form. Здесь Вы сможете не только по шагам проследить процесс создания гибкого описания, но и разобрать некоторые нестандартные подходы, применяемые при описании местонахождения объектов изображения документа.

Проект FlexiLayout Studio, содержащий тестовые изображения и отлаженное гибкое описание, находится в

%allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Recipe.

Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Конечной целью создания гибкого описания данной формы в ABBYY FlexiLayout Studio является устойчивое нахождение на всех тестовых страницах местоположения следующих полей:

  • Recipe Name
  • Recipe #
  • Ingredients
  • Cooking Time
  • Cooking Description
Показать пример


Пример 2. Шаг 1: Создание нового проекта

  1. Создайте новую папку Recipes.
  2. Запустите программу ABBYY FlexiLayout Studio.
  3. Создайте новый проект (File>New Project).
    Показать пример

  4. В открывшемся диалоге задайте имя проекта Sample2 и выберите тип проекта ABBYY FlexiLayout Project Files (*.fsp).

После создания проекта в папке Recipes будут созданы:

  • Sample2.fsp – файл проекта,
  • Sample2Batch – папка, в которую по умолчанию сохраняются изображения, добавляемые в пакет FlexiLayout,
  • Sample2Templates – папка, в которую по умолчанию сохраняется гибкое описание.


Пример 2. Шаг 2: Добавление изображений в пакет

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

  1. Перейдите в окно Batch.
  2. Выберите команду Add Images… в контекстном меню, либо в меню File основного меню программы.
Показать пример

  3. В диалоге Open Images нажмите кнопку Image Preprocessing Settings и в открывшемся окне отметьте опцию One document per file.
  4. Укажите файлы тестовых изображений.
    (тестовые изображения этого примера хранятся в
    %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Recipe\RecipeBatch\<page number>\Images\bwPage.dat))

    Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Добавленные в пакет тестовые изображения отобразятся в окне Batch.

Показать пример

Замечание: При добавлении изображений можно сразу определить принцип эталонной сборки изображений в документы. Выбрав опцию One document per file, мы указываем программе, что каждое изображение является отдельным документом. Подробнее об эталонной сборке см. Эталонная сборка страниц в документы.


Пример 2. Шаг 3: Настройка свойств гибкого описания

После создания нового проекта гибкое описание по умолчанию называется FlexiLayout1 (окно FlexiLayout).

Для удобства работы рекомендуется переименовать гибкое описание. Также необходимо указать параметры предраспознавания.

Для того чтобы задать свойства гибкого описания (в том числе, для его переименования):

  1. Дважды щелкните по имени гибкого описания (в данном случае FlexiLayout1) левой кнопкой мыши (либо выберите Properties… в локальном меню, которое вызывается по нажатию правой кнопки мыши).

  2. Задайте имя гибкого описания в поле Name, например, Recipe.

  3. Укажите параметры предраспознавания:

  • Text languages - наш документ является англоязычным, поэтому в качестве языка предраспознавания в списке выберите English.

  • В поле Text Type оставляем Typographic.

  • Выбираем режим предраспознавания Fast, предлагаемый по умолчанию.

Multi-page parameters – наш документ является одностраничным. Поэтому задайте значения параметров Minimum number of pages и Maximum number of pages равными 1.

Показать пример

Замечание. Более подробно о критериях выбора параметров предраспознавания см. Пример1, Шаг 3.

Для одностраничных документов нет необходимости в описании начала и конца документа с помощью предопределенных составных элементов Header и Footer. Поэтому их можно удалить из списка элементов гибкого описания.

Замечание. Для определения начала и конца документа в гибкое описание могут быть добавлены специальные элементы: Header и Footer. Если в процессе наложения гибкого описания не найден ни элемент Header ни элемент Footer, то число страниц в документе считается равным наибольшему числу страниц, указанному в свойствах гибкого описания. Для данного документа в свойствах гибкого описания мы указали 1.

На этом процедура задания свойств гибкого описания закончена и можно приступать непосредственно к созданию блоков и элементов.


Пример 2. Шаг 4: Предраспознавание

Перед созданием элементов необходимо понять, на какие объекты изображений документа мы можем опереться для поиска его полей. Такими объектами могут служить только такие графические и/или текстовые фрагменты изображения, которые устойчиво находятся в процессе предраспознавания изображений документа.

Для того чтобы запустить процесс предраспознавания:

  1. Выделите все изображения в пакете.

  2. Выберите команду Pre-Recognize (меню Batch или локальное меню изображения).

    Показать пример

Замечание. Если тестовые изображения в пакете меняются и/или добавляются, необходимо перезапустить процедуру предраспознавания. Если предраспознавание страницы не было выполнено предварительно, то оно будет проделано в процессе наложения гибкого описания.


Пример 2. Шаг 5: Просмотр изображений и результатов предраспознавания

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

Теперь можно приступать непосредственно к созданию элементов. Для этого перейдем окно FlexiLayout в главном окне программы ABBYY FlexiLayout Studio.

Замечание. Более подробно о просмотре страниц и результатах предраспознавания см. Пример1, шаг 5, шаг 6.

Замечание. Для каждого изображения пакета можно создать эталонную разметку, которая будет отражать желаемое расположение блоков на изображении. Эталонная разметка может быть создана вручную, также можно создать эталонную разметку на основе результатов наложения гибкого описания.

Эталонная разметка нужна на этапе отладки гибкого описания, она помогает создать по возможности оптимальное описание. Эталонная разметка дает возможность сравнивать результаты наложения гибкого описания и желаемое расположение блоков на каждом изображении пакета. Подробнее см. Эталонная разметка


Пример 2. Шаг 6: Создание идентификационного элемента

При обработке гибких документов в программе ABBYY FlexiCapture хотелось бы по возможности полностью исключить случайное распознавание форм, не относящихся к заданному типу. Одним из способов идентификации документов является задание, по крайней мере, одного обязательного элемента.

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

Замечание. Идентификационный элемент или идентификационный набор элементов можно описать в предопределенном составном элементе Header. (В данном примере не рассматривается).

Заголовок документа нам понадобится исключительно для идентификации документа, и он не будет впоследствии распознаваться в программе ABBYY FlexiCapture. Для его нахождения создадим в гибком описании элемент типа Static text.

Для того чтобы создать элемент:

  1. Перейдите в окно FlexiLayout в главном окне программы ABBYY FlexiLayout Studio.

  2. В ветви элементов выделите SearchElements.

  3. Выберите команду Add Element (меню FlexiLayout>Add Element>Static Text или в локальном меню элемента).

  4. Задайте имя элемента, например FormHeader, в поле Name.

  5. Выберите пункт Required element на закладке General (поскольку данный элемент мы решили сделать обязательным).

    Показать пример

  6. Перейдите на закладку Static Text.

    Показать пример

  7. В поле Search text укажите значение искомого текста.
    Как можно видеть, в пакете присутствуют тестовые изображения, содержащие в заголовке разный текст: Easiest Recipes и Easy to cook Recipes. В качестве значения зададим оба варианта текста заголовка.
    На всех тестовых изображениях заголовок формы однострочный. Поэтому в качестве искомого текста мы можем задать оба варианта текста заголовка без пробелов. Это позволит ускорить поиск однострочного статического текста. Для обозначения выбора из нескольких вариантов между ними ставится значок «|».

  8. Задайте максимально допустимое количество ошибок в искомой фразе в процентах или в явной форме (числом). Зададим в поле Max error percentage максимально допустимый процент ошибок 20. Таким образом, для нашего искомого заголовка в 14/17 символов мы допускаем 2/3 ошибки.

Замечание. Значение допустимого числа ошибок подбирается опытным путем.


Пример 2. Шаг 7: Проверка нахождения заголовка формы, соответствующего идентификационному элементу

Для проверки нахождения заголовка формы, соответствующего идентификационному элементу FormHeader, необходимо наложить гибкое описание на каждое изображение пакета.

Для этого:

  1. Откройте каждое изображение пакета.

  2. Выберите команду Match (меню Image или локальное меню изображения).

При успешном наложении гибкого описания в окне Tree of Hypotheses сформированная гипотеза отображается значком [image]. При нажатии на него курсором мыши на изображении синим цветом выделяется регион объекта, соответствующего элементу FormHeader, а в окне Properties отображаются свойства данной гипотезы.

Показать пример

Наложение гибкого описания показывает, что на некоторых изображениях был обнаружен не заголовок формы, а часть фразы, находящейся над заголовком. Как можно заметить фраза "Enjoy our collection of the easiest recipes from over 50 countries of the world." встречается почти на всех изображениях пакета. Чтобы исключить подобную ошибку надо скорректировать свойства идентификационного элемента. Поскольку заголовок формы находится всегда ниже фразы "Enjoy our collection of the easiest recipes from over 50 countries of the world.", то будем искать объект изображения, удовлетворяющий всем свойствам и ближайший к нижнему краю изображения.

Для того чтобы задать дополнительное условие поиска:

  1. Откройте диалог Properties со свойствами элемента FormHeader.

  2. Выберите закладку Advanced.

  3. В поле Advanced pre-search relations задайте дополнительное условие поиска Искать объект изображения, ближайший к нижнему краю изображения. На языке описания FlexiLayout данное условие выглядит следующим образом: NearestY: PageRect.Bottom;

Замечание. Данное условие также можно задать через интерфейс программы. Для этого перейдите на закладку Relations, отметьте опцию Nearest и в выпадающем списке To: выберите Page bottom edge.

Замечание. Функция Nearest указывает программе, что из нескольких гипотез элемента необходимо искать ближайшую к некоторому элементу или точке на изображении (сравнивается расстояние между центрами элементов). После ее срабатывания из нескольких рассматриваемых гипотез остается только одна.
Данная функция не учитывает качество гипотез, так как выбор происходит уже на этапе создания гипотез.

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


Пример 2. Шаг 8: Определение последовательности поиска полей Recipe Name и Recipe #

Обычно месторасположение поля документа ищется относительно заголовка этого поля. Но на нашей форме не у всех полей присутствуют заголовки, например, у поля Recipe Name он отсутствует. Поэтому поиск месторасположения поля Recipe Name следует организовать иным способом.

Например, можно попытаться найти его, как ближайший (снизу) к заголовку формы объект изображения. Однако, при просмотре тестовых изображений видно, что на изображении 6 ближайшим к заголовку формы является поле Recipe #:.

В данном случае сложно наложить дополнительные условия для поиска поля Recipe Name, так как поля Recipe Name и Recipe #: располагаются рядом друг с другом и имеют схожую структуру:

  1. Поле Recipe #: и его заголовок пишутся в одну строку, в которую могут входить те же символы, что и в название рецепта.

  2. Нельзя гарантировать, что длина строки, содержащей название рецепта, будет заведомо больше длины строки, содержащей заголовок поля Recipe #: и само поле.

Обратим внимание, что при предраспознавании заголовок поля Recipe #: обнаруживается устойчиво на всех тестовых изображениях. Поэтому будем искать сначала поле Recipe #:. А затем будем искать местоположение поля Recipe Name как ближайший (снизу) к заголовку формы объект изображения, исключая из области поиска регионы элементов, соответствующих полю Recipe #: и его заголовку.


Пример 2. Шаг 9: Описание поля Recipe #

На всех тестовых изображениях заголовок поля Recipe #: обнаруживается устойчиво и является уникальными в рамках данной формы. Поэтому для описания поля Recipe #: необходимы:

  1. элемент Recipe (тип Static Text), соответствующий заголовку поля Recipe #:.

  2. элемент RecipeNumber (тип Character String), соответствующий самому полю Recipe #:.

  3. блок RecipeNumber, соответствующий полю Recipe #:.


Пример 2. Шаг 10: Описание поля Recipe #. Элемент Recipe

Для того чтобы создать элемент Recipe:

  1. Создайте элемент Static text с именем Recipe.
    Оставим выбранным пункт Optional element. В отличие от заголовка формы, который в целях идентификации формы был задан как обязательный, предполагается, что в общем случае все остальные элементы формы могут быть необязательными. Это позволит сформировать гипотезы, даже для тех элементов, для которых не будут найдены соответствующие объекты изображения.

    Показать пример

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста. Как можно видеть, на всех тестовых формах заголовок является однострочным. Поэтому мы можем написать заголовок поля без пробелов Recipe#:.

  4. Задайте значение свойства Max error percentage равным 10, поскольку заголовок поля состоит всего из одного слова, поэтому в нем не может встретиться значительное число ошибок.

Проверка качества наложения гибкого описания показывает, что заголовок поля, содержащего номер рецепта, успешно находится на всех тестовых изображениях.


Пример 2. Шаг 11: Описание поля Recipe #. Элемент RecipeNumber

Будем полагать, что значение поля Recipe # всегда является однострочным. Поскольку значение этого поля не является фиксированным, в отличие от заголовка поля, для его нахождения следует определить элемент типа Character String.

Для того чтобы создать элемент RecipeNumber:

  1. Создайте элемент типа Character String с именем RecipeNumber.

    Показать пример

  2. Выберите закладку Character String.

    Показать пример

  3. Задайте алфавит (все возможные символы, которые могут встретиться в номере рецепта). Исходя из информации, полученной при просмотре тестовых изображений, предполагаем, что это - все заглавные буквы латинского алфавита и цифры. Причем их порядок и количественное соотношение произвольно.
    Для задания символов алфавита следует нажать кнопку Add… и выделить соответствующие символы в открывшемся диалоге Add New Alphabet.

Замечание. Выбранные символы отобразятся в столбце Character Set, поля Alphabets, закладки Character String.

  4. Задайте значение параметра Percentage of alphabet characters равным 1. Это значит, что при поиске элемента RecipeNumber в расчет будут приниматься только символы данного алфавита.

    Показать пример

Замечание. В общем случае для элемента может быть создано несколько разных алфавитов. В поле Percentage of alphabet characters можно задать максимально допустимую долю участия символов каждого из них в данном элементе.

  5. Снимите отметку с пункта Allow embedded hypotheses. Это позволит формировать гипотезы максимальной длины, удовлетворяющие всем условиям поиска. Иначе может быть сформировано несколько пересекающихся гипотез меньшей длины, каждая из которых состоит из кусочков, относящихся к одному из заданных алфавитов (с учетом параметра Percentage of non-alphabet characters, т.е. с добавлением допустимого числа неалфавитных символов), и удовлетворяет всем условиям поиска.

  6. В поле Percentage of non-alphabet characters задайте допустимую долю символов, не входящих в алфавит данного элемента, равную 0.2 (что означает 20%).

Замечание. Значение данного свойства подбирается опытным путем и может быть изменено в процессе отладки гибкого описания.

  7. В поле Character count задайте нечеткий интервал { 0, 8, 10, 16 }, оценивающий длину цепочки символов. Предполагаем, что длина номера составляет всегда 8 символов. Запишем с запасом, что длина номера должна находиться в интервале от 8 до 10 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.

Замечание. Значение данного свойства подбирается опытным путем и может быть изменено в процессе отладки гибкого описания.

  8. Перейдите на закладку Relations.

    Показать пример

    В качестве опорного элемента (элемента, относительно которого задается положение искомого элемента) для элемента RecipeNumber будем использовать элемент Recipe. Номер рецепта всегда находится справа от заголовка поля, а также на одном уровне с ним. Поэтому помимо отношения правее, необходимо задать положение номера рецепта относительно верхней и нижней границы элемента заголовка. Иначе в качестве гипотезы может быть найден любой текст, соответствующий заданному алфавиту, и лежащий в правой полуплоскости относительно элемента заголовка, в том числе выше или ниже него.
    Итак, будем искать номер рецепта, заданный элементом RecipeNumber, справа от заголовка, заданного элементом Recipe и находящийся на одном уровне с заголовком Recipe.

  10. Задайте положение элемента RecipeNumber справа от от правой границы элемента Recipe.
    Для этого нажмите кнопку Add и в открывшемся диалоговом окне выберите в поле Reference element элемент Recipe. В выпадающем списке Type выберите значение Right of, в выпадающем списке Reference boundary выберите значение Right и оставьте значение свойства Offset равным 0. Нажмите кнопку Add Relation.

    Показать пример

  11. Задайте положение элемента RecipeNumber не ниже элемента Recipe.

    Для этого нажмите кнопку Add и в открывшемся диалоговом окне выберите в поле Reference element элемент Recipe. В выпадающем списке Type выберите значение Above и задайте значение свойства Offset равным -50 (значение подбирается опытным путем), чтобы описать область поиска с небольшим запасом по высоте заголовка. Отрицательное значение смещения позволяет задавать положение нижней границы элемента ниже нижней границы заголовка. Нажмите кнопку Add Relation.

  12. Задайте положение элемента RecipeNumber не выше элемента Recipe.

    Для этого нажмите кнопку Add и в открывшемся диалоговом окне выберите в поле Reference element элемент Recipe. В выпадающем списке Type выберите значение Below и задайте значение свойства Offset равным -50 (значение подбирается опытным путем), чтобы описать область поиска с небольшим запасом по высоте заголовка. Отрицательное значение смещения позволяет задавать положение верхней границы элемента выше верхней границы заголовка. Нажмите кнопку Add Relation.

Замечание. Неотрицательные смещения при указании в поле Reference boundary значения <whole> позволяют задавать только положение типа правее правой границы элемента, левее левой границы элемента, выше верхней границы элемента и ниже нижней границы элемента. Задание области поиска между верхней и нижней границами заголовка при указании в свойстве Reference boundary значений Top и Bottom с неотрицательным значением свойства Offset ограничивает область поиска высотой заголовка, что исключает обнаружение гипотез, слегка выходящих по вертикали за горизонтальные границы заголовка.

Наложив гибкое описание, увидим, что поле, содержащее номер рецепта, успешно найдено на всех тестовых изображениях.


Пример 2. Шаг 12: Описание поля Recipe #. Блок RecipeNumber

Для последующего распознавания номера рецепта в программе ABBYY FlexiCapture необходимо создать соответствующий блок и задать его месторасположение.

Для того чтобы создать блок, соответствующий полю Recipe #:

  1. Перейдите в окно FlexiLayout в главном окне программы ABBYY FlexiLayout Studio.

  2. В дереве проекта выделите объект Blocks.

  3. Выберите команду Add Block>Text в меню FlexiLayout (или в локальном меню New>Text).

    Показать пример

  4. В открывшемся диалоге Properties задайте имя блока, например, RecipeNumber в поле Name.

Замечание. Совпадение имени блока с именем элемента, соответствующего полю Recipe # не обязательно, но удобно для дальнейшей работы с гибким описанием.

  5. Выберите в качестве описания местоположения блока опцию Source element. В качестве source element укажите элемент Recipe Number, нажав кнопку "…".

    Показать пример


Пример 2. Шаг 13: Описание поля Recipe Name

Будем искать местоположение поля RecipeName как ближайший (снизу) к заголовку формы объект изображения, исключая из области поиска регионы элементов Recipe и RecipeNumber (см. Шаг 8). Для этого необходимы:

  1. элемент RecipeName (тип Character String), соответствующий самому полю Recipe Name.

  2. блок RecipeName, соответствующий полю RecipeName.

Для того чтобы создать элемент RecipeName:

  1. Создайте элемент типа Character String с именем RecipeName.

  2. Выберите закладку Character String.

  3. Задайте алфавит. Исходя из информации, полученной при просмотре тестовых изображений, предполагаем, что это - все буквы латинского алфавита, цифры и символы «#», «-», «&», «.». Причем их порядок и количественное соотношение произвольно.

  4. Задайте значение параметра Percentage of alphabet characters равным 1.

  5. Снимите отметку с пункта Allow embedded hypotheses.

  6. В поле Percentage of non-alphabet characters задайте допустимую долю символов, не входящих в алфавит данного элемента, равную 0.2 (что означает 20%).

  7. В поле Character count задайте нечеткий интервал, оценивающий суммарную длину цепочки символов. Оставляем значение по умолчанию { -1, -1, INF, INF }. Таким образом, мы не накладываем никаких ограничений на длину цепочки символов.

  8. Перейдите на закладку Relations.
    На закладке Relations зададим, что название рецепта может находиться ниже нижней границы заголовка формы с отступом 100 dot, т.е. между заголовком формы и названием рецепта всегда есть зазор, не меньше 100 dot. Как можно видеть, на изображениях этим условиям поиска удовлетворяет каждая строка, расположенная ниже заголовка формы. Необходимо сузить область поиска.

  9. Перейдите на закладку Advanced.
    В поле Advanced pre-search relations задайте дополнительное условие поиска Искать строку, ближайшую к верхнему краю формы. На языке описания FlexiLayout данное условие выглядит следующим образом: NearestY: 0*dot;.
    В сочетании с условием поиска, заданным на закладке Relations, это позволяет сузить поиск до одной строки, ближайшей к заголовку формы.

    Замечание. Данное условие также можно задать через интерфейс программы. Для этого перейдите на закладку Relations, отметьте опцию Nearest и в выпадающем списке To выберите Page top edge.

    Показать пример

  10. Перейдите на закладку Search Constraints.

  11. Как отмечалось выше (см. Шаг 8), из области поиска элемента RecipeName необходимо исключить регионы элементов Recipe и RecipeNumber. Для этого добавьте в поле Exclude elements элементы Recipe и RecipeNumber, нажав кнопку Add… (рядом с полем Exclude elements). В открывшемся диалоге Select Element to Exclude выберите соответствующий элемент.

    Показать пример

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

Процесс создания блока RecipeName аналогичен процессу создания блока RecipeNumber. Отличие заключается в том, что для блока RecipeName в качестве исходного элемента необходимо указать элемент RecipeName.


Пример 2. Шаг 14: Описание поля Ingredients

Как можно видеть, на всех тестовых изображениях список ингредиентов представляет собой текст произвольной формы, всегда расположенный под заголовком поля Ingredients, но выше разделителя, расположенного над заголовком поля Cooking.

Для удобства описания вышеперечисленных объектов и ограничения числа гипотез необходимо объединить их в составной элемент типа Group. Для этого:

  1. Создайте составной элемент RecipeContents (тип Group).

  2. В составе элемента RecipeContents создайте элемент IngredientsHeader (тип Static text), соответствующий заголовку поля Ingredients. Свойства элемента задаются по аналогии со свойствами элемента Recipe (см. Шаг 10).

  3. В составе элемента RecipeContents создайте элемент Separator (тип Separator), соответствующий разделителю, расположенному над заголовком поля Cooking. В свойствах элемента (закладка Separator) укажите ориентацию разделителя - Horizontal. Задайте условия поиска (диалог свойств элемента, закладка Relations) - ниже, чем заголовок Ingredients: (Below элемента IngredientsHeader).
    При наложении гибкого описания можно увидеть, что иногда за разделитель принимается нижняя граница изображения.
    Во избежание подобной ситуации необходимо задать дополнительное условие поиска. Для этого в поле Advanced pre-search relations (диалог свойств элемента, закладка Advanced) задайте дополнительное условие поиска Искать разделитель ближайший к заголовку Ingredients:. На языке описания гибких шаблонов данное условие выглядит следующим образом: Nearest: SearchElements.RecipeContents.IngredientsHeader;

    Замечание. Данное условие также можно задать через интерфейс программы. Для этого перейдите на закладку Relations, отметьте опцию Nearest и в выпадающем списке To выберите Element и укажите IngredientsHeader в качестве Reference element.

  4. Произведем наложение гибкого описания еще раз.

    Показать пример

  5. Также в поле Advanced pre-search relations (диалог свойств элемента, закладка Advanced) можно задать дополнительное условие поиска Искать заголовок в верхней половине изображения. На языке описания FlexiLayout данное условие выглядит следующим образом: Above: PageRect.Top + PageRect.Height/2;

  6. В составе элемента RecipeContents создайте элемент Ingredients (тип Paragraph), соответствующий полю Ingredients.
    Задайте условия поиска (диалог свойств элемента, закладка Relations) - ниже, чем заголовок Ingredients: (Below элемента IngredientsHeader), но выше разделителя (Above элемента Separator).
    Просмотр результатов наложения шаблона показывает, что на всех тестовых изображениях поле Ingredients находится устойчиво.

Процесс создания блока Ingredients аналогичен процессу создания блока RecipeNumber. Отличие заключается в том, что для блока Ingredients в качестве исходного элемента необходимо указать элемент Ingredients.


Пример 2. Шаг 15: Описание полей Cooking Time и Cooking Description

Для описания поиска оставшихся полей Cooking Time и Cooking Description создадим составной элемент. Для этого:

  1. Создайте составной элемент Cooking (тип Group).

  2. В составе элемента Cooking необходимы:

  • элемент CookingTimeHeader (тип Static text), соответствующий единицам времени, указанным в поля Cooking Time (подробнее см. Шаг 16).

  • элемент CookingTime (тип Character String), соответствующий полю Cooking Time (подробнее см. Шаг 17).

  • элемент InvertedHeader (тип Object Collection), соответствующий заголовку поля Cooking Description (подробнее см. Шаг 19).

  • составной элемент Description (тип Group), соответствующий полю Cooking Description (подробнее см. Шаг 20).


Пример 2. Шаг 16: Создание элемента CookingTimeHeader

Для того чтобы создать элемент CookingTimeHeader:

  1. Создайте элемент CookingTimeHeader (тип Static text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: minutes|hour|hours.

  4. Задайте значение свойства Max error percentage равным 10.

  5. Выберите закладку Advanced.

  6. Поскольку поле Cooking Time находится ниже всех остальных объектов изображения, в поле Advanced pre-search relations задайте дополнительное условие поиска: Искать объект изображения, ближайший к нижнему краю изображения. На языке описания FlexiLayout данное условие выглядит следующим образом: NearestY: PageRect.Bottom;

    Замечание. Данное условие также можно задать через интерфейс программы. Для этого перейдите на закладку Relations, отметьте опцию Nearest и в выпадающем списке To выберите Page bottom edge.


Пример 2. Шаг 17: Создание элемента CookingTime

Для того чтобы создать элемент CookingTime:

  1. Создайте элемент CookingTime (тип Character String).

  2. Выберите закладку Character String.

  3. Задайте алфавит. Исходя из информации, полученной при просмотре тестовых изображений, предполагаем, что это - все цифры.

  4. Задайте значение параметра Percentage of alphabet characters равным 1.

  5. Снимите отметку с пункта Allow embedded hypotheses.

  6. В поле Percentage of non-alphabet characters задайте допустимую долю символов, не входящих в алфавит данного элемента, равную 0.1 (что означает 10%).

  7. В поле Character count задайте нечеткий интервал {0, 1, 3, 4}, оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 1 до 3 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.

  8. Перейдите на закладку Relations.

    На закладке Relations зададим, что время приготовления может находиться только слева от единиц времени, но не далее, чем на расстоянии 100 dot от его левой границы (Left of элемента CookingTimeHeader, Offset = 0 и Right of левой границы региона элемента CookingTimeHeader, Offset = -100, Reference boundary = left).

  9. Поскольку время всегда находится на одном уровне с единицами времени, поэтому необходимо добавить следующие условия поиска элемента:

    - Above элемента CookingTimeHeader, Offset = -20, Reference boundary = bottom

    - Below элемента CookingTimeHeader, Offset = -20, Reference boundary = top


Пример 2. Шаг 18: Описание месторасположения блока CookingTime

Для того чтобы создать блок CookingTime:

  1. Перейдите в окно FlexiLayout в главном окне программы ABBYY FlexiLayout Studio.

  2. В дереве FlexiLayout выделите объект Blocks.

  3. Выберите команду Add Block>Text в меню FlexiLayout (или в локальном меню Add Block>Text).

  4. В открывшемся диалоге Properties задайте имя блока CookingTime в поле Name.

  5. Выберите в качестве описания местоположения блока опцию Expression.

  6. Задайте месторасположение блока в виде описывающего прямоугольника от объединения описывающих прямоугольников регионов двух элементов CookingTimeHeader и CookingTime, увеличенного по высоте и ширине на 3 мм.
    На языке описания FlexiLayout описание месторасположения выглядит следующим образом:

    Rect outputRect;
    outputRect = SearchElements.Cooking.CookingTime.Rect Or
    SearchElements.Cooking.CookingTimeHeader.Rect;
    OutputRegion = outputRect;
    OutputRegion.Inflate (3*mm, 3*mm);

    Показать пример


Пример 2. Шаг 19: Создание элемента InvertedHeader

Заголовок Cooking представляется собой инвертированный текст (для данного типа документов светлые буквы на темном фоне).

Для того чтобы создать элемент InvertedHeader:

  1. Создайте элемент InvertedHeader (тип Object Сollection).

  2. Перейдите на закладку Object Collection.

  3. В группе Type отметьте тип объекта изображения Inverted text.

Показать пример

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


Пример 2. Шаг 20: Описание поля Cooking Description

Нам осталось задать условия поиска поля Cooking Description, содержащего описание процедуры приготовление блюда и информацию о количестве порций.

Заметим, что на всех изображениях информация о количестве порций находится справа от слова Serves. Однако на изображениях 2, 3, 4 слову Serves предшествует некоторый текст, не содержащий важной информации. Опишем поле Cooking Description так, чтобы этот текст не попал в распознаваемый блок, соответствующий полю Cooking Description.

Для удобства навигации по дереву FlexiLayout, а также для уменьшения общего числа гипотез в элементе Cooking создайте составной элемент Description. Для этого:

  1. В составе элемента Cooking создайте составной элемент Description (тип Group).

  2. В составе элемента Description создайте элемент Serves (тип Static text), для нахождения слова Serves (подробнее см. Шаг 21).

  3. В составе элемента Description создайте элемент Portions (тип Character String), для нахождения информации о количестве порций (подробнее см. Шаг 22).

  4. В составе элемента Description создайте элемент CookingDescription (тип Paragraph), соответствующий полю Cooking Description (подробнее см. Шаг 23).

  5. Создайте блок CookingDescription, соответствующий полю Cooking Description (подробнее см. Шаг 24).


Пример 2. Шаг 21: Создание элемента Serves

Для того чтобы создать элемент Serves:

    1. Создайте элемент Serves (тип Static text).

    2. Выберите закладку Static Text.

    3. В поле Search text укажите значение искомого текста: Serves.

    4. Задайте значение свойства Max error percentage равным 20.

    5. Выберите закладку Advanced.

    6. В поле Advanced pre-search relations задайте дополнительное условие поиска Искать объект изображения, ближайший к заголовку поля Cooking time. На языке описания FlexiLayout данное условие выглядит следующим образом:
      Nearest: SearchElements.Cooking.CookingTimeHeader;

      Замечание. Данное условие также можно задать через интерфейс программы. Для этого перейдите на закладку Relations, отметьте опцию Nearest и в выпадающем списке To выберите Element и укажите CookingTimeHeader в качестве Reference element.


Пример 2. Шаг 22: Создание элемента Portions

Для того чтобы создать элемент Portions:

  1. Создайте элемент Portions (тип Character String).

  2. Выберите закладку Character String.

  3. Задайте алфавит. Исходя из информации, полученной при просмотре тестовых изображений, предполагаем, что это - все цифры и буквы «T», «t», «O», «o».

  4. Задайте значение параметра Percentage of alphabet characters равным 1.

  5. Снимите отметку с пункта Allow embedded hypotheses.

  6. В поле Percentage of non-alphabet characters задайте допустимую долю символов, не входящих в алфавит данного элемента, равную 0.2 (что означает 20%).

  7. В поле Character count задайте нечеткий интервал {0, 1, 10, 15}, оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 1 до 10 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.

  8. Перейдите на закладку Relations.

  9. Поскольку количество порций может находиться только справа от слова Serves, но не далее, чем на расстоянии 200 dot от его правой границы, задайте следующие условия поиска:
    - Right of элемента Serves, Offset = 0
    - Left of элемента Serves, Offset = -200, Reference boundary = right

  10. Поскольку количество порций всегда находится на одном уровне со словом Serves, добавьте следующие условия поиска:
    - Above элемента Serves, Offset = -50
    - Below элемента Serves, Offset = -50


Пример 2. Шаг 23: Описание поля Cooking Description

Для того чтобы создать элемент CookingDescription:

  1. Создайте элемент с именем CookingDescription (тип Paragraph).

  2. Перейдите на закладку Relations.

  3. Поскольку описание процесса приготовления находится ниже заголовка, но выше слова Serves, задайте условия поиска:
    - Below элемента InvertedHeader, Offset = 0
    - Above элемента Serves, Offset = 0


Пример 2. Шаг 24: Описание месторасположения блока CookingDescription

Пример 2. Шаг 24 Создание блока CookingDescription

Для того чтобы создать блок CookingDescription:

  1. Перейдите в окно FlexiLayout в главном окне программы ABBYY FlexiLayout Studio.

  2. В дереве FlexiLayout выделите объект Blocks.

  3. Выберите команду Add Block>Text в меню FlexiLayout (или в локальном меню Add Block>Text).

  4. В открывшемся диалоге Properties задайте имя блока CookingDescription в поле Name.

  5. Выберите в качестве описания местоположения блока опцию Expression.

  6. Необходимо задать месторасположения блока так чтобы в него попали только данные о приготовлении блюда и данные о количестве порций. При этом в блок не должны попасть лишние данные (весь текст, находящийся слева от слова Serves). Для этого задайте месторасположение блока в виде массива прямоугольников регионов элементов: CookingInstructions, Serves и Portions. Такой способ описания региона позволяет задавать области сложной (не прямоугольной) конфигурации, что бывает необходимо, как в нашем случае.
    На языке описания FlexiLayout описание месторасположения выглядит следующим образом:

    RectArray outputRectArray;
// инициализация переменной с использованием пустого конструктора
outputRectArray = RectArray();
// добавление прямоугольников гипотез 3-х элементов
outputRectArray.Add (
    SearchElements.Cooking.Description.CookingDescription.Rect );
outputRectArray.Add( SearchElements.Cooking.Description.Serves.Rect );
outputRectArray.Add( SearchElements.Cooking.Description.Servings.Rect );
OutputRegion = Region( outputRectArray );


Пример 2. Шаг 25: Гибкое описание готово

Полученное гибкое описание можно экспортировать в формат ABBYY FlexiLayout (*.afl) и подключить к определению документа в программе ABBYY FlexiCapture.

Подробнее об экспорте и подключении смотрите Пример1, Шаг 21 - Шаг 22.


Краткое описание формы Invoices

Пример 3. Краткое описание формы Invoices

Внимание! Для простоты в данном примере рассматривается одностраничный документ.

В данном руководстве ABBYY FlexiLayout Studio описывается процесс создания гибкого описания для простого счета. Её особенностью по сравнению с предыдущими примерами является наличие таблицы.

На этом примере мы проследим по шагам процесс создания гибкого описания, попутно знакомясь с некоторыми нестандартными подходами к описанию местоположения объектов, и, главное, научимся находить объекты изображения, соответствующие элементам типа Table.

Это руководство содержит ссылки на разделы справки Help/Tutorial/Sample1 и Help/Tutorial/Sample2, где описано создание гибких описаний с блоками и элементами различных типов (кроме табличных) и многие базовые операции более детализированы, а так же ссылки на другие разделы справки.

Проект FlexiLayout Studio, содержащий тестовые изображения и отлаженное гибкое описание, находится в
%allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Invoice One-Page.

Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

Показать пример

Конечной целью создания гибкого описания данного документа в ABBYY FlexiLayout Studio является устойчивое нахождение на всех тестовых страницах местоположения следующих полей (в случае их присутствия на данном экземпляре документа):

  • Invoice Number
  • Invoice Date
  • Delivery Address
  • Total Quantity
  • Total Amoun
  • Country
  • Invoice Table (только столбцы Reference, Designation, Quantity, Unit Price, Total)
Показать пример


Пример 3. Шаг 1. Предварительные настройки

  1. Создайте новую папку Invoices One-Page.

  2. Запустите программу ABBYY FlexiLayout Studio 10.

  3. Создайте новый проект (File>New Project, подробнее см. Пример 1, шаг 1). В открывшемся диалоге задайте имя проекта Invoices.

  4. Добавьте изображения в пакет (подробнее см. Пример 1, шаг 2).

    Замечание: Тестовые изображения третьего примера хранятся в

    %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Invoice One-Page\Invoice One-PageBatch\<page number>\Images\bwPage.dat.

    Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 проекты расположены в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS.

  5. Настройте свойства гибкого описания:

  • Text Type - следует выбрать способ заполнения формы Typographic.

  • Text languages - наша форма является англоязычной, поэтому в качестве языка предраспознавания в списке выберите English.

  • Задайте название гибкого описания Invoice.

  • Mode - режим предраспознавания выберите Fast, предлагаемый по умолчанию, значения параметров Minimal number of pages и Maximal number of pages задайте равными 1.

Показать пример

Замечание. Более подробно о критериях выбора параметров предраспознавания см. Пример 1, шаг 3.

Для одностраничных документов нет необходимости в описании начала и конца документа с помощью предопределенных составных элементов Header и Footer. Поэтому их можно удалить из списка элементов гибкого описания.

Замечание. Для определения начала и конца документа в гибкое описание могут быть добавлены специальные элементы: Header и Footer. Если в процессе наложения гибкого описания не найден ни элемент Header ни элемент Footer, то число страниц в документе считается равным наибольшему числу страниц, указанному в свойствах гибкого описания. Для данного документа в свойствах гибкого описания мы указали 1.


Пример 3. Шаг 2. Просмотр изображений и результатов предраспознавания

Перед созданием элементов гибкого описания необходимо понять, на какие объекты изображений формы мы можем опереться для поиска ее полей данных формы. Опорными объектами могут служить только такие графические и/или текстовые фрагменты изображения, которые устойчиво находятся в процессе предраспознавания изображений формы.

Чтобы запустить процесс предраспознавания:

  1. Выделите все изображения в пакете.

  2. Выберите команду Pre-Recognize (меню Batch или локальное меню изображения).

Замечание. Более подробно о процессе запуска предраспознавания см. Пример 1, шаг 4.

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

Замечание. Более подробно о просмотре страниц и результатах предраспознавания см. Пример 1, шаг 5, шаг 6.

Теперь можно приступать непосредственно к созданию и настройке опорных элементов и заданию критериев поиска блоков, соответствующих искомым полям. Для этого перейдите в окно FlexiLayout в главном окне программы ABBYY FlexiLayout Studio.


Пример 3. Шаг 3. Блоки

Целью создания данного гибкого описания является нахождение местоположения следующих блоков (в случае их наличия на изображении):

  • Invoice Number
  • Invoice Date
  • Delivery Address
  • Total Quantity
  • Total Amount
  • Country
  • Invoice Table (только столбцы Reference, Designation, Quantity, Unit Price, Total)

Чтобы список блоков в процессе создания гибкого описания был перед глазами, необходимо создать все блоки:

  1. Создайте блок InvoiceNumber (тип Text), соответствующий полю Invoice Number.

  2. Создайте блок InvoiceDate (тип Text), соответствующий полю Invoice Date.

  3. Создайте блок DeliveryAddress (тип Text), соответствующий полю Delivery Address.

  4. Создайте блок TotalQuantity (тип Text), соответствующий полю Total Quantity.

  5. Создайте блок TotalAmount (тип Text), соответствующий полю Total Amount.

  6. Создайте блок Country (тип Text), соответствующий полю Country.

  7. Создайте блок InvoiceTable (тип Table), соответствующий полю Invoice Table. Подробнее см. Блок Table.
    В диалоге свойств блока на закладке Columns последовательно добавьте названия столбцов в следующем порядке: Reference, Designation, Quantity, UnitPrice, Total.

    Замечание. Указанные названия столбцов и порядок их следования будут соответствовать данному блоку в шаблоне FlexiCapture.

    Показать пример

Замечание.

  • На данном этапе мы указываем тип блока, название и список столбцов для блока типа Table. Местоположение каждого блока мы определим позже, когда все вспомогательные элементы будут описаны и отлажены.

  • Важно помнить, что блок типа Table обязательно должен быть создан раньше, чем элемент типа Table.
    Так как с помощью элемента типа Table мы планируем искать блок типа Table, соответственно элемент типа Table должен иметь ссылку на блок. Этим блок типа Table отличается от блоков типа Text, Barcode, Checkmark или Picture, которые можно создавать в процессе разработки гибкого описания после того, как все элементы для описания местоположения того или иного блока будут созданы и отлажены (см. Пример 1, Пример 2).

На этом процедура задания свойств гибкого описания и начальных приготовлений к работе закончена и можно приступать непосредственно к созданию элементов.


Пример 3. Шаг 4. Анализ изображений и определение последовательности поиска элементов и групп элементов

Необходимо выяснить:

  • Какова закономерность расположения полей на изображении?

  • На какие элементы мы можем опереться в поиске полей?

  • Какую выбрать последовательность поиска (поскольку на каждом следующем шаге мы можем опираться только на описанные выше элементы)?

Предварительный просмотр результатов предраспознавания показывает, что:

  1. Центральную часть документа занимает таблица, которая присутствует на всех изображениях.

    Замечание. Напомним, что в терминологии FlexiLayout Studio 10 таблицей является объект изображения, состоящий из фрагментов, расположенных в виде колонок и строк, визуально разделённых сепараторами или просветами. Подробнее см. Table.

  2. Выше таблицы располагается группа полей (назовём её Header) Invoice Number, Invoice Date и Delivery Address. При этом поле Invoice Number присутствует всегда и его можно сделать обязательным (идентификационным) полем, в то время как поля Invoice Date и Delivery Address могут и отсутствовать.
  3. Под таблицей располагается группа полей (назовём её Footer) TotalQuantity, TotalAmount и Country. Эти поля тоже присутствуют не всегда.

Начнём строить наш поиск полей с верхней части документа.

Для поиска полей, расположенных в верхней части, создадим логическую группу, в которую войдут все элементы для поиска полей Invoice Number, Invoice Date и Delivery Address:

  1. Создайте составной элемент InvoiceHeader (тип Group).

    Мы видим, что поля Invoice Number, Invoice Date и Delivery Address всегда располагаются в левом верхнем углу, при этом порядок их следования постоянен: сначала идёт Delivery Address, потом Invoice Number, потом Invoice Date (конечно, при условии, что они присутствуют на изображении). В таком порядке и будем их искать.

  2. Для описания поиска ключевых слов (keywords) заголовков полей Invoice Number, Invoice Date и Delivery Address воспользуйтесь элементами типа Static Text.

    Для этого в составе InvoiceHeader нам необходимы элементы::

    • Элемент kwDeliveryAddress (тип Static Text), соответствующий заголовку поля Delivery Address (подробная инструкция в Шаге 5).

    • Элемент kwInvoiceNumber (тип Static Text) соответствующий заголовку поля Invoice Number (подробная инструкция в Шаге 6).

    • Элемент kwDate (тип Static Text), соответствующий заголовку поля Invoice Date (подробная инструкция в Шаге 7).

  3. Поиск полей Invoice Number и Invoice Date, будем осуществлять их в той же строке, что и соответствующий заголовок, правее заголовка.

    В составе элемента InvoiceHeader нам потребуются элементы:

    • Элемент InvoiceNumber (тип Character String), соответствующий полю Invoice Number (подробная инструкция в Шаге 8).

    • Составной элемент grDate (тип Group) для поиска поля Invoice Date (подробная инструкция в Шаге 9).

    В составе элемента InvoiceHeader.grDate будем описывать элементы:

    • Элемент InvoiceDate (тип Date), соответствующий полю Invoice Date в случае хорошего качества изображения (подробная инструкция в Шаг 9).

    • Элемент InvoiceDateAsString (тип Character String), соответствующий полю Invoice Date в том случае, если поиск элемента InvoiceDate оказался неуспешным (подробная инструкция в Шаге 9).

    Замечание. Более подробно про поиск даты в случае плохого качества изображений см. Tips and tricks.

  4. Поле Delivery Address многострочное, поэтому нам потребуется элемент типа Paragraph, но прежде нам необходимо будет задать область поиска самым строгим образом. В качестве ограничителя области поиска справа будем использовать элемент типа White Gap. И объединим все эти элементы, служащие описанию местоположения поля Delivery Address, в отдельную группу:

    • В составе элемента InvoiceHeader создайте составной элемент grAddress (тип Group) (подробная инструкция в Шаге 10).

    В составе элемента grAddress опишем элементы:

    • Вспомогательный элемент wgAddressRight (тип White Gap), прилегающий к полю Delivery Address справа (подробная инструкция в Шаге 11).

    • Элемент DeliveryAddress (тип Paragraph), соответствующий полю Delivery Address (подробная инструкция в Шаге 12).


Пример 3. Шаг 5. Поиск заголовка поля Delivery Address, элемент kwDeliveryAddress

Анализ изображения показывает:

  • Ключевыми словами для поиска заголовка поля Delivery Address будет однострочная строка «DeliveryAddress».

  • Число ошибок в заголовке можно ограничить 20 процентами, что в нашем случае будет означать не более 3х ошибок во всей фразе.

Замечание. Регистр написания не влияет на поиск и используется только для повышения читабельности. Допустимое число ошибок подбирается опытным путем. Более подробно о параметрах элемента типа Static Text см. Справка Элементы/Свойства элементов, задающие параметры искомого объекта/Элемент Static Text.

Чтобы создать элемент kwDeliveryAddress:

  1. В составе элемента InvoiceHeader создайте элемент kwDeliveryAddress (тип Static Text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: DeliveryAddress.

  4. Задайте значение свойства Max error percentage равным 20.

  5. Выберите закладку Advanced.

  6. Поскольку поле Delivery Address находится в верхней трети изображения по вертикали и в левой трети по горизонтали, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения в левой трети страницы. Искать объект изображения в верхней трети страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

    Above: PageRect.Top + PageRect.Height/3;
    LeftOf: PageRect.Left + PageRect.Width/3;

  7. Протестируйте изображения и убедитесь, что элемент найден на всех изображениях, где он присутствует.

Замечание. Чтобы наложить гибкий шаблон на все тестовые изображения, удобно воспользоваться горячими клавишами:

  • Поместите фокус в окно пакета изображений Batch.

  • Для выбора всех страниц пакета нажмите клавиши Ctrl + A.

  • Для запуска анализа выделенных страниц нажмите клавиши Ctrl + E.


Пример 3. Шаг 6. Поиск заголовка поля Invoice Number, элемент kwInvoiceNumber

Анализ изображения показывает:

  • Заголовок поля Invoice Number присутствует на всех изображениях и отличает их от других типов документов.
    Для того, чтобы полностью исключить случайное распознавание форм, не относящихся к заданному типу необходимо идентифицировать форму, задав в ней по крайней мере один обязательный элемент.
    Поэтому сделаем заголовок поля Invoice Number обязательным, то есть идентификационным элементом для данного типа форм.

  • Заголовок на части изображений представлен фразой Invoice no., а на части – Credit note no.
    Поэтому составим нашу поисковую строку из 2х вариантов, при этом запишем каждую фразу слитно, чтобы ограничения на количество ошибок относились ко всей фразе целиком, а не к отдельным словам.

Чтобы создать элемент kwInvoiceNumber:

  1. В составе элемента InvoiceHeader создайте элемент kwInvoiceNumber (тип Static Text).

  2. Выберите пункт Required element на закладке General (поскольку данный элемент мы решили сделать обязательным).

  3. Выберите закладку Static Text.

  4. В поле Search text укажите значение искомого текста: InvoiceNo.|CreditNoteNo.

  5. Задайте значение свойства Max error percentage равным 20.

  6. Выберите закладку Relations.

  7. На закладке Relations укажите, что ключевые слова заголовка поля Invoice Number могут находиться только ниже заголовка поля Delivery Address:

Below элемента InvoiceHeader.kwDeliveryAddress, Offset = 0.

Показать пример

  8. Выберите закладку Advanced.

  9. Поскольку поле Invoice Number находится в верхней трети изображения по вертикали и в левой трети по горизонтали, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения в левой трети страницы. Искать объект изображения в верхней трети страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

    Above: PageRect.Top + PageRect.Height/3;
    LeftOf: PageRect.Left + PageRect.Width/3;

  10. Протестируйте изображение и убедитесь, что элемент найден на всех изображениях.

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


Пример 3. Шаг 7. Поиск заголовка поля Invoice Date, элемент kwInvoiceDate

Анализ тестовых изображений показывает:

  • Заголовок поля Invoice Date представлен коротким и очень распространенным словом Date.
    Следовательно, требуется максимально сузить область поиска.

  • Заголовок поля Date (в случае наличия на изображении этого поля) располагается очень близко к заголовку поля Invoice Number.

Чтобы создать элемент kwInvoiceDate:

  1. В составе элемента InvoiceHeader создайте элемент kwInvoiceDate (тип Static Text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: Date.

  4. Оставьте значение свойства Max error percentage равным 30 (что для нашего 4х буквенного слова означает ошибку не более чем в одной букве).

  5. Выберите закладку Relations.

  6. На закладке Relations укажите, что ключевые слова заголовка могут находиться только ниже заголовка поля Invoice Number, но не ниже чем на расстоянии 150 dot от его нижней границы:
  • Below элемента kwInvoiceNumber, Offset = 0.
  • Above нижней границы региона элемента kwInvoiceNumber, Offset = -150, Reference boundary = Bottom.

Показать пример

Замечание. При подборе значений для отступов (offset) бывает полезно обратить внимание на геометрические свойства (границы и размеры) опорных и искомых объектов изображения в режиме просмотра результатов предраспознавания. Подбор значений для отступов (offset) является творческим процессом и осуществляется путем проб и ошибок.

  7. Выберите закладку Advanced.

  8. Поскольку поле Invoice Date находится в левой половине по горизонтали, в поле Advanced pre-search relations задайте ещё одно дополнительные условия поиска: Искать объект изображения в левой половине страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

    LeftOf: PageRect.Left + PageRect.Width/2;

  9. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где он присутствует.


Пример 3. Шаг 8. Описание поля Invoice Number, элемент InvoiceNumber

Поле Invoice Number располагается правее заголовка и на том же уровне.

Анализ тестовых изображений показывает, что на некоторых текст номера распознаётся очень плохо. Поэтому не будем накладывать ограничений на алфавит, но ограничим область поиска и длину цепочки 3-20 символами.

Чтобы создать элемент InvoiceNumber:

  1. В составе элемента InvoiceHeader создайте элемент InvoiceNumber (тип Character String).

    Замечание. Совпадение имени элемента с именем блока, соответствующего полю InvoiceNumber, не обязательно, но удобно для дальнейшей работы с гибким описанием.

  2. Выберите закладку Character String.

  3. Задайте значение параметра Percentage of non-alphabet characters равным 100%, что означает отсутствие ограничений на входящие символы.

  4. В поле Character count задайте нечеткий интервал { -1, 3, 20, INF } оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 3 до 20 символов. Любая гипотеза, входящая за рамки данного интервала, будет штрафоваться.

  5. Перейдите на закладку Relations.

  6. Поскольку InvoiceNumber может находится только справа от ключевых слов заголовка kwInvoiceNumber, но не правее, чем 550 dot от правой границы заголовка kwInvoiceNumber, задайте следующие условия поиска:

  • Right of элемента kwInvoiceNumber, Offset = 0.

  • Left of элемента kwInvoiceNumber, Offset = -550, Reference boundary = Right.

Замечание. Значения для отступов (offset) подбираются опытным путем.

  7. Поскольку InvoiceNumber всегда находится на одном уровне с ключевыми словами заголовка kwInvoiceNumber, добавьте следующие условия поиска:
  • Above элемента kwInvoiceNumber, Offset = -10, Reference boundary = Bottom.
  • Below элемента kwInvoiceNumber, Offset = -10, Reference boundary = Top.
Показать пример

  8. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где он присутствует.

  9. Выберите в качестве описания местоположения блока InvoiceNumber опцию Source element. В качестве source element укажите элемент InvoiceNumber, нажав кнопку [image].


Пример 3. Шаг 9. Описание поля Invoice Date, элементы grDate, InvoiceDate и InvoiceDateAsString

Проанализировав изображения, видим, что поле Invoice Date располагается правее заголовка и на одном с ним уровне. Для поиска даты воспользуемся элементом типа Date.На случай появления изображений низкого качества, где текст даты может распознаваться не очень хорошо и поиск элемента типа Date не даст результатов, дополнительно опишем элемент типа Character String. Для того чтобы задать настройки, общие для всех этих элементов, нам потребуется составной элемент grDate:

  • Поле Invoice Date располагается правее заголовка и на одном с ним уровне.
    Для поиска даты воспользуемся элементом типа Date.

  • На некоторых изображениях текст даты распознаётся не очень хорошо.
    Поэтому на тот случай, если поиск элемента типа Date не даст результатов, дополнительно опишем элемент типа Character String.

Для того чтобы задать настройки, общие для всех этих элементов, нам потребуется составной элемент.

Чтобы создать элемент grDate:

  1. В составе элемента InvoiceHeader создайте элемент grDate (тип Group).

  2. Перейдите на закладку Relations.

  3. Поскольку все элементы, служащие поиску местоположения поля Invoice Date, могут находиться только правее ключевых слов заголовка kwInvoiceDate и на одном с ними уровне, задайте следующие условия поиска:
  • - Right of элемента kwInvoiceDate, Offset = 0.
  • - Above элемента kwInvoiceDate, Offset = -10, Element boundary = Bottom.
  • - Below элемента kwInvoiceDate, Offset = -10, Element boundary = Top.
Показать пример

Чтобы создать элемент InvoiceDate:

  1. В составе элемента InvoiceHeader.grDate создайте элемент InvoiceDate (тип Date).

  2. Выберите закладку Date.

  3. Для элемента InvoiceDate на закладке Date следует указать все допустимые форматы записи даты. Предполагаем, что формат даты Day, month, year, язык English, других ограничений на дату нет.
    Показать пример

  4. Выберите закладку Advanced.

  5. Поле Invoice Date является необязательным элементом изображении. В случае присутствия поля Invoice Date всегда будет и заголовок. При этом, поле Invoice Date расположено ближе всего к заголовку области поиска. Таким образом, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения, только если найден элемент kwInvoiceDate. Искать объект изображения, ближайший к элементу kwInvoiceDate. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If InvoiceHeader.kwInvoiceDate.IsNull Then DontFind;
    Nearest: InvoiceHeader.kwInvoiceDate;

    Замечание. Условие Nearest также можно задать через интерфейс программы. Для этого перейдите на закладку Relations, отметьте опцию Nearest, в выпадающем списке To: выберите Element и укажите kwInvoiceDate в качестве Reference element.

  6. Протестируйте изображения и изучите, на сколько верно программа находит элемент на всех изображениях, где поле Invoice Date присутствует .

Мы видим, что на части изображений данный элемент не найден. Проанализировав результаты предраспознавания, понимаем, что это произошло из-за мусора в области поля. Результаты распознавания не подходят ни под один из стандартных параметров для элемента Date, поэтому нам придется дополнить гибкое описание альтернативным элементом, ищущим поле Invoice Date, с менее строгими условиями.

Замечание. Более подробно про поиск даты в случае плохого качества изображений см. Tips and tricks.

Для того чтобы создать элемент InvoiceDateAsString:

  1. В составе элемента InvoiceHeader.grDate создайте элемент InvoiceDateAsString типа Character String.

  2. Выберите закладку Character String.

  3. В поле Character count задайте нечеткий интервал { -1, 8, 14, INF } оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 8 до 14 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.

  4. В поле Max space length задайте значение 20, ограничивающее допустимый размер просвета в текстовой строке в 20 dot;

  5. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.

  6. Выберите закладку Advanced.

  7. Поскольку элемент InvoiceDateAsString мы хотим искать только в том случае, если элемент InvoiceDate не обнаружен на изображении, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения, только если не найден элемент InvoiceDate. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If Not InvoiceDate.IsNull Then DontFind;

  8. Поскольку поле Invoice Date может находиться на изображении, а может и нет, но при этом всегда присутствует вместе с заголовком и расположено ближе всего к заголовку в области поиска, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения, только если найден элемент kwInvoiceDate. Искать объект изображения, ближайший к элементу kwInvoiceDate. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If InvoiceHeader.kwInvoiceDate.IsNull Then DontFind;
    Nearest: InvoiceHeader.kwInvoiceDate;

    Замечание. Условие Nearest также можно задать через интерфейс программы. Для этого перейдите на закладку Relations, отметьте опцию Nearest, в выпадающем списке To: выберите Element и укажите kwInvoiceDate в качестве Reference element.

  9. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где поле Invoice Date присутствует, и для элемента InvoiceDate сформирована гипотеза.

  10. Выберите в качестве описания местоположения блока InvoiceDate опцию Source element. В качестве source element укажите элемент InvoiceHeader.grDate, нажав кнопку [image].

    Замечание. Регион составного элемента состоит из объединения регионов найденных подэлементов.


Пример 3. Шаг 10. Описание составного элемента grAddress

Местоположение поля Delivery Address мы решили искать с помощью элементов:

  • Просвета–ограничителя справа.

  • Элемента типа текстовый фрагмент.

Чтобы задать настройки, общие для этих элементов, нам потребуется составной элемент. Для того чтобы создать элемент grAddress:

  1. В составе элемента InvoiceHeader создайте элемент grAddress (тип Group).

  2. Перейдите на закладку Relations.

  3. Поскольку все элементы, предназначенные для поиска местоположения поля Delivery Address, могут находиться только ниже от ключевых слов заголовка kwDeliveryAddress, и только выше ключевых слов заголовка kwInvoiceNumber, задайте следующие условия поиска:
  • Below элемента kwDeliveryAddress, Offset = 0
  • Above элемента kwInvoiceNumber, Offset = 0
Показать пример

  4. Выберите закладку Advanced.

  5. Поскольку поле Delivery Address, а так же ограничивающий его просвет, находятся в левых двух пятых страницы по горизонтали, в поле Advanced pre-search relations задайте дополнительные условие поиска: Искать объекты изображения в левых двух пятых страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

LeftOf: PageRect.Left + PageRect.Width*2/5;


Пример 3. Шаг 11. Поиск правой границы поля Delivery Address, элемент wgAddressRight

Для ограничения области поиска элемента DeliveryAddress справа опишем вертикальный просвет (white gap).

Чтобы создать элемент wgAddressRight:

  1. В составе элемента InvoiceHeader.grAddress создайте элемент wgAddressRight (тип White gap).

  2. Выберите закладку White Gap.

  3. В группе Orientation выберите Vertical. Минимальную ширину (Min width) поставьте равной 100.

    Замечание. При подборе значений для высоты/ширины просветов бывает полезно обратить внимание на геометрические свойства (границы и размеры) близлежащих объектов изображения в режиме просмотра результатов предраспознавания.

  4. Параметры Lower threshold limit: и Threshold coefficient (%): установите равными 10.

    Замечание. Значения свойств Lower threshold limit, Upper threshold limit и Threshold coefficient (%) подбираются опытным путем.
    Подробнее см. Справка раздел Элементы/Свойства элементов, задающие параметры искомого объекта изображения/элемент White gap.

  5. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.
    Показать пример

  6. Перейдите на закладку Relations.

  7. Поскольку просвет может находиться только справа от ключевых слов заголовка kwDeliveryAddress, задайте следующее условие поиска:
    - Right of элемента kwDeliveryAddress, Offset = 0

  8. Выберите закладку Advanced.

  9. Поскольку поле Delivery Address может присутствовать на изображении, а может и нет, но при этом всегда присутствует вместе с заголовком, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения, только если найден элемент kwDeliveryAddress. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If InvoiceHeader.kwDeliveryAddress.IsNull Then DontFind;

  10. Поскольку интересующий нас просвет должен также прилегать к поле Invoice Number, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения ближайший к элементу kwInvoiceNumber. На языке описания FlexiLayout данное условие выглядит следующим образом:

    Nearest: InvoiceHeader.kwInvoiceNumber;

    Замечание. Условие Nearest также можно задать через интерфейс программы. Для этого перейдите на закладку Relations, отметьте опцию Nearest, в выпадающем списке To: выберите Element и укажите kwInvoiceNumber в качестве Reference element.

  11. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где присутствует поле Delivery Address.


Пример 3. Шаг 12. Описание поля Delivery Address, элемент DeliveryAddress

Чтобы создать элемент DeliveryAddress:

  1. В составе элемента InvoiceHeader.grAddress создайте элемент DeliveryAddress (тип Paragraph).

  2. Перейдите на закладку Relations.

  3. Поскольку DeliveryAddress может находиться только выше заголовка kwInvoiceNumber, только левее просвета wgAddressRight, только правее начала заголовка kwDeliveryAddress с небольшим запасом, задайте следующее условие поиска:

  • Above элемента kwInvoiceNumber, Offset = 0..

  • Left of элемента wgAddressRight, Offset = 0.

  • Right of элемента kwDeliveryAddress, Offset = -50, Reference boundary = Left.

Замечание. При подборе значений для отступов (offset) обратите внимание на геометрические свойства (границы и размеры) опорных и искомых объектов изображения в режиме просмотра результатов предраспознавания. Значения для отступов (offset) подбираются опытным путем.

  4. Поскольку условие, что поле DeliveryAddress может находиться только ниже от ключевых слов заголовка kwDeliveryAddress, уже задано на уровне группы InvoiceHeader.grAddress, мы не будем его дублировать здесь.

  5. Выберите закладку Advanced.

  6. Поле Delivery Address является необязательным элементом изображении. В случае присутствия поля Delivery Address всегда будет и заголовок. В поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения, только если найден элемент kwDeliveryAddress. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If InvoiceHeader.kwDeliveryAddress.IsNull Then DontFind;

  7. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где он присутствует.

  8. Выберите в качестве описания местоположения блока DeliveryAddress опцию Source element. В качестве source element укажите элемент DeliveryAddress, нажав кнопку [image].


Пример 3. Шаг 13. Продолжаем анализ изображений

К этому моменту у нас описаны поля Invoice Number, Invoice Date и DeliveryAddress.

Продумаем последовательность дальнейшего поиска элементов.

Анализ структуры расположения полей на тестовых изображениях показывает:

  • Для поиска поля Country нам, скорее всего, будет достаточно заголовка этого поля и элемента типа Character String.

  • Для поиска полей Total Quantity и Total Amount одного заголовка, общего для этих полей, явно недостаточно, дополнительно потребуются опорные элементы для локализации полей по горизонтали.
    В качестве таких элементов могут служить заголовки соответствующих столбцов таблицы.

Что касается поля Invoice Table, которое мы будем искать с помощью элемента типа Table, здесь нам тоже понадобятся предварительные приготовления:

  1. Header таблицы. Определить местоположение заголовков столбцов можно двумя способами:

    • Первый способ – указать одно или несколько ключевых слов, открыв диалог свойств столбца с закладки Columns в диалоге свойств табличного элемента. Этот способ более быстрый в смысле разработки, но менее гибкий.

    • Второй способ – использовать ранее найденный элемент для определения местоположения заголовка. Здесь в нашем распоряжении вся гибкость настроек, если она понадобится.

    Проанализировав наши изображения, видим, что качество хорошее и нет никаких особенностей, которые могут помешать выбрать первый метод (разве что очень короткий заголовок столбца Quantity: для 3х буквенного ключевого слова допустимый процент ошибок 20% означает, что ни одной ошибки не допускается).

    Решаем для заголовков первых 2х столбцов Reference и Designation воспользоваться первым способом, а для остальных - столбцы Quantity, Unit Price и Total – воспользуемся ранее описанными вспомогательными элементами, необходимыми нам для поиска полей TotalQuantity и TotalAmount.

  2. Footer таблицы. Он также (как и заголовки столбцов) может быть задан двумя способами:

    • Через список ключевых слов

    • Через вспомогательный элемент.

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

  3. Область поиска таблицы. Справившись с ограничением таблицы сверху (Header) и снизу (Footer), нам нужно ограничить таблицу справа (потребности в ограничении слева нет, т.к. с этой стороны на изображениях нет других данных).
    Так как даже с помощью контекста данных столбца мы не сможем отделить цифры столбца Total от цифр столбца Sales, нам потребуется другой подход. Можно ограничить область поиска таблицы справа относительно заголовка последнего, не нужного нам, столбца Sales.

Замечание. Выбор элементов и последовательности их поиска является творческим процессом и может меняться в процессе отладки гибкого описания.

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

  1. Проанализировав взаимозависимости планируемых элементов, начнем с заголовков столбцов таблицы. Нам нужно найти заголовки для столбцов Quantity, Unit Price, Total и Sales.

  2. Проанализировав наши изображения, видим, что шапка таблицы начинается с горизонтального сепаратора, и других сепараторов между заголовками столбцов и полями Invoice Number, Invoice Date и Delivery Address. Данный сепаратор позволит нам очень строго задать область поиска заголовков столбцов таблицы:

    • Для этого нам необходим элемент hsTableHeaderTop (тип Separator), (подробная инструкция в Шаге 14).
      Заголовки столбцов мы будем искать в порядке их следования.

    • Создайте составной элемент TableHeader (тип Group), (подробная инструкция в Шаге 15), в составе которого опишем элементы:

    • элемент kwQuantity (тип Static Text), соответствующий столбцу Quantity таблицы InvoiceTable (подробная инструкция в Шаге 16).

    • элемент kwUnitPrice (тип Static Text, соответствующий столбцу Unit Price таблицы InvoiceTable (подробная инструкция в Шаге 17).

    • элемент kwTotal (тип Static Text), соответствующий столбцу Total таблицы InvoiceTable (подробная инструкция в Шаге 18).

    • элемент kwSales (тип Static Text), соответствующий столбцу Sales таблицы InvoiceTable (подробная инструкция в Шаге 19).

  3. В нижней части страницы присутствуют заголовки полей Total Quantity и Total Amount (по совместительству являющийся для таблицы ограничителем снизу), нас также интересуют альтернативные надписи, которые также могут служить ограничителями для таблицы снизу, и в этой же логической группе опишем заголовок и source element для поля Country.

  4. Создайте составной элемент Footer (тип Group), в составе которого опишем элементы:

    • элемент kwFooter (тип Static Text), соответствующий итоговой части таблицы Invoice Table (подробная инструкция в Шаге 21).

    • элемент kwTotal (тип Static Text), соответствующий заголовку полей Total Quantity и Total Amount (подробная инструкция в Шаге 22).

    • элемент kwOrigin (тип Static Text), соответствующий заголовку поля Country (подробная инструкция в Шаге 23).

    • элемент Country (тип Character String), соответствующий полю Country (подробная инструкция в Шаге 24).

Теперь, когда все предварительные приготовления сделаны и описан порядок создания вспомогательных элементов, приступим к анализу поиска оставшихся полей. Опираясь на ранее найденные заголовки столбцов и футера, опишем оставшиеся поля Total Quantity, Total Amount и Invoice Table.

  1. Для этого создадим элементы TotalQuantity (тип Character String) и TotalAmount (тип Character String), соответствующие полям Total Quantity и Total Amount (подробная инструкция в Шаге 25).

  2. Создадим элемент InvoiceTable (тип Table), соответствующий полю Invoice Table (подробная инструкция в Шаге 26).


Пример 3. Шаг 14. Поиск вспомогательного горизонтального сепаратора, элемент hsTableHeaderTop

Чтобы создать элемент hsTableHeaderTop:

  1. Создайте элемент hs TableHeaderTop (тип Separator).

  2. Выберите закладку Separator.

  3. В группе Orientation выберите Horizontal.

  4. Задайте ограничения на длину (Min length/Max length) от 1500 до 2500.

  5. Отметьте опцию Fits entirely within search area.

  6. Задайте уровень белого мусора (Space, Max length) 20, размер ортогонального сдвига (Orthogonal shift) 20.

    Замечание. При подборе значений для длины сепаратора бывает полезно обратить внимание на геометрические свойства (границы и размеры) близлежащих объектов изображения в режиме просмотра результатов предраспознавания. Значения параметров для порога повреждений сепаратора подбираются опытным путем.

  7. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.
Показать пример

  8. Перейдите на закладку Relations.

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

    • Below элемента InvoiceHeader.kwInvoiceDate, Offset = 0;

    • Below элемента InvoiceHeader.kwInvoiceNumber, Offset = 0;

  10. Выберите закладку Advanced.

  11. Поскольку интересующий нас сепаратор является самым верхним в описанной области поиска, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения ближайший к верху страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

    NearestY: PageRect.Top;

    Замечание. Данное условие также можно задать через интерфейс программы. Для этого перейдите на закладку Relations, отметьте опцию Nearest и в выпадающем списке To: выберите Page top edge.

  12. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях.


Пример 3. Шаг 15. Анализ критериев поиска для заголовков столбцов таблицы. Составной элемент TableHeader

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

Чтобы создать элемент TableHeader:

  1. Создайте элемент TableHeader (тип Group).

  2. Выберите закладку Advanced.

  3. Поскольку при наличии сепаратора на изображении заголовки столбцов таблицы находятся ниже сепаратора hsTableHeaderTop, но не ниже чем 100 dot от него, а иначе в верхних трех пятых страницы, в поле Advanced pre-search relations задайте дополнительные условия поиска: Если элемент hsTableHeaderTop найден, то искать объекты изображения ниже сепаратора, но не более чем на 100 dot, иначе искать объекты изображения в верхних трех пятых страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

If Not (hsTableHeaderTop.IsNull) Then
{
Below: hsTableHeaderTop, 0 * dot;
Above: hsTableHeaderTop.Bottom, -100 * dot;
} Else
{
Above: PageRect.Top + PageRect.Height*3/5;
}


Пример 3. Шаг 16. Поиск заголовка столбца Quantity, элемент kwQuantity

Проанализировав результаты предраспознавания, видим что, хотя в данном случае заголовок представлен очень коротким ключевым словом «Qty», качество изображений высокое, и мы можем искать заголовок с помощью элемента типа Static Text. Зададим допустимый процент ошибок равным 35%, что для слова из трех букв означает ошибку в одной букве.

Чтобы создать элемент kwQuantity:

  1. В составе элемента TableHeader создайте элемент kwQuantity (тип Static Text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: Qty

  4. Задайте значение свойства Max error percentage равным 35.

  5. Выберите закладку Advanced.

  6. Поскольку заголовок столбца Quantity находится правее первой трети изображения по горизонтали, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения правее первой трети страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

    RightOf: PageRect.Left + PageRect.Width/3;

  7. Протестируйте изображения и убедитесь, что элемент находится на всех изображениях.


Пример 3. Шаг 17. Поиск заголовка столбца UnitPrice, элемент kwUnitPrice

При описании элемента для поиска ключевых слов заголовка столбца Unit Price воспользуемся наблюдением, что столбец Unit Price всегда располагается правее столбца Quantity.

Чтобы создать элемент kwUnitPrice:

  1. В составе элемента TableHeader создайте элемент kwUnitPrice (тип Static Text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: UnitPrice

  4. Выберите закладку Advanced.

  5. Поскольку заголовок столбца Unit Price располагается правее заголовка столбца kwQuantity, в поле Advanced pre-search relations задайте дополнительные условия поиска: Если элемент kwQuantity найден, то искать объект изображения правее элемента kwQuantity. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If Not (TableHeader.kwQuantity.IsNull) Then
    RightOf: TableHeader.kwQuantity, 0 * dot;

  6. Протестируйте изображения и убедитесь, что элемент находится на всех изображениях.


Пример 3. Шаг 18. Поиск заголовка столбца Total, элемент kwTotal

Проанализировав изображения, видим, что столбец Total на всех изображениях находится правее столбца Unit Price. Поэтому будем строить поиск заголовка столбца Total относительно заголовка столбца Unit Price.

Чтобы создать элемент kwTotal:

  1. В составе элемента TableHeader создайте элемент kwTotal (тип Static Text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: TotalChf.

  4. Выберите закладку Advanced.

  5. Поскольку заголовок столбца Total располагается правее заголовка столбца kwUnitPrice (если последний находится на изображении), в поле Advanced pre-search relations задайте дополнительные условия поиска: Если элемент kwUnitPrice найден, то искать объект изображения правее элемента kwUnitPrice. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If Not (TableHeader.kwUnitPrice.IsNull) Then
    RightOf: TableHeader.kwUnitPrice, 0 * dot;

  6. Протестируйте изображения и убедитесь, что элемент находится на всех изображениях.


Пример 3. Шаг 19. Поиск заголовка столбца Sales, элемент kwSales

Хотя сам столбец Sales нам не нужен, его заголовок необходим нам для ограничения таблицы справа.

Чтобы создать элемент kwSales:

  1. В составе элемента TableHeader создайте элемент kwSales (тип Static Text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: Sales

  4. Выберите закладку Advanced.

  5. Поскольку заголовок столбца Sales располагается правее заголовка столбца kwTotal (если последний находится на изображении), в поле Advanced pre-search relations задайте дополнительные условия поиска: Если элемент kwTotal найден, то искать объект изображения правее элемента kwTotal. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If Not (TableHeader.kwTotal.IsNull) Then
    RightOf: TableHeader.kwTotal, 0 * dot;

  6. Протестируйте изображения и убедитесь, что элемент находится на всех изображениях.


Пример 3. Шаг 20. Описание группы Footer, элемент Footer

Проанализировав изображения, видим, что футер таблицы, поля Country, Total Quantity и Total Amount, а так же их заголовки, располагаются в нижней части изображения, а именно под заголовочной областью таблицы. Чтобы не захватить первую строку таблицы, в которой могут дублироваться ключевые слова итоговой части, сместим верхнюю границу области поиска на небольшой отступ вниз. Для того чтобы задать настройки, общие для поиска всех этих элементов, нам потребуется составной элемент.

Чтобы создать элемент Footer:

  1. Создайте элемент Footer (тип Group).

  2. Перейдите на закладку Relations.

  3. Поскольку итоговая часть таблицы Invoice Table и поля Country, Total Quantity и Total Amount могут находиться только ниже сепаратора hsTableHeaderTop с некоторым запасом, задайте следующее условие поиска:

Below элемента hsTableHeaderTop, Offset = 300.


Пример 3. Шаг 21. Описание итоговой части таблицы, элемент kwFooter

Проанализировав изображения, видим, что итоговая часть таблицы может начинаться с ключевых слов «Carried Over», «Total Chf», «Goods total excl. tax», «Discount» и «SPECIAL DISCOUNT». Включим все эти варианты в поисковый текст элемента типа Static Text.

Чтобы создать элемент kwFooter:

  1. В составе элемента Footer создайте элемент kwFooter (тип Static Text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: Discount|TotalCHF|SPECIALDISCOUNT|Carriedover|Goodstotalexcl.tax

  4. Выберите закладку Advanced.

  5. Поскольку искомые ключевые слова находятся в левой половине изображения, и если их будет несколько, интересующий нас случай будет самым верхним, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения левее середины страницы. Искать объект изображения ближайший к верху страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

    LeftOf: PageRect.Left + PageRect.Width/2;
    NearestY: PageRect.Top;

  6. Протестируйте изображения и убедитесь, что элемент находится на всех изображениях, где он присутствует.

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


Пример 3. Шаг 22. Описание заголовка полей Total, элемент kwTotal

Проанализировав изображения, видим, что заголовок полей Total Quantity и Total Amount представлен ключевыми словами «TotalChf» или «Carried Over» и находится в левой нижней части страницы.

Чтобы создать элемент kwTotal:

  1. В составе элемента Footer создайте элемент kwTotal (тип Static Text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: TotalChf|CarriedOver

  4. Задайте значение свойства Max error percentage равным 30.

  5. Выберите закладку Advanced.

  6. Поскольку данный заголовок находится в левой половине изображения по горизонтали, а так же интересующая нас строка располагается самой верхней, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения левее середины страницы. Искать объект изображения ближний к верху страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

    LeftOf: PageRect.Left + PageRect.Width/2;
    NearestY: PageRect.Top;

  7. Протестируйте изображения и убедитесь, что элемент находится на всех изображениях, где он присутствует.


Пример 3. Шаг 23. Поиск заголовка поля Country, элемент kwOrigin

Для поиска заголовка поля Country по ключевым словам «OriginOfGoods:» воспользуемся элементом типа Static Text.

Чтобы создать элемент kwOrigin:

  1. В составе элемента Footer создайте элемент kwOrigin (тип Static Text).

  2. Выберите закладку Static Text.

  3. В поле Search text укажите значение искомого текста: OriginOfGoods:

  4. Перейдите на закладку Relations.

  5. Поскольку поле Country может находиться только ниже итоговой части таблицы kwFooter, задайте следующее условие поиска:

    Below элемента Footer.kwFooter, Offset = 0.

  6. Выберите закладку Advanced.

  7. Поскольку поле Country находится в левой половине изображения, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения в левой половине страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

    LeftOf: PageRect.Left + PageRect.Width/2;

  8. Протестируйте изображения и убедитесь, что элемент находится на всех изображениях, где он присутствует.


Пример 3. Шаг 24. Описание поля Country, элемент Country

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

Чтобы создать элемент Country:

  1. В составе элемента Footer создайте элемент Country (тип Character String).

  2. Выберите закладку Character String.

  3. Задайте алфавит допустимых символов из всех латинских букв, для неалфавитных символов поставьте ограничение в 20 %.

  4. В поле Character count задайте нечеткий интервал { -1, 2, 25, INF }, оценивающий длину цепочки символов.
    Предполагаем, что все возможные значения будут находиться в интервале от 2 до 25 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.
Показать пример

  5. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.

  6. Перейдите на закладку Relations.

  7. Поскольку Country может находиться только справа от ключевых слов заголовка kwOrigin с небольшим отступом, но не дальше, чем 500 dot от правого края заголовка, задайте следующее условие поиска:

    • Right of элемента kwOrigin, Offset = 10.

    • Left of элемента kwOrigin, Offset = -500, Reference boundary = Right.

  8. Поскольку Country всегда находится на одном уровне с ключевыми словами заголовка kwOrigin, добавьте следующие условия поиска:

    • Above элемента kwOrigin, Offset = -10, Reference boundary = Bottom.

    • Below элемента kwOrigin, Offset = -10, Reference boundary = Top.

    Замечание. При подборе значений для отступов (offset) бывает полезно обратить внимание на геометрические свойства (границы и размеры) опорных и искомых объектов изображения в режиме просмотра результатов предраспознавания. Подбор значений для отступов (offset) является творческим процессом и осуществляется путем проб и ошибок.

  9. Выберите закладку Advanced.

  10. Поскольку поле Country может находиться на изображении, а может и нет, но при этом всегда присутствует вместе с заголовком, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения, только если найден элемент kwOrigin. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If Footer.kwOrigin.IsNull Then DontFind;

  11. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где он присутствует.

  12. Выберите в качестве описания местоположения блока Country опцию Source element. В качестве source element укажите элемент Country, нажав кнопку [image].


Пример 3. Шаг 25. Поиск полей TotalQuantity и TotalAmount, элементы TotalQuantity и TotalAmount

Проанализировав тестовые изображения, видим, что интересующие нас поля Total Quantity и Total Amount присутствуют только вместе с заголовком Footer.kwTotal и располагаются на одном с ним уровне. Поля Total Quantity и Total Amount будем искать с помощью элементов типа Character String. Для того чтобы задать настройки, общие для этих элементов, нам потребуется составной элемент.

Чтобы создать составной элемент grTotal:

  1. В составе элемента Footer создайте элемент grTotal (тип Group).

  2. Отметьте не заданный по умолчанию пункт Optional element на закладке General (поскольку мы решили не искать элементы данной группы в случае отсутствия заголовка поля на форме).

  3. Выберите закладку Advanced.

  4. Поскольку поля Total Quantity и Total Amount присутствуют на изображении только вместе с заголовком Footer.kwTotal, в поле Advanced pre-search relations задайте дополнительные условия поиска: Если элемент Footer.kwTotal не найден, то не искать объекты изображения. На языке описания FlexiLayout данное условие выглядит следующим образом:

If Footer.kwTotal.IsNull Then DontFind;

Поле Total Quantity располагается на пересечении строки с заголовком Total и столбца Quantity. Первое условие уже задано на уровне группы, а для задания второго условия мы воспользуемся предварительно найденным заголовком столбца в качестве опорного элемента (reference element).

Чтобы создать элемент TotalQuantity:

  1. В составе элемента grTotal создайте элемент TotalQuantity (тип Character String).

  2. Выберите закладку Character String.

  3. В поле Character count задайте нечеткий интервал { -1, 1, 10, INF }, оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 1 до 10 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.

  4. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.

  5. Перейдите на закладку Relations.

  6. Поскольку поле Total Quantity всегда находится на одном уровне с ключевыми словами заголовка Footer.kwTotal, либо несколько ниже, добавьте следующие условия поиска:

    • Above элемента Footer.kwTotal, Offset = -200, Reference boundary = Bottom.

    • Below элемента Footer.kwTotal, Offset = -20, Reference boundary = Top.

    Замечание. При подборе значений для отступов (offset) бывает полезно обратить внимание на геометрические свойства (границы и размеры) опорных и искомых объектов изображения в режиме просмотра результатов предраспознавания. Подбор значений для отступов (offset) является творческим процессом и осуществляется путем проб и ошибок.

  7. Выберите закладку Advanced.

  8. Поскольку поле Total Quantity может находиться на изображении, а может и нет, но при этом всегда присутствует только вместе со столбцом Quantity, под заголовком столбца с небольшим запасом, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения, только если найден элемент TableHeader.kwQuantity, при этом искать не левее чем 50 dot от левой границы заголовка и не правее чем 50 dot от правой границы заголовка столбца. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If Not (TableHeader.kwQuantity.IsNull) Then
    {
    LeftOf: TableHeader.kwQuantity.Right, -50 * dot;
    RightOf: TableHeader.kwQuantity.Left, -50 * dot;
    }
    Else DontFind;

  9. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где он присутствует.

  10. Выберите в качестве описания местоположения блока TotalQuantity опцию Source element. В качестве source element укажите элемент TotalQuantity, нажав кнопку "…".

Поле Total Amount располагается на пересечении строки с заголовком Total (футера таблицы) и столбца таблицы Total. Напомним, что первое условие уже задано на уровне группы. Для задания второго условия мы воспользуемся предварительно найденными заголовками столбцов в качестве опорного элемента (reference element).

Чтобы создать элемент TotalAmount:

  1. В составе элемента grTotal создайте элемент TotalAmount (тип Character String).

  2. Выберите закладку Character String.

  3. В поле Character count задайте нечеткий интервал { -1, 1, 20, INF }, оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 1 до 20 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.

  4. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.

  5. Перейдите на закладку Relations.

  6. Поскольку поле Total Amount всегда находится на одном уровне с ключевыми словами заголовка Footer.kwTotal, добавьте следующие условия поиска:

    • Above элемента Footer.kwTotal, Offset = -20, Reference boundary = Bottom.

    • Below элемента Footer.kwTotal, Offset = -20, Reference boundary = Top.

  7. Выберите закладку Advanced.

  8. Поскольку поле Total Amount может находиться только непосредственно под заголовком столбца Total (с некоторым запасом) по вертикали, другими словами между заголовков столбцов UnitPrice и Sales по вертикали, тоже с небольшим запасом, в поле Advanced pre-search relations задайте дополнительные условия поиска: Если найден элемент TableHeader.kwTotal, то искать объект изображения не правее чем 70 dot от правой границы элемента TableHeader.kwTotal и не левее чем 50 dot левой границы элемента TableHeader.kwTotal; иначе если найдены элементы TableHeader.kwUnitPrice и TableHeader.kwSales, то искать объект изображения не правее чем 40 dot от левой границы элемента TableHeader.kwSales и правее правой границы элемента TableHeader.kwUnitPrice;иначе объект изображения не искать. На языке описания FlexiLayout данное условие выглядит следующим образом:

    If Not (TableHeader.kwTotal.IsNull) Then
    {
    LeftOf: TableHeader.kwTotal.Right, -70 * dot;
    RightOf: TableHeader.kwTotal.Left, -50 * dot;
    }
    Else
    If Not (TableHeader.kwUnitPrice.IsNull) and Not (TableHeader.kwSales.IsNull) Then
    {
    LeftOf: TableHeader.kwSales.Left, -40 * dot;
    RightOf: TableHeader.kwUnitPrice, 0 * dot;
    }
    Else DontFind;

    Замечание. При подборе значений для отступов (offset) бывает полезно обратить внимание на геометрические свойства (границы и размеры) опорных и искомых объектов изображения в режиме просмотра результатов предраспознавания. Подбор значений для отступов (offset) является творческим процессом и осуществляется путем проб и ошибок.

  9. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где он присутствует.

  10. Выберите в качестве описания местоположения блока TotalAmount опцию Source element. В качестве source element укажите элемент TotalAmount, нажав кнопку [image].


Пример 3. Шаг 26. Поиск табличного элемента, элемент InvoiceTable

Итак, все предварительные приготовления произведены, и мы можем искать поле Invoice Table. Опишем элемент типа Table:

  1. Header таблицы. Как уже было решено (см. подробнее Шаг 13), заголовки первых 2х столбцов Reference и Designation мы опишем с помощью соответствующих ключевых слов (диалог свойств табличного элемента -> закладка Columns -> диалог свойств столбца), а для остальных - столбцы Quantity, Unit Price и Total – воспользуемся предварительно описанными вспомогательными элементами.

  2. Footer таблицы. Для задания футера таблицы (Footer) мы решили (см. подробнее Шаг 13) использовать предварительно описанный элемент, отыскивающий начало итоговой части по ключевым словам и фразам.

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

Чтобы создать элемент InvoiceTable:

  1. Создайте элемент InvoiceTable (тип Table).

  2. Выберите закладку Columns.

  3. Выберите в качестве блока, для поиска которого служит данный элемент, ранее созданный (см. Шаг 2) блок InvoiceTable, нажав кнопку "Select".

  4. Выберите в списке столбцов Reference и нажмите кнопку Properties….
    Заголовок данного столбца мы будем искать по ключевому слову Reference, поэтому оставьте значения по умолчанию.

  5. Выберите в списке столбцов Designation и нажмите кнопку Properties….
    Заголовок данного столбца мы будем искать по ключевому слову Designation, поэтому оставьте значения по умолчанию.

  6. Выберите в списке столбцов Quantity и нажмите кнопку Properties….
    Для заголовка данного столбца мы будем использовать ранее найденный элемент TableHeader.kwQuantity. Для этого переключитесь на опцию Use found element as column name и выберите элемент TableHeader.kwQuantity, нажав кнопку [image].

    Показать пример

  7. Выберите в списке столбцов UnitPrice и нажмите кнопку Properties….
    Для заголовка данного столбца мы будем использовать ранее найденный элемент TableHeader.kwUnitPrice. Для этого переключитесь на опцию Use found element as column name и выберите элемент TableHeader.kwUnitPrice, нажав кнопку [image].

    Показать пример

  8. Выберите в списке столбцов Total и нажмите кнопку Properties….
    Для заголовка данного столбца мы будем использовать ранее найденный элемент TableHeader.kwTotal. Для этого переключитесь на опцию Use found element as column name и выберите элемент TableHeader.kwTotal, нажав кнопку [image].

  9. Выберите закладку Order.

  10. Поскольку искомые столбцы могут перемежаться другими (например, Unit), но всегда следуют в следующем порядке: сначала Reference, потом Designation, потом Quantity, правее него Unit Price, и ещё правее Total, - то выберем вариант Rules for column order и, нажав кнопку Add…, добавим все столбцы в таком порядке: Reference << Designation << Quantity << Unit Price << Total.
    Показать пример

    Показать пример

  11. Выберите закладку Header. Заголовок таблицы нам нужен, но других ограничений мы накладывать не будем, поэтому оставьте значения по умолчанию.

    Показать пример

  12. Выберите закладку Footer. Для итоговой части таблицы мы будем использовать ранее найденный элемент Footer.kwFooter. Для этого переключитесь на опцию Use found element as footer и выберите элемент Footer.kwFooter, нажав кнопку [image].

    Показать пример

  13. Выберите закладку Rows.

  14. Поскольку в нашей таблице некоторые столбцы могут содержать многострочные (multiline) записи (rows), необходимо задать ключевые столбцы для разделения на строки. Выберите опцию Use master columns to detect rows.
    В качестве разделителя на строки первым укажем столбец Total, так как в этом столбце всегда присутствуют данные, и каждой записи таблицы в этом столбце соответствует одна строка данных. На тот случай, если данный столбец не будет обнаружен на форме, укажем следующими разделителями столбец Quantity и столбец Unit Price. Выберите данный набор столбцов с помощью кнопки [image].
    Показать пример

  15. Выберите закладку Relations. Поскольку интересующие нас столбцы таблицы располагаются левее начала заголовка столбца Sales с некоторым запасом, добавьте следующие условия поиска:

    Left of элемента TableHeader.kwSales, Offset = -40, Reference boundary = Left.

    Замечание. При подборе значений для отступов (offset) бывает полезно обратить внимание на геометрические свойства (границы и размеры) опорных и искомых объектов изображения в режиме просмотра результатов предраспознавания. В остальном эти значения подбираются опытным путем.

  16. Наложим шаблон на тестовый набор изображений.

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

    Чтобы отделить данные столбца Quantity от мусора, зададим тип контекста для данного столбца.

  17. Откройте диалог Properties табличного элемента InvoiceTable.
    Перейдите на закладку Columns, откройте диалог Properties для столбца Quantity, отметьте опцию проверки содержимого столбца Check content type. В типе контекста Type of column content выберите Number.
    Показать пример

  18. Если мы протестируем изображения теперь, то видим, что сейчас в столбец Quantity попадают только цифры, что и требовалось.
  19. Выберите в качестве описания местоположения блока InvoiceTable опцию Source element. В качестве source element укажите элемент InvoiceTable, нажав кнопку [image].


Пример 3. Шаг 27. Экспорт гибкого описания и подключение его к определению документа FlexiCapture

Полученное гибкое описание можно экспортировать в формат ABBYY FlexiLayout (*.afl) и подключить к определению документа в программе ABBYY FlexiCapture.

Замечание. Подробнее об экспорте и подключении смотрите Пример1, Шаг 21 - Шаг 22.


Пример 4. Краткое описание документа Invoice Multipage

Краткое описание документа Invoice Multi-page

Внимание! В этом примере рассматривается многостраничный документ.

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

Замечание. Программа FlexiLayout Studio 10 позволяет создавать гибкие описания для многостраничных документов. В этом случае весь документ рассматривается как одно целое и поиск элементов может производиться независимо от страницы, на которой элементы находятся. Подробнее см. раздел Многостраничное гибкое описание.

На примере документа Invoices мы проследим по шагам процесс создания гибкого описания, познакомимся с некоторыми нестандартными подходами к описанию местоположения объектов, а также научимся находить объекты изображения, соответствующие началу и концу многостраничного документа и многостраничные элементы (в данном примере многостраничную таблицу). Подробнее см. Элементы Header и Footer.

Конечной целью создания гибкого описания данного документа в ABBYY FlexiLayout Studio является устойчивое нахождение во всех тестовых документах местоположения следующих полей:

  • Invoice Number
  • Invoice Date
  • Delivery Address
  • Total Amount
  • Invoice Table (столбцы Reference, Designation, Unit, Quantity, Unit Price, Total)
  • Company


Пример 4. Шаг 1. Создание нового проекта

Пример 4. Шаг 1. Предварительные настройки

  1. Запустите программу ABBYY FlexiLayout Studio 10.
  2. Создайте новый проект (File>New Project).
  3. В открывшемся диалоге задайте имя проекта Invoices и выберите тип проекта ABBYY FlexiLayout Project Files (*.fsp).
  4. Добавьте изображения в пакет (подробнее см. Пример 1, шаг 2).
    Тестовые изображения четвертого примера хранятся в
    %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Invoice\InvoicesBatch\<page number>\Images\bwPage.dat.
    Для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2 тестовые проекты расположены в папке
    %public%\ABBYY\FlexiCapture\10.0\Samples\FLS    .
  5. Для каждого документа пакета, можно задать эталонную сборку, которая будет отражать желаемое распределение страниц по документам. Эталонная сборка может быть создана вручную или автоматически при добавлении изображений в пакет. Эталонная сборка дает возможность сравнивать результаты сборки страниц в документы при наложении гибкого описания и желаемое распределение страниц по документам. Подробнее об эталонной сборке см. раздел Эталонная сборка страниц в документы.

Для того чтобы правильно сгруппировать страницы в документы сначала необходимо их проанализировать и определить страницы, которые относятся к одному документу, а также их порядок. В окне Batch страницы одного пакета должны следовать строго одна за другой (первая страница>вторая и т.д.).

Замечание. В случае, если страницы были добавлены в пакет не по порядку и их невозможно собрать в документы, их необходимо перенумеровать. Для этого перетащите мышкой страницу в окне Batch (программа автоматически перенумерует страницы).

  • В окне Batch выделите страницы, которые относятся к одному документу.
  • Нажмите правую кнопку мыши и выберите в локальном меню пункт Assemble to Reference Documents….
  • В диалоге Assemble to Reference Documents выберите опцию One document. Программа сгруппирует все выделенные страницы в один документ.
  • Отметьте опцию First page of document matches Header. Этой опцией мы указываем программе, что элемент Header обязательно должен быть наложен на первую страницу документа.
  • Отметьте опцию Last page of document matches Footer, так последнюю страницу документа мы будем описывать с помощью элемента Footer.
  • Нажмите OK. Эталонная разметка отобразится в режиме Reference layout: начало и конец документа выделяются зелеными уголками.

    Замечание. В случае, если страницы были собраны неправильно, сборку можно отменить командой Disassemble Reference Documents.

  6. Настройте свойства гибкого описания:
  • Name – Invoice.
  • Text Type - следует выбрать способ заполнения документа Typographic и Matrix printer.
  • Text languages - наш документ является англоязычным, поэтому в качестве языка предраспознавания в списке выберите English.
  • Mode - режим предраспознавания выберите Fast.
  • Minimum number of pages - 1, так как наш документ может состоять минимум из одной страницы.
  • Maximum number of pages - 3, так как в одном документе может быть максимум 3 страницы.
Показать пример

Замечание. Более подробно о критериях выбора параметров предраспознавания см. Пример 1, шаг 3.


Пример 4. Шаг 2. Просмотр изображений и результатов предраспознавания

Перед созданием элементов гибкого описания необходимо понять, на какие объекты изображений документов мы можем опереться для идентификации начала и конца документа, а также для поиска нужных полей. Опорными объектами могут служить только такие графические и/или текстовые фрагменты изображения, которые устойчиво находятся в процессе предраспознавания изображений документов

Замечание. Для определения начала и конца документа служат специальные элементы Header и Footer. Они могут состоять из одного или нескольких элементов, строго идентифицирующих первую и последнюю страницы документа соответственно.

Чтобы запустить процесс предраспознавания:

  1. Выделите все изображения в пакете.
  2. Выберите команду Pre-Recognize (меню Batch или локальное меню изображения).

Замечание. Более подробно о процессе запуска предраспознавания см. Пример 1, шаг 4.

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

Замечание. Более подробно о просмотре страниц и результатах предраспознавания см. Пример 1, шаг 5, шаг 6.

Теперь можно приступать непосредственно к созданию и настройке опорных элементов и заданию критериев поиска блоков, соответствующих искомым полям. Для этого перейдите в окно FlexiLayout в главном окне программы ABBYY FlexiLayout Studio.


Пример 4. Шаг 3. Блоки

Целью создания данного гибкого описания является нахождение местоположения следующих блоков (в случае их наличия на изображении):

  • Invoice Number
  • Invoice Date
  • Delivery Address
  • Total Amount
  • Invoice Table (столбцы Reference, Designation, Unit, Quantity, Unit Price, Total)
  • Company

Для удобства и наглядности при создании гибкого описания создайте список всех требуемых блоков:

  1. Создайте блок InvoiceNumber (тип Text), соответствующий полю Invoice Number.
  2. Создайте блок InvoiceDate (тип Text), соответствующий полю Invoice Date.
  3. Создайте блок DeliveryAddress (тип Text), соответствующий полю Delivery Address.
  4. Создайте блок TotalAmount (тип Text), соответствующий полю Total Amount.
  5. Создайте блок Company (тип Text), соответствующий полю Company.
  6. Создайте блок InvoiceTable (тип Table), соответствующий полю Invoice Table.
    В диалоге свойств блока на закладке Columns последовательно добавьте названия столбцов в следующем порядке: Reference, Designation, Unit, Quantity, UnitPrice, Total.

Замечание. Указанные названия столбцов и порядок их следования будут соответствовать данному блоку в определении документа FlexiCapture.

Замечание. Более подробно о создании блока типа Table см. Пример 3, Шаг 3.

На этом процедура задания свойств гибкого описания и начальных приготовлений к работе закончена и можно приступать непосредственно к созданию элементов.


Пример 4. Шаг 4. Анализ изображений и определение последовательности поиска элементов и групп элементов

Необходимо выяснить:

  • Какова закономерность расположения полей на изображении?
  • На какие элементы мы можем опереться в поиске полей?
  • Какую выбрать последовательность поиска (поскольку на каждом следующем шаге мы можем опираться только на описанные выше элементы)?

Так как мы создаем описание для многостраничного документа, то в первую очередь необходимо определить какие объекты изображения можно использовать для описания первой и последней страниц документа. Для этого в программе предусмотрены специальные составные элементы Header и Footer.

  • Элемент Header должен накладываться по возможности только на первую страницу документа.
    При наличии шаблонов документов других типов в одном проекте программы FlexiCapture 10 данный элемент также играет роль идентификационного (уникального признака данного типа документа).
  • Элемент Footer должен накладываться только на последнюю страницу документа, он служит для определения конца документа. Рекомендуется создавать в этой группе обязательные подэлементы, которые не позволят наложить Footer на промежуточную страницу документа.

Анализ изображений документов показывает, что:

  1. На первой странице документов располагается группа полей Invoice Number, Invoice Date, Delivery Address. При этом заголовок поля Invoice Number всегда присутствует в начале каждого документа, в то время как поля Invoice Date и Delivery Address могут и отсутствовать.
  • Поля Invoice Number и Invoice Date могут располагаться или справа от соответствующего заголовка или под ним.
  • Delivery Address тоже будем искать справа и под соответствующим заголовком, строго ограничив область поиска. Кроме этого нам понадобится дополнительный элемент для ограничения снизу.
  • Так как значения этих полей присутствует не на всех изображениях, то для ускорения процедуры наложения шаблона, можно задать дополнительное условие – не искать значение поля, если не найден его заголовок.
  2. Мы можем использовать группу этих полей как идентификатор нашего документа. Поэтому эти поля будем описывать в составе предопределенного в программе группового элемента Header (назовем его InvoiceHeader).
  3. Последняя страница документа характеризуется словами TOTAL AMOUNT MUST, Carried over, Total CHF, TOTAL, которые находятся ниже таблицы. Но они не уникальны и в наших документах могут встречаться и в заголовке, и в теле таблицы. Поэтому для их поиска дополнительно потребуются опорные элементы, например заголовки некоторых столбцов, опираясь на которые, мы можем описать правильную область поиска наших слов.
  4. Элементы, которыми мы будем описывать последнюю страницу, мы будем создавать в составе предопределенного в программе группового элемента Footer (назовем его InvoiceFooter).
  5. Для того чтобы Footer накладывался только на последнюю страницу документа, он должен содержать в себе обязательный элемент. Так как слова, которые идентифицируют последнюю страницу (см. п.3), находятся на каждой последней странице каждого документа, то элемент, описывающий их, сделаем обязательным.
  6. Таблица (назовем ее InvoiceTable) в наших документах всегда начинается на первой странице и заканчивается на последней. Кроме этого, она всегда ограничена сверху заголовками ее столбцов на первой странице. А ограничение снизу (на последней странице) легче всего задать через вспомогательный элемент, например, мы можем использовать обязательный элемент из группы InvoiceFooter.

    Замечание. Множество всех страниц документа называется многостраничным полотном. Многостраничное полотно образуется при склеивании страниц документа сверху вниз, без стыков и зазоров, левые границы всех страниц лежат на одной прямой, проходящей через точку (0, 0). Порядок склейки страниц определяется порядком страниц в пакете. Поэтому мы можем задать только начало таблицы – ее header на первой странице и конец – footer на последней. Программа будет искать таблицу на протяжении всего документа, всего многостраничного полотна.
  7. Название компании Company мы будем искать всегда на первой странице документа, причем только в первой ее трети.
  8. Заголовок поля Total Amount всегда располагается на последней странице под таблицей. Значение поля будем искать или правее или ниже заголовка.


Пример 4. Шаг 5. Header документа, описание группы InvoiceHeader

В группе InvoiceHeader мы опишем элементы, которые помогут нам идентифицировать первую страницу документа.

  1. Для описания поиска ключевых слов (keywords) заголовков полей Invoice Number, Delivery Address и Invoice Date будем создавать следующие элементы типа Static Text:
  • Элемент kwInvoiceNumber - подробная инструкция в Шаге 5.1.
  • Элемент kwDeliveryAddress - подробная инструкция в Шаге 5.2.
  • Элемент kwInvoiceDate - подробная инструкция в Шаге 5.3.
  2. Поиск полей Invoice Number и Invoice Date будем осуществлять правее и под соответствующим заголовком с помощью элементов:
  • InvoiceNumber, типа Character String - подробная инструкция в Шаг 5.4.
  • InvoiceDate, типа Date (в случае хорошего качества изображения) и InvoiceDateAsString, типа Character String, (в том случае, если поиск элемента InvoiceDate оказался неуспешным), объединив их в составном элементе grDate - подробная инструкция в Шаге 5.5).

Замечание. Более подробно про поиск даты в случае плохого качества изображений см. Советы и рекомендации.

  3. Для определения поля Delivery Address, которое является многострочным, будем использовать элемент DeliveryAddress типа Paragraph (подробная инструкция в Шаге 5.6), задав область поиска самым строгим образом.
    В качестве ограничителя области поиска снизу будем использовать элемент wgAddressAbove типа White Gap. (подробная инструкция в Шаге 5.6)
    И объединим все эти элементы, служащие описанию местоположения поля Delivery Address, в отдельную группу - grAddress:


Пример 4. Шаг 5.1 Поиск заголовка поля Invoice Number, элемент kwInvoiceNumber

Анализ изображения показывает:

  • Заголовок поля Invoice Number присутствует на всех изображениях и отличает их от других типов документов. Поэтому сделаем заголовок поля Invoice Number обязательным, то есть идентификационным элементом для данного типа документов Подробнее см. Обязательные, необязательные и недопустимые элементы.
  • Заголовок на изображениях представлен фразами Invoice no., Credit note No, Invoice Number:, Invoice Number.
    Поэтому составим нашу поисковую строку из всех возможных вариантов, при этом запишем каждую фразу слитно, чтобы ограничения на количество ошибок относились ко всей фразе целиком, а не к отдельным словам.
  • Нас интересует поле только с первых страниц документов, причем только в первой части первой страницы (на первых страницах некоторых документов есть статический текст по содержанию похожий на наш заголовок, но располагается он ближе к концу страницы).

Чтобы создать элемент kwInvoiceNumber:

  1. В составе элемента InvoiceHeader создайте элемент kwInvoiceNumber (тип Static Text).
  2. Выберите пункт Required element на закладке General (поскольку данный элемент мы решили сделать обязательным).
  3. Выберите закладку Static Text.
  4. В поле Search text укажите значение искомого текста: InvoiceNo.|CreditNoteNo|InvoiceNumber:|InvoiceNumber
  5. Задайте значение свойства Max error percentage равным 20.
  6. Выберите закладку Search Constraints и задайте область поиска прямоугольником в абсолютных координатах на первой странице:
  • отметьте опцию Absolute search area constraints,
  • в поле Pages из списка выберите Range,
  • в поле Range укажите 1,
  • в поле Region укажите прямоугольник [1, 1, 2475, 1878]
  • задав свойств области поиска нажмите кнопку Add. Область появится в списке Search areas.
Показать пример

  7. Выберите закладку Advanced
  8. В поле Advanced pre-search relations задайте дополнительные параметры:

    WholeWordMode: true; // в качестве гипотез будут рассматриваться только целые текстовые объекты.
    MaxGapInLine: 50dt; // максимально допустимое расстояние между соседними символами.
  9. Задав дополнительную проверку в поле Advanced post-search relations мы можем повлиять на качество сформированных гипотез, например, в данном случае такую: если элемент найден, вычислить разницу между эталонной шириной и шириной региона найденного элемента и проверить ее на вхождение в нечеткий интервал.
    На языке описания FlexiLayout данное условие выглядит следующим образом:

    If not IsNull then
    { FuzzyQuality: 600dt - width, {-70000,0,0,70000}*dt;
    }
    //такая проверка означает, что чем больше разница, тем выше штрафующий коэффициент

    Замечание. Для описания положения объектов на странице и расстояний между ними используется двумерная система координат с горизонтальной и вертикальной осями. Точка отсчета (0, 0) координатных осей расположена в левом верхнем углу изображения. Положительное направление оси абсцисс - слева направо, оси ординат - сверху вниз.
  10. Протестируйте изображения, временно исключив элемент InvoiceFooter.
    Замечание. Для того чтобы исключить элемент, выделите его в дереве элементов и в меню FlexiLayout выберите команду Disable.


Пример 4. Шаг 5.2 Поиск заголовка поля Delivery Address, элемент kwDeliveryAddress

Анализ изображения показывает:

  • Искомое поле находится всегда на первой странице документов, причем только в первой части первой страницы. Поэтому область поиска ограничим первой страницей, прямоугольником в абсолютных координатах.
  • Поиск текста будем осуществлять на основе текста из файла AddressHeaders.txt.
    Замечание. В интерфейсе программы и в языке гибких описаний поддерживается возможность обращения к базам данных и текстовым файлам, например, для задания набора строк для поиска на изображении. Текстовые файлы могут быть как в формате ANSI, так и в формате Unicode. Регистр написания не влияет на поиск и используется только для повышения читабельности. Каждый вариант текстовой строки для поиска должен быть определен на новой строке. Пустые строки игнорируются.
  • Число ошибок в заголовке можно ограничить 20 процентами, что в нашем случае будет означать не более 3х ошибок во всей фразе.
    Замечание. Подбор значения допустимого числа ошибок является творческим процессом и осуществляется путем подбора. Более подробно о параметрах элемента типа Static Text см. Static Text.

Чтобы создать элемент kwDeliveryAddress:

  1. В составе элемента InvoiceHeader создайте элемент kwDeliveryAddress (тип Static Text).
  2. Выберите закладку Static Text.
  3. Отметьте опцию Search text from file и укажите путь к файлу AddressHeaders.txt.
    Замечание. Файл AddressHeaders.txt хранится в папке
    %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\FlexiLayout Studio\Invoice\Dict для ОС Microsoft Windows XP или в папке %public%\ABBYY\FlexiCapture\10.0\Samples\FLS\English\FlexiLayout Studio\Invoice\Dict для OC Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2.
    Обращение к текстовому файлу производится по имени файла, которое может быть как абсолютным, так и задаваться относительно каталога проекта FlexiCapture (содержащего файл *.fcproj) или каталога пакета проекта FlexiLayout Studio (содержащего изображения).
    4. Показать пример

  4. Задайте значение свойства Max error percentage равным 20.
  5. Выберите закладку Search Constraints и задайте область поиска прямоугольником в абсолютных координатах на первой странице:
  • отметьте опцию Absolute search area constraints,
  • в поле Pages из списка выберите Range,
  • в поле Range укажите 1,
  • в поле Region укажите прямоугольник [1, 1, 2475, 1878] и нажмите кнопку Add. Область появится в списке Search areas.
  6. На закладке Advanced в поле Advanced pre-search relations задайте
    WholeWordMode: true; // в качестве гипотез будут рассматриваться только целые текстовые объекты.
  7. Протестируйте изображения (временно исключите элемент InvoiceFooter).


Пример 4. Шаг 5.3 Поиск заголовка поля Invoice Date, элемент kwInvoiceDate

Анализ тестовых изображений показывает:

  • Заголовок поля Invoice Date представлен коротким и очень распространенным словом Date.
    Следовательно, требуется максимально сузить область поиска.
  • Заголовок поля Date (в случае наличия на изображении этого поля) располагается очень близко к заголовку поля Invoice Number.

Чтобы создать элемент kwInvoiceDate:

  1. В составе элемента InvoiceHeader создайте элемент kwInvoiceDate (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: Date.
  4. Оставьте значение свойства Max error percentage равным 30 (что для нашего 4х буквенного слова означает ошибку не более чем в одной букве).
  5. Выберите закладку Relations.
  6. На закладке Relations нажмите Add добавьте отношения, указывающие, что ключевые слова заголовка могут находиться не выше заголовка поля Invoice Number, чем на расстояние 30 dot от его верхней границы, но и не ниже чем на расстоянии 700 dot от его нижней границы:
  • Below верхней границы региона элемента kwInvoiceNumber, Offset = -30, Reference boundary = Top.
  • Above нижней границы региона элемента kwInvoiceNumber, Offset = -700, Reference boundary = Bottom.

Замечание. При подборе значений для отступов (offset) бывает полезно обратить внимание на геометрические свойства (границы и размеры) опорных и искомых объектов изображения в режиме просмотра результатов предраспознавания. Для этого удобно пользоваться инструментом измерения параметров – Measure Rectangle. Значения для отступов (offset) подбираются опытным путем.

  7. Протестируйте изображения (временно исключите элемент InvoiceFooter).

Наложение гибкого описания показывает, что

  • на первой странице некоторых документов для kwInvoiceDate было построено несколько гипотез и выбрана не та, которая нам нужна. Чтобы исключить подобную ошибку надо скорректировать свойства элемента.
  • повторно проанализировав наши изображения можно заметить, что интересующее нас поле находится ближе всего к верхней границе страницы.

Для того чтобы задать дополнительное условие поиска:

  1. Откройте диалог Properties со свойствами элемента kwInvoiceDate.
  2. Выберите закладку Relations.
  3. Отметьте опцию Nearest и из выпадающего списка To выберите Page top edge.
Показать пример

Повторное тестирование показывает, что заголовок поля Invoice Date обнаруживается устойчиво.


Пример 4. Пример 4. Шаг 5.4 Описание поля Invoice Number, элемент InvoiceNumber

Пример 4. Шаг 5.4 Описание поля Invoice Number, элемент InvoiceNumber

Поле Invoice Number на некоторых документах располагается правее заголовка и на том же уровне, а на других - под заголовком (в первом и втором документах, значение поля указано непосредственно под заголовком).

Чтобы создать элемент InvoiceNumber:

  1. В составе элемента InvoiceHeader создайте элемент InvoiceNumber (тип Character String).
    Замечание. Совпадение имени элемента с именем блока, соответствующего полю InvoiceNumber, не обязательно, но удобно для дальнейшей работы с гибким описанием.
  2. Выберите закладку Character String.
  3. Задайте алфавит
    -./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
  4. Задайте значение параметра Percentage of non-alphabet characters равным 30%.
  5. В поле Character count задайте нечеткий интервал {-1, 3, 20, INF}, оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 3 до 20 символов. Любая гипотеза, входящая за рамки данного интервала, будет штрафоваться.
  6. На некоторых изображениях в область поиска поля InvoiceNumber попадает уже найденныйэлемент kwInvoiceDate. Для того чтобы не рассматривать значение этого элемента в качестве гипотезы поля InvoiceNumber, исключим этот элемент из области поиска:
  • На закладке Search Constrainst нажмите кнопку Add… рядом с полем Exclude elements,
  • В списке элементов выберите kwInvoiceDate,
  • Нажмите кнопку OK.
  • После этого в поле Exclude elements вы увидите строчку SearchElements.InvoiceHeader.kwInvoiceDate;
Показать пример

  7. Перейдите на закладку Advanced.
  8. В поле Advanced pre-search relations задайте дополнительные условия поиска: если заголовок kwInvoiceNumber не найден, то поле InvoiceNumber не искать, в противном случае задайте область поиска поля массивом прямоугольников: один справа от заголовка, другой - под заголовком с некоторым отступом. На языке описания FlexiLayout данное условие выглядит следующим образом:

if kwInvoiceNumber.IsNull then Dontfind();
else
{ WholeWordMOde: true;
MaxGapInLine: 30dt;

RectArray DataRegion;

Let r1= Rect (kwInvoiceNumber.Rect.Right, kwInvoiceNumber.Rect.Top -20dt,
  kwInvoiceNumber.Rect.Right + 650dt, kwInvoiceNumber.Rect.Bottom + 50dt);
// ограничим область поиска прямоугольником справа от заголовка поля
  InvoiceNumber

Let r2 = Rect (kwInvoiceNumber.Rect.Left - 100dt, kwInvoiceNumber.Rect.Bottom,
  kwInvoiceNumber.Rect.Right + 100dt, kwInvoiceNumber.Rect.Bottom + 100dt);
// ограничим область поиска прямоугольником снизу от заголовка поля
  InvoiceNumber

DataRegion = RectArray (r1);
DataRegion.Add (r2);
RestrictSearchArea (DataRegion);
}

  9. Область поиска значения поля обозначена двумя прямоугольниками – справа от заголовка и под ним. Причем, если значение поля располагается справа от его заголовка, то на большинстве тестовых изображений под заголовком присутствует какой-то текст (чаще всего заголовок и значение поля даты). Так как на большинстве изображений этот ненужный текст попадает в область поиска поля InvoiceNumber, программа создаст для него гипотезу. Чтобы повлиять на качество такой гипотезы, в поле Advanced post-search relations задайте дополнительные параметры проверки: чем значение поля ниже заголовка, тем сильнее штрафовать гипотезу. На языке описания FlexiLayout данное условие выглядит следующим образом:

if not IsNull then
{ FuzzyQuality: Top - kwInvoiceNumber.Rect.Top, {-30000,0,0,10000}*dt;
}
// Это означает, что чем дальше верхняя граница поля от верхней границы заголовка, тем сильнее будет оштрафована гипотеза. В данном случае наибольшее качество будет у гипотезы того элемента, верхняя граница которого совпадает с верхней границей заголовка.

  10. Протестируйте изображения (временно исключите элемент InvoiceFooter).
  11. Задайте местоположение блока InvoiceNumber в виде прямоугольника региона элемента InvoiceNumber, увеличенного по высоте и ширине на 5 dot. Для этого выберите опцию Expression и задайте следующее выражение:

Rect outputRect;
outputRect = InvoiceHeader.InvoiceNumber.Rect;
IsNull = InvoiceHeader.InvoiceNumber.IsNull;
// Считать регион блока найденным, если найден элемент InvoiceNumber

OutputRegion = outputRect;
OutputRegion.Inflate (5dt, 5dt);


Пример 4. Шаг 5.5 Описание поля Invoice Date, элементы grDate, InvoiceDate и InvoiceDateAsString

Анализ изображения показывает:

  • В некоторых документах поле Invoice Date располагается правее заголовка и на том же уровне, на других - под заголовком. Поэтому область поиска ограничим прямоугольниками справа и снизу заголовка.
  • Для поиска даты воспользуемся элементом типа Date. Дополнительно зададим проверку – если заголовок не найден, то значение искать не нужно.
  • На практике часто встречаются изображения, когда текст даты распознаётся не очень хорошо. Это может быть связано с различными дефектами сканирования или не предусмотренным форматом даты и т.д. Поэтому на тот случай, если поиск даты элементом типа Date не даст результатов, дополнительно опишем элемент типа Character String.

Для того чтобы задать настройки, общие для всех этих элементов, нам потребуется составной элемент.

Чтобы создать элемент grDate:

1. В составе элемента InvoiceHeader создайте элемент grDate (тип Group).

2. Перейдите на закладку Advanced и задайте дополнительные условия поиска: ограничить область поиска поля массивом прямоугольников: один справа от заголовка, другой - под заголовком с некоторым отступом. На языке описания FlexiLayout данное условие выглядит следующим образом:

RectArray DataRegion;

Let r1= Rect (kwInvoiceDate.Rect.Right, kwInvoiceDate.Rect.Top -20dt,
kwInvoiceDate.Rect.Right + 650dt, kwInvoiceDate.Rect.Bottom + 50dt);
Let r2 = Rect (kwInvoiceDate.Rect.Left - 150dt, kwInvoiceDate.Rect.Bottom,
kwInvoiceDate.Rect.Right + 100dt, kwInvoiceDate.Rect.Bottom + 100dt);

DataRegion = RectArray (r1);
DataRegion.Add (r2);
RestrictSearchArea (DataRegion);

Чтобы создать элемент InvoiceDate:

1. В составе элемента InvoiceHeader.grDate создайте элемент InvoiceDate (тип Date).

2. Выберите закладку Date.

3. Для элемента InvoiceDate на закладке Date следует указать все допустимые форматы записи даты:

Показать пример

  4. На некоторых изображениях в область поиска поля InvoiceDate попадают уже найденные эелементы kwInvoiceNumber и InvoiceNumber. Для того чтобы не рассматривать значение этих элементов в качестве гипотез поля InvoiceDate, исключим эти элементы из области поиска:
  • Нажмите кнопку Add… рядом с полем Exclude elements,
  • В списке элементов выберите kwInvoiceNumber,
  • Нажмите кнопку Ok.
  • После этого в поле Exclude elements вы увидите строчку SearchElements.InvoiceHeader.kwInvoiceNumber;

Повторите эти действия для элемента SearchElements.InvoiceHeader.InvoiceNumber.

  5. Выберите закладку Advanced.
  6. Поле Invoice Date является необязательным элементом. Но в случае присутствия даты в документе (поле Invoice Date) всегда присутствует и заголовок даты, описанный нами ранее с помощью элемента kwInvoiceDate. Таким образом, в поле Advanced pre-search relations можно задать дополнительные условия поиска: Искать объект изображения, только если найден элемент kwInvoiceDate. На языке описания FlexiLayout данное условие выглядит следующим образом:

If InvoiceHeader.kwInvoiceDate.IsNull
Then DontFind();

  7. Протестируйте изображения (временно исключите элемент InvoiceFooter).

На случай изображений низкого качества, когда результаты распознавания не подходят ни под один из стандартных параметров для элемента Date, дополним гибкое описание альтернативным элементом, ищущим поле Invoice Date, с менее строгими условиями.

Для того чтобы создать элемент InvoiceDateAsString:

  1. В составе элемента InvoiceHeader.grDate создайте элемент InvoiceDateAsString типа Character String.
  2. Выберите закладку Character String.
  3. Задайте алфавит
    ,-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
  4. Процент неалфавитных символов задайте равным 30%.
  5. В поле Character count задайте нечеткий интервал {-1, 8, 14, INF}, оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 8 до 14 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.
  6. В поле Max space length задайте значение 20, ограничивающее допустимый размер просвета в текстовой строке в 20 dot;
  7. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.
  8. Выберите закладку Advanced.
  9. Поскольку элемент InvoiceDateAsString мы хотим искать только в том случае, если элемент InvoiceDate не обнаружен на изображении, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения, только если не найден элемент InvoiceDate. На языке описания FlexiLayout данное условие выглядит следующим образом:

If Not InvoiceDate.IsNull Then DontFind;

  10. Зададим аналогичные InvoiceDate дополнительные условия поиска: Искать объект изображения, только если найден элемент kwInvoiceDate. Искать объект изображения, ближайший к элементу kwInvoiceDate. На языке описания FlexiLayout данное условие выглядит следующим образом:

If InvoiceHeader.kwInvoiceDate.IsNull Then DontFind;
Nearest: InvoiceHeader.kwInvoiceDate;

  11. Задайте местоположение блока InvoiceDate в виде прямоугольника региона найденного элемента InvoiceDate или InvoiceDateAsString, увеличенного по высоте и ширине на 5 dot. Для этого выберите опцию Expression и задайте следующее выражение:

Rect outputRect;
if not InvoiceHeader.grDate.InvoiceDate.IsNull then
outputRect = InvoiceHeader.grDate.InvoiceDate.Rect;
else
{ outputRect = InvoiceHeader.grDate.InvoiceDateAsString.Rect;
IsNull = InvoiceHeader.grDate.InvoiceDateAsString.IsNull;
}
OutputRegion = outputRect;
OutputRegion.Inflate (5dt, 5dt);


Пример 4. Шаг 5.6 Описание поля Delivery Address, элементы grAddress, wgAddressAbove, DeliveryAddress

Местоположение поля Delivery Address мы решили искать:

  • справа и снизу от заголовка поля.
  • с помощью элемента White Gap – в качестве ограничителя снизу.
  • с помощью элемента типа Paragraph.

Чтобы задать настройки, общие для этих элементов, нам потребуется составной элемент. Для того чтобы создать элемент grAddress:

1. В составе элемента InvoiceHeader создайте элемент grAddress (тип Group).

2. Перейдите на закладку Relations и задайте следующие условия поиска элементов группы:

  • Above элемента kwDeliveryAddress, Offset = -400
  • Left of правой границы элемента kwDeliveryAddress, Offset = -800, Reference boundary = Right.
  • Right of левой границы элемента kwDeliveryAddress, Offset = -50, Reference boundary = Left.
  • Below верхней границы элемента kwDeliveryAddress, Offset = -20, Reference boundary = Top.
Показать пример

Для ограничения области поиска элемента DeliveryAddress снизу опишем горизонтальный просвет (White Gap).

Чтобы создать элемент wgAddressAbove:

  1. В составе элемента InvoiceHeader.grAddress создайте элемент wgAddressAbove (тип White Gap).
  2. Выберите закладку White Gap.
  3. В группе Orientation выберите Horizontal. Минимальную высоту (Min height) поставьте равной 55.
    Замечание. При подборе значений для высоты/ширины просветов бывает полезно обратить внимание на геометрические свойства (границы и размеры) близлежащих объектов изображения в режиме просмотра результатов предраспознавания.
  4. Просвет мы будем искать среди текста, поэтому в группе Search among objects of type отметьте только опцию Text.
  5. В группе Rubbish установите следующие параметры для опций:
  • Lower threshold limit – 20;
  • Upper threshold limit – 80;
  • Threshold coefficient (%) – 10.
Показать пример

Замечание. Значения свойств Lower threshold limit, Upper threshold limit и Threshold coefficient (%) подбираются опытным путем. Подбор значений рекомендуется начинать со значений по умолчанию, если же поиск со значениями по умолчанию приводит к неудовлетворительным результатам, тогда следует подобрать такие значения свойств, которые позволят найти искомый просвет на всех тестовых изображениях.

  6. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.
  7. Перейдите на закладку Relations.
  8. Поскольку просвет может находиться только снизу от ключевых слов заголовка kwDeliveryAddress, задайте следующее условие поиска:

Below элемента kwDeliveryAddress, Offset = 20
Offset необходимо задать для того чтобы исключить нахождение просветов например между заголовком и текстом. Выберите закладку Advanced.

  9. Поскольку поле Delivery Address может присутствовать на изображении, а может и нет, но при этом всегда присутствует вместе с заголовком, в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения, только если найден элемент kwDeliveryAddress. На языке описания FlexiLayout данное условие выглядит следующим образом:

If InvoiceHeader.kwDeliveryAddress.IsNull Then DontFind;

  10. Протестируйте нахождение элемента wgAddressAbove на изображениях.
  11. Поскольку в заданной области поиска на некоторых изображениях программа находит несколько просветов и выбирает не тот, который нас интересует, необходимо задать дополнительные ограничения. Анализ показывает, что интересующий нас просвет – самый верхний в заданной области поиска. Поэтому в поле Advanced pre-search relations задайте дополнительные условия поиска: Искать объект изображения ближайший по вертикали к верхней границе первой страницы. На языке описания FlexiLayout данное условие выглядит следующим образом:

NearestY: Page(1).RectGlobal.Top;

  12. Протестируйте изображения (временно исключите элемент InvoiceFooter).

Чтобы создать элемент DeliveryAddress:

  1. В составе элемента InvoiceHeader.grAddress создайте элемент DeliveryAddress (тип Paragraph).
  2. Перейдите на закладку Relations.
  3. Поскольку DeliveryAddress может находиться только выше просвета wgAddressAbove задайте следующее условие поиска:

Above элемента wgAddressAbove, Offset = 0.

  5. Поскольку условие область поиска поля DeliveryAddress уже задано на уровне группы InvoiceHeader.grAddress, мы не будем его дублировать здесь.
  6. Выберите закладку Advanced.
  7. Поскольку заголовок поля DeliveryAddress также находится в области поиска, нам необходимо исключить его, чтобы получить только значение DeliveryAddress. Кроме этого в области поиска также присутствуют разделители и мусор, которые тоже желательно исключить. Поэтому нам не подходит просто исключение региона элемента kwDeliveryAddress. В данном случае будет правильно за основу взять область региона элемента kwDeliveryAddress, расширить его так, чтобы в него попал весь мусор и исключить уже этот прямоугольник. Для этого в поле Advanced pre-search relations задайте дополнительные условия поиска:

If InvoiceHeader.kwDeliveryAddress.IsNull Then DontFind;
Else

// опишем прямоугольник вокруг заголовка поля (задав некоторый отступ от
  границ)
{ Let Left = InvoiceHeader.kwDeliveryAddress.Rect.Left - 100dt;
Let Top = InvoiceHeader.kwDeliveryAddress.Rect.Top - 100dt;
Let Right = InvoiceHeader.kwDeliveryAddress.Rect.Right + 20dt;
Let Bottom = InvoiceHeader.kwDeliveryAddress.Rect.Bottom;

// исключим из области поиска нашего поля описанный прямоугольник
ExcludeRect (Left, Top, Right, Bottom);
}

  8. Протестируйте изображения (временно исключите элемент InvoiceFooter).
  9. Задайте местоположение блока DeliveryAddress в виде прямоугольника региона найденного элемента DeliveryAddress, упрощенного для улучшения визуального восприятия и увеличенного по высоте и ширине на 5 dot. Для этого выберите опцию Expression и задайте следующее выражение:

Rect outputRect;
OutputRegion = InvoiceHeader.grAddress.DeliveryAddress.SimplifiedRegion;
IsNull = InvoiceHeader.grAddress.DeliveryAddress.IsNull;
OutputRegion.Inflate (5dt, 5dt);


Пример 4. Шаг 6. Footer документа, описание группы InvoiceFooter

В группе InvoiceFooter мы опишем элементы, которые помогут нам идентифицировать последнюю страницу документа:

  • на последней странице документа всегда присутствуют ключевые слова "TOTALAMOUNTMUST", "Carriedover", "TotalCHF", "Total".
  • Для поиска этого тексте будем создавать два элемента: в первом укажем "TOTALAMOUNTMUST", "Carriedover", "TotalCHF" и создадим его в дереве элементов выше, чем второй, в котором укажем только "Total" (его будем искать только если не найден первый элемент). Это поможет нам сократить количество создаваемых гипотез для элемента и ускорит наложение гибкого описания.
  • эти слова всегда находятся ниже заголовка Description и Product Total столбцов таблицы на той же странице.

Для описания поиска ключевых слов (keywords) заголовков столбца Product Total и Description будем создавать элементы типа Static Text:

  • Элемент ExtraTag - подробная инструкция в Шаге 6.1.
  • Элемент AddTag - подробная инструкция в Шаге 6.2.

Для описания поиска ключевых слов (keywords) "TOTALAMOUNTMUST", "Carriedover", "TotalCHF" и "Total" также воспользуемся элементами типа Static Text:

  • Элемент LongFooter - подробная инструкция в Шаге 6.3.
  • Элемент ShortFooter (для поиска ключевого слова "Total") - подробная инструкция в Шаге 6.4.

Для того чтобы Footer накладывался только на последнюю страницу документа, он должен содержать в себе обязательный элемент. Так как наши ключевые слова, идентифицирующие последнюю страницу, находятся на каждой последней странице каждого документа, в группе InvoiceFooter создадим обязательный элемент InvoiceFooter типа Paragraph. Его область поиска зададим в виде прямоугольника региона найденного элемента либо LongFooter, либо ShortFooter немного расширив его по высоте и ширине - подробная инструкция в Шаге 6.5.


Пример 4. Шаг 6.1 Поиск заголовка столбца Product Total, элемент ExtraTag

Чтобы создать элемент ExtraTag:

  1. В составе элемента InvoiceFooter создайте опциональный элемент ExtraTag (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: PRODUCTTOTAL.
  4. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.


Пример 4. Шаг 6.2 Поиск заголовка столбца Description, элемент AddTag

Чтобы создать элемент AddTag:

  1. В составе элемента InvoiceFooter создайте опциональный элемент AddTag (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: Designation|Description.
  4. В поле Advanced pre-search relations for all instances задайте дополнительные параметры:

WholeWordMode: true; // в качестве гипотез будут рассматриваться только целые слова.
MaxGapInLine: 10dt; // максимально допустимое расстояние между соседними символами.


Пример 4. Шаг 6.3 Описание итоговой части документа, элемент LongFooter

Чтобы создать элемент LongFooter:

  1. В составе элемента InvoiceFooter создайте опциональный элемент LongFooter (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: TOTALAMOUNTMUST|Carriedover|TotalCHF.
  4. Поскольку искомый текст всегда находится ниже заголовка столбца Description, перейдите на закладку Relations и задайте отношение:

Below элемента AddTag, Offset = 100;

  5. Поскольку в некоторых документах (например, документы номер 3 и 9) программа находит несколько вариантов заданного текста и выбирает не тот, который нас интересует, необходимо задать дополнительные ограничения. Анализ показывает, что интересующий нас текст – самый верхний в заданной области поиска (нам интересен текст, расположенный наиболее близко к краю таблицы, так как в дальнейшем нам будет удобно использовать его как Footer таблицы). Поэтому на закладке Relations задайте дополнительные условия поиска: Искать строку, ближайшую к верхнему краю документа:
  • Отметьте опцию Nearest
  • В выпадающем списке поля To выберите Y coordinate
  • В поле Y укажите 0.
Показать пример


Пример 4. Шаг 6.4 Описание итоговой части документа, элемент ShortFooter

Чтобы создать элемент ShortFooter:

  1. В составе элемента InvoiceFooter создайте опциональный элемент ShortFooter (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: Total.
  4. Перейдите на закладку Search Constraints и исключите из области поиска ShortFooter уже найденный элемент ExtraTag, чтобы исключить нахождение слова "Total" в заголовке таблицы:
  • Нажмите кнопку Add… рядом с полем Exclude elements,
  • В списке элементов выберите ExtraTag,
  • Нажмите кнопку Ok.
  • После этого в поле Exclude elements вы увидите строчку SearchElements.InvoiceFooter.ExtraTag;

5. Поскольку искомый текст всегда находится ниже заголовка столбца Description, перейдите на закладку Relations и задайте отношение:

Below элемента AddTag, Offset = 100;

6. Мы договорились, что ShortFooter мы будем искать только в случае отсутствия LongFooter. Для того чтобы задать это условие в поле Advanced pre-search relations задайте дополнительные условия поиска: не искать если найден LongFooter. На языке описания FlexiLayout данное условие выглядит следующим образом:

If not LongFooter.IsNull then Dontfind();


Пример 4. Шаг 6.5 Описание итоговой части документа, элемент Paragraph

Чтобы создать элемент Paragraph:

  1. В составе элемента InvoiceFooter создайте неопциональный элемент Paragraph (тип Paragraph).
  2. Перейдите на закладку Advanced и в поле Advanced pre-search relations задайте дополнительные условия поиска: не искать, если не найден ни LongFooter, ни ShortFooter; если найден LongFooter задайте область поиска поля прямоугольником региона этого элемента, расширив его на 10 dot по высоте и ширине; если найден ShortFooter задайте область поиска поля прямоугольником региона этого элемента, расширив его на 10 dot по высоте и ширине. На языке описания FlexiLayout данное условие выглядит следующим образом:

If LongFooter.IsNull and ShortFooter.IsNull then Dontfind();
// мы не будем искать элемент, если ни один из элементов не найден

else
{ if not LongFooter.IsNull then
// в случае если найден LongFooter, область поиска опишем на основе его региона
{ LeftOf: LongFooter.Rect.Right + 10dt;
RightOf: LongFooter.Rect.Left - 10dt;
Below: LongFooter.Rect.Top - 10dt;
Above: LongFooter.Rect.Bottom + 10dt;
}
else if not ShortFooter.IsNull then
// если же найден ShortFooter, то область поиска зададим регионом ShortFooter
{ LeftOf: ShortFooter.Rect.Right + 10dt;
RightOf: ShortFooter.Rect.Left - 10dt;
Below: ShortFooter.Rect.Top - 10dt;
Above: ShortFooter.Rect.Bottom + 10dt;
}
}

Протестируйте наложение гибкого описания и убедитесь, что страницы правильно собираются в документы в соответствии с описанными элементами Header и Footer. После наложения гибкого описания на все изображения сборка страниц в документы должна совпадать с эталонной сборкой, заданной нами в начале работы над данным гибким шаблоном.

Замечание. Чтобы наложить гибкий шаблон на все тестовые изображения, удобно воспользоваться горячими клавишами:

  • Поместите фокус в окно пакета изображений Batch.
  • Для выбора всех страниц пакета нажмите клавиши Ctrl + A.
  • Для запуска анализа выделенных страниц нажмите клавиши Ctrl + E.

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


Пример 4. Шаг 2. Просмотр изображений и результатов предраспознавания

Пример 4. Шаг 7. Описание заголовков столбцов таблицы, группа TableHeader

Что касается поля Invoice Table, которое мы будем искать с помощью элемента типа Table, здесь нам тоже понадобятся предварительные приготовления – нам нужно определить местоположение заголовков столбцов таблицы. В данном примере, для поиска заголовков столбцов таблицы мы будем использовать дополнительные вспомогательные элементы.

Таким образом, прежде чем непосредственно приступить к поиску оставшихся полей, опишем все необходимые элементы.

Для описания заголовков создадим группу TableHeader, в которую включим описания всех заголовков таблицы. Здесь же ограничим область поиска первой страницей.

Чтобы создать элемент TableHeader:

  1. Создайте составной элемент TableHeader (тип Group) в дереве
  2. Перейдите на закладку Search Constraints и задайте область поиска элемента:
  • отметьте опцию Absolute search area constraints,
  • в поле Pages из списка выберите Range,
  • в поле Range укажите 1,
  • в поле Region оставьте значение по умолчанию <whole page>,
  • нажмите кнопку Add.

Поиск заголовков таблицы будем осуществлять с помощью элементов типа Static Text.

Для этого в составе группы TableHeader создадим элементы:

  1. Элемент kwDesignation - подробная инструкция в Шаге 7.1,
  2. Элемент ExtraQtyTag - подробная инструкция в Шаге 7.2,
  3. Элемент kwQuantity - подробная инструкция в Шаге 7.3,
  4. Элемент kwUnitPrice - подробная инструкция в Шаге 7.4,
  5. Элемент kwTotal - подробная инструкция в Шаге 7.5,
  6. Элемент kwReference - подробная инструкция в Шаге 7.6,
  7. Элемент kwSales - подробная инструкция в Шаге 7.7,
  8. Элемент kwUnit - подробная инструкция в Шаге 7.8.


Пример 4. Шаг 2. Просмотр изображений и результатов предраспознавания

Пример 4. Шаг 7.1 Поиск заголовка столбца Designation, элемент kwDesignation

Проанализировав результаты предраспознавания, видим, что в наших документах заголовок представлен только двумя вариантами текста "Designation" и "Description", и так как область поиска мы задали на уровне группы, в описании данного элемента мы не будем ее дублировать.

Чтобы создать элемент kwDesignation:

1. В составе элемента TableHeader создайте элемент kwDesignation (тип Static Text).

2. Выберите закладку Static Text.

3. В поле Search text укажите значение искомого текста: Designation|Description.

4. Все остальные параметры не переопределяйте;

5. Протестируйте гибкое описание и убедитесь, что элемент находится на изображениях.


Пример 4. Шаг 7.2 Поиск заголовка столбца ExtraQuantity, элемент ExtraQtyTag

Далее нам необходимо найти заголовок Quantity, который в документах представлен следующими вариантами текста: "Qty", "Quantity", "ORDERED", "QtyNet". Но в нашей таблице есть еще один заголовок, в значении которого может встретиться слово "Quantity", кроме этого он содержит уникальный текст. Поэтому в первую очередь мы опишем заголовок ExtraQtyTag, а затем исключим его из области поиска заголовка Quantity.

Во всех наших документах заголовок столбца ExtraQtyTag представлен только одним вариантом текста. Несмотря на то, что качество изображений достаточно высокое, зададим допустимый процент ошибок равным 35%, что для слова из 7 или 8 букв означает ошибку в двух буквах.

Кроме этого, поскольку все заголовки таблицы находятся на одном уровне, зададим дополнительное условие поиска относительно уже найденного заголовка столбца Designation.

Чтобы создать элемент ExtraQtyTag:

  1. В составе элемента TableHeader создайте элемент ExtraQtyTag (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: {Quantity *BK.ORD}.
  4. Задайте значение свойства Max error percentage равным 35.
  5. Так как поле ExtraQuantity является многострочным отметьте опции Take spaces into account и Permit multiple lines.
  6. Мы не будем штрафовать наши гипотезы за переход на другую строку, поэтому значение поля Line break penalty установите равным 1.
  7. Для того чтобы описать, что наш заголовок находится на одном уровне с заголовком Designation, перейдите на закладку Relations и задайте дополнительные условия поиска:

Above нижней границы элемента kwDesignation, Offset = -50, Reference boundary = Bottom,
Below верхней границы элемента kwDesignation, Offset = -50, Reference boundary = Top.

Показать пример

  8. Для оптимизации поиска зададим дополнительное условие: не искать заголовок, если не найден заголовок Designation. Перейдите на закладку Advanced и в поле Advanced pre-search relations задайте это условие. На языке описания FlexiLayout данное условие выглядит следующим образом:

If kwDesignation.IsNull then Dontfind();

  9. В поле Advanced pre-search relations также задайте дополнительные параметры:

WholeWordMode: true; // в качестве гипотез будут рассматриваться только целые слова.
Замечание. Данное условие также можно задать через интерфейс: отметьте опцию Whole words only на закладке Static Text.

  10. Протестируйте гибкое описание на изображениях и убедитесь, что элемент корректно находится на первой странице документа.


Пример 4. Шаг 7.3 Поиск заголовка столбца Quantity, элемент kwQuantity

При описании этого заголовка мы будем опираться на уже найденные элементы kwDesignation и ExtraQtyTag.

Чтобы создать элемент kwQuantity:

  1. В составе элемента TableHeader создайте элемент kwQuantity (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: Qty|Quantity|ORDERED|QtyNet.
  4. Задайте значение свойства Max error percentage равным 35.
  5. Перейдите на закладку Search Constraints и исключите из области поиска уже найденный элемент SearchElements.TableHeader.ExtraQtyTag;
  6. Для того чтобы описать, что наш заголовок находится на одном уровне с заголовком Designation, перейдите на закладку Relations и задайте дополнительные условия поиска. Подробнее см. Шаг 7.2.
  7. Для оптимизации поиска зададим дополнительное условие: не искать заголовок, если не найден заголовок Designation. Подробнее см. Шаг 7.2.
  8. В поле Advanced pre-search relations также задайте дополнительные параметры:

WholeWordMode: true; // в качестве гипотез будут рассматриваться только целые текстовые объекты.
MaxGapInLine: 20dt; // максимально допустимое расстояние между соседними символами.

  10. Протестируйте гибкое описание на изображениях и убедитесь, что элемент корректно находится на первой странице документа..


Пример 4. Шаг 7.4 Поиск заголовка столбца UnitPrice, элемент kwUnitPrice

Проанализировав изображения, видим, что заголовок Unit Price представлен следующими вариантами search text: "UnitPrice", "Price", "RATE", а заголовок столбца Unit – словом "Unit". Чтобы исключить нахождение слова "Unit" заголовка столбца Unit в заголовке столбца Unit Price, сначала опишем Unit Price, так как он содержит уникальный текст, а затем, задав дополнительное отношение, опишем заголовок столбца Unit.

При описании элемента для поиска ключевых слов заголовка столбца Unit Price примем во внимание, что столбец Unit Price всегда располагается правее столбца Quantity.

Чтобы создать элемент kwUnitPrice:

  1. В составе элемента TableHeader создайте элемент kwUnitPrice (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: UnitPrice|Price|RATE.
  4. Для того чтобы описать, что наш заголовок находится на одном уровне с заголовком Designation, перейдите на закладку Relations и задайте дополнительные условия поиска. Подробнее см. Шаг 7.2.
  5. Также на закладке Relations задайте условие искать наш элемент как самый ближайший к X coordinate со значением = 0.
Показать пример

  6. Выберите закладку Advanced.
  7. Поскольку заголовок столбца Unit Price располагается правее заголовка столбца kwQuantity, в поле Advanced pre-search relations задайте дополнительные условия поиска: если элемент kwQuantity найден, то искать объект изображения правее элемента kwQuantity. На языке описания FlexiLayout данное условие выглядит следующим образом:

If Not (TableHeader.kwQuantity.IsNull) Then
RightOf: TableHeader.kwQuantity, 0 * dot;

  8. Для оптимизации поиска зададим дополнительное условие: не искать заголовок, если не найден заголовок Designation. Подробнее см. Шаг 7.2.
  9. Задав дополнительную проверку в поле Advanced post-search relations мы можем повлиять на качество сформированных гипотез, например, в данном случае такую: если элемент найден, вычислить разницу между эталонной шириной и шириной найденного элемента и проверить ее на вхождение в нечеткий интервал. На языке описания FlexiLayout данное условие выглядит следующим образом:

If not IsNull then
{ FuzzyQuality: 400dt - width, {-50000,0,0, 50000}*dt;
}
//такая проверка означает, что чем больше разница, тем выше штрафующий
  коэффициент

  10. Протестируйте гибкое описание на изображениях и убедитесь, что элемент корректно находится на первой странице документа.


Пример 4. Шаг 7.5 Поиск заголовка столбца Total, элемент kwTotal

Проанализировав изображения, видим, что столбец Total на всех изображениях находится правее столбца Unit Price. Поэтому будем строить поиск заголовка столбца Total относительно заголовка столбца Unit Price.

Чтобы создать элемент kwTotal:

  1. В составе элемента TableHeader создайте элемент kwTotal (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: TotalChf|Total|Extension|AMOUNT|PRODUCTTOTAL.
  4. Для того чтобы описать, что наш заголовок находится на одном уровне с заголовком Designation, перейдите на закладку Relations и задайте дополнительные условия поиска. Подробнее см. Шаг 7.2.
  5. Также на закладке Relations задайте условие искать наш элемент как самый ближайший к X coordinate со значением = 6000.
Показать пример

  6. Выберите закладку Advanced.
  7. Поскольку заголовок столбца Total располагается правее заголовка столбца kwUnitPrice (если последний находится на изображении), в поле Advanced pre-search relations задайте дополнительные условия поиска: если элемент kwUnitPrice найден, то искать kwUnitPrice. На языке описания FlexiLayout данное условие выглядит следующим образом:

If Not (TableHeader.kwUnitPrice.IsNull) Then
RightOf: TableHeader.kwUnitPrice, 0 * dot;

  8. Для оптимизации поиска зададим дополнительное условие: не искать заголовок, если не найден заголовок Designation. Подробнее см. Шаг 7.2.
  9. Протестируйте гибкое описание на изображениях и убедитесь, что элемент корректно находится на первой странице документа.


Пример 4. Шаг 7.6 Поиск заголовка столбца Reference, элемент kwReference

Проанализировав изображения, видим, что в наших документах заголовок может быть представлен следующими вариантами текста: "Reference", "ID", "Item", "CODE".

Чтобы создать элемент kwReference:

1. В составе элемента TableHeader создайте элемент kwReference (тип Static Text).

2. Выберите закладку Static Text.

3. В поле Search text укажите значение искомого текста: Reference|ID|Item|CODE.

4. Для того чтобы описать, что наш заголовок находится на одном уровне с заголовком Designation, перейдите на закладку Relations и задайте дополнительные условия поиска. Подробнее см. Шаг 7.2.

5. Для оптимизации поиска зададим дополнительное условие: не искать заголовок, если не найден заголовок Designation. Подробнее см. Шаг 7.2.

6. Протестируйте гибкое описание на изображениях и убедитесь, что элемент корректно находится на первой странице документа.


Пример 4. Шаг 7.7 Поиск заголовка столбца Sales, элемент kwSales

Хотя сам столбец Sales нам не нужен, его заголовок необходим нам для ограничения таблицы справа.

Чтобы создать элемент kwSales:

  1. В составе элемента TableHeader создайте элемент kwSales (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: Sales
  4. Для того чтобы описать, что наш заголовок находится на одном уровне с заголовком Designation, перейдите на закладку Relations и задайте дополнительные условия поиска. Подробнее см. Шаг 7.2.
  5. Выберите закладку Advanced.
  6. Поскольку заголовок столбца Sales располагается правее заголовка столбца kwTotal (если последний находится на изображении), в поле Advanced pre-search relations задайте дополнительные условия поиска: если элемент kwTotal найден, то искать объект изображения правее элемента kwTotal. На языке описания FlexiLayout данное условие выглядит следующим образом:

If Not (TableHeader.kwTotal.IsNull) Then
RightOf: TableHeader.kwTotal, 0 * dot;

  7. Для оптимизации поиска зададим дополнительное условие: не искать заголовок, если не найден заголовок Designation. Подробнее см. Шаг 7.2.
  8. Протестируйте гибкое описание на изображениях и убедитесь, что элемент корректно находится на первой странице документа.


Пример 4. Шаг 7.8 Поиск заголовка столбца Unit, элемент kwUnit

При описании элемента для поиска ключевых слов заголовка столбца Unit будем опираться на уже найденный столбец UnitPrice и зададим дополнительное отношение: искать заголовок столбца Unit левее границы заголовка столбца UnitPrice.

Чтобы создать элемент kwUnit:

  1. В составе элемента TableHeader создайте элемент kwUnit (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: Unit.
  4. Для того чтобы описать, что наш заголовок находится на одном уровне с заголовком Designation, перейдите на закладку Relations и задайте дополнительные условия поиска. Подробнее см. Шаг 7.2.
  5. Для того чтобы описать, что наш заголовок находится левее левой границы заголовка UnitPrice, на закладке Relations задайте дополнительные условия поиска:

Left of левой границы элемента kwUnitPrice, Offset = 20, Reference boundary = Left;

  6. Для оптимизации поиска зададим дополнительное условие: не искать заголовок, если не найден заголовок Designation. Подробнее см. Шаг 7.2.
  7. Протестируйте гибкое описание на изображениях и убедитесь, что элемент корректно находится на первой странице документа.


Пример 4. Шаг 8. Поиск табличного элемента, элемент InvoiceTable

Итак, все предварительные приготовления сделаны, и мы можем искать поле Invoice Table. Опишем элемент типа Table:

  1. Header таблицы. Как уже было решено, заголовки столбцов мы зададим с помощью предварительно найденных вспомогательных элементов.
  2. Footer таблицы. Для задания футера таблицы мы решили использовать уже найденный обязательный элемент Paragraph из группы InvoiceFooter, определяющий начало итоговой части. Этот элемент мы задавали как ближайший к нижнему краю таблицы.
  3. Область поиска таблицы. Ограничим область поиска справа относительно заголовка последнего, не нужного нам, столбца Sales.

Чтобы создать элемент InvoiceTable:

  1. Создайте элемент InvoiceTable (тип Table) в дереве элементов SearchElements.
  2. Выберите закладку Columns.
  3. Выберите в качестве блока, для поиска которого служит данный элемент, ранее созданный (см. Шаг 3) блок InvoiceTable, нажав кнопку Select.
  4. Задайте параметры поиска столбцов таблицы:

    4.1. Выберите в списке столбцов Reference и нажмите кнопку Properties….
    Для заголовка данного столбца мы будем использовать ранее найденный элемент TableHeader.kwReference. Для этого отметьте опцию Use found element as column name и выберите элемент TableHeader.kwReference, нажав кнопку [image].

    4.2. Выберите в списке столбцов Designation и нажмите кнопку Properties….
    Для заголовка данного столбца мы будем использовать ранее найденный элемент TableHeader.kwDesignation.

    4.3. Выберите в списке столбцов Unit и нажмите кнопку Properties….
    Для заголовка данного столбца мы будем использовать ранее найденный элемент TableHeader.kwUnit.

    4.4. Выберите в списке столбцов Quantity и нажмите кнопку Properties….
    Для заголовка данного столбца мы будем использовать ранее найденный элемент TableHeader.kwQuantity.

    4.5. Выберите в списке столбцов UnitPrice и нажмите кнопку Properties….
    Для заголовка данного столбца мы будем использовать ранее найденный элемент TableHeader.kwUnitPrice.

    4.6. Выберите в списке столбцов Total и нажмите кнопку Properties….
    Для заголовка данного столбца мы будем использовать ранее найденный элемент TableHeader.kwTotal.
  5. Выберите закладку Order.
  6. Поскольку искомые столбцы могут перемежаться другими (например, ExtraQtyTag), но всегда следуют в следующем порядке: сначала Designation, правее него Unit Price, и ещё правее Total, - то выберем вариант Rules for column order и, нажав кнопку Add…, добавим столбцы в таком порядке: Designation << Unit Price << Total.
Показать пример

  7. Выберите закладку Header. Заголовок таблицы нам нужен, но других ограничений мы накладывать не будем, поэтому оставьте значения по умолчанию.
  8. Выберите закладку Footer. Для итоговой части таблицы мы будем использовать ранее найденный элемент InvoiceFooter.Paragraph. Для этого отметьте опцию Use found element as footer и выберите элемент InvoiceFooter.Paragraph, нажав кнопку [image].
Показать пример

  9. Выберите закладку Rows.
  10. Поскольку в нашей таблице ячейки в некоторых столбцах могут содержать многострочные записи, необходимо задать ключевые столбцы для разделения на строки. Выберите опцию Use master columns to detect rows.
    В качестве разделителя на строки первым укажем столбец Total,, так как в этом столбце всегда присутствуют данные, и каждой записи таблицы в этом столбце соответствует одна строка данных. На тот случай, если данный столбец не будет обнаружен на изображении, укажем следующими разделителями столбец Unit Price и столбец Quantity. Выберите данный набор столбцов с помощью кнопки [image].
Показать пример

  11. Выберите закладку Relations. Поскольку интересующие нас столбцы таблицы располагаются левее начала заголовка столбца Sales, добавьте следующие условия поиска:

Left of элемента TableHeader.kwSales, Offset = 0;

Замечание. При подборе значений для отступов (offset) бывает полезно обратить внимание на геометрические свойства (границы и размеры) опорных и искомых объектов изображения в режиме просмотра результатов предраспознавания. В остальном подбор этих значений является творческим процессом и осуществляется путем подбора.

На случай изображений плохого качества (например, мусора между телом и footer таблицы или отсутствия header или footer таблицы) бывает полезным дополнительно задать ограничение таблицы сверху и снизу. В данном случае можно использовать элементы kwDesignation для ограничения сверху и Paragraph – снизу. На закладке Relations добавьте следующие условия поиска:

Below верхней границы элемента kwDesignation, Offset = -50, = Top;
Above элемента Paragraph, Offset = -50; Reference boundary = Bottom;

  12. Наложим шаблон на тестовый набор изображений.
    Видим, что программа верно находит табличный элемент на всех изображениях, но на некоторых изображениях в столбец Quantity попадает текст из предыдущего, не нужного нам столбца.
    Чтобы отделить данные столбца Quantity от мусора, зададим тип контекста для данного столбца.
  13. Откройте диалог Properties табличного элемента InvoiceTable.
    Перейдите на закладку Columns, откройте диалог Properties… для столбца Quantity, отметьте опцию проверки содержимого столбца Check content type. В типе контекста Type of column content выберите Number.
Показать пример

  14. Если мы протестируем изображения теперь, то видим, что сейчас в столбец Quantity попадают только цифры, что и требовалось.
  15. Задайте контекст также для столбцов UnitPrice равным Currency и для Total равным Currency.
  16. Выберите в качестве описания местоположения блока InvoiceTable опцию Source element. В качестве source element укажите элемент InvoiceTable, нажав кнопку [image].


Пример 4. Шаг 9. Поиск поля TotalAmount, описание составного элемента SumGroup

Проанализировав тестовые документы, видим, что интересующее нас поле Total Amount присутствуют только вместе с заголовком на последней странице документа ниже таблицы. Кроме этого, само поле располагается либо на одном уровне, либо под заголовком. Так как поле однострочное, будем искать его с помощью элемента типа Character String.

Для того чтобы задать настройки, общие для поля и его заголовка, нам потребуется составной элемент.

Чтобы создать составной элемент SumGroup:

  1. Создайте элемент SumGroup (тип Group).
  2. Выберите закладку Advanced и в поле Advanced pre-search relations задайте дополнительные условия поиска для всех элементов группы: искать ниже последней найденной таблицы. На языке описания FlexiLayout данное условие выглядит следующим образом:

If not InvoiceTable.LastSubTable.Body.IsNull then
Below: InvoiceTable.LastSubTable.Body.Rect.Bottom;

Для описания поиска ключевых слов (keywords) заголовка поля TotalAmount воспользуйтесь элементом SumGroup.kwTotal типа Static Text – Подробная инструкция в Шаге 9.1.

Для поиска однострочного поля TotalAmount воспользуйтесь элементом SumGroup. TotalAmount типа Character String - Подробная инструкция в Шаге 9.2.


Пример 4. Шаг 2. Просмотр изображений и результатов предраспознавания

Пример 4. Шаг 9.1 Поиск заголовка поля Total Amount, элемент kwTotal

Заголовок на изображениях представлен фразами "Total Chf", "Carried Over" и "Total". Кроме этого он располагается ниже таблицы (это условие мы уже задали для составного элемента SumGroup) и всегда на последней странице.

Чтобы создать элемент kwTotal:

  1. В составе элемента SumGroup создайте элемент kwTotal (тип Static Text).
  2. Выберите закладку Static Text.
  3. В поле Search text укажите значение искомого текста: TotalChf|CarriedOver|Total.
  4. Задайте значение свойства Max error percentage равным 20.
  5. Выберите закладку Search Constraints и ограничьте область поиска последней страницей:
  • отметьте опцию Absolute search area constraints,
  • в поле Pages из списка выберите Last,
  • остальные опции не отмечайте,
  • нажмите кнопку Add. Область появится в списке Search areas.
Показать пример

  6. Выберите закладку Advanced.
  7. Среди множества всех найденных элементов с заданным текстом нас интересует тот, который располагается как можно ближе к нижней границе таблицы. Эта закономерность дает нам возможность повлиять на качество сформированных гипотез. В поле Advanced post-search relations задайте дополнительные параметры проверки гипотезы найденного элемента: если была сформирована ненулевая гипотеза элемента, вычислить расстояние между верхней границей найднного элемента и нижней границей последней найденной в документе таблицы и проверить это расстояние на вхождение в нечеткий интервал. На языке описания FlexiLayout данное условие выглядит следующим образом:

If not IsNull then
{ FuzzyQuality: Top - InvoiceTable.LastSubTable.Body.Rect.Bottom, {0,0,0, 50000}*dt;
}
//такая проверка означает, что чем больше расстояние между границами, тем выше штрафующий коэффициент


Пример 4. Шаг 9.2 Описание поля Total Amount, элемент TotalAmount

Поле TotalAmount будем одновременно искать как справа от заголовка, так и под заголовком.

Чтобы создать элемент TotalAmount:

  1. В составе элемента SumGroup создайте элемент TotalAmount (тип Character String).
  2. Выберите закладку Character String.
  3. Задайте алфавит
    ',-.0123456789OSZosz
  4. Задайте значение параметра Percentage of non-alphabet characters равным 30%.
  5. В поле Character count задайте нечеткий интервал {-1, 1, 20, INF}, оценивающий длину цепочки символов. Предполагаем, что все возможные значения будут находиться в интервале от 1 до 20 символов. Любая гипотеза, выходящая за рамки данного интервала, будет штрафоваться.
  6. Не накладывайте других ограничений на параметры элемента, оставьте значения по умолчанию.
  7. Перейдите на закладку Search Constraints и исключите из области поиска элемента регион гипотезы элемента kwTotal.
  8. Выберите закладку Advanced.
  9. В поле Advanced pre-search relations задайте дополнительные условия поиска: если найден заголовок kwTotal, то задайте область поиска поля массивом прямоугольников: один справа от заголовка, другой - под заголовком с некоторым отступом, иначе объект изображения не искать. На языке описания FlexiLayout данное условие выглядит следующим образом:

If not kwTotal.IsNull Then // если найден заголовок kwTotal
{
WholeWordMOde: true;
MaxGapInLine: 30dt;

RectArray DataRegion;

Let r1= Rect (kwTotal.Rect.Right, kwTotal.Rect.Top -20dt, kwTotal.Rect.Right + 1800dt, kwTotal.Rect.Bottom + 50dt);
// ограничим область поиска прямоугольником справа от заголовка поля
Let r2 = Rect (kwTotal.Rect.Left - 100dt, kwTotal.Rect.Bottom, kwTotal.Rect.Right + 100dt, kwTotal.Rect.Bottom + 200dt);
// ограничим область поиска прямоугольником снизу от заголовка поля

DataRegion = RectArray (r1);
DataRegion.Add (r2);

RestrictSearchArea (DataRegion);
}
else Dontfind(); // иначе объект изображения не искать

Замечание. При подборе значений для отступов (offset) бывает полезно обратить внимание на геометрические свойства (границы и размеры) опорных и искомых объектов изображения в режиме просмотра результатов предраспознавания. Значения для отступов (offset) подбираются опытным путем.

  10. Область поиска значения поля обозначена двумя прямоугольниками – справа от заголовка и под ним. Причем, если значение поля располагается справа от его заголовка, то на большинстве тестовых изображений под заголовком присутствует какой-то текст. Так как на большинстве изображений этот ненужный текст попадает в область поиска поля TotalAmount, программа создаст для него гипотезу. Чтобы повлиять на качество такой гипотезы (занизить ее качество), в поле Advanced post-search relations задайте дополнительные параметры проверки: чем значение поля ниже заголовка, тем сильнее штрафовать гипотезу. На языке описания FlexiLayout данное условие выглядит следующим образом:

If not IsNull then
{FuzzyQuality: 400dt - width, {-50000,0,0, 50000}*dt;
//максимальное качество будет у гипотез элементов, ширина региона которых равна 400dot
if width < 50dt then Quality: 0;
// элементы ширины меньше 50 dot не будем рассматривать
if Top > kwTotal.Rect.Top then
{ FuzzyQuality: Top - kwTotal.Rect.Top, {0,0,0, 20000}*dt;
}
}
//такая проверка означает, что чем больше разница, тем выше штрафующий коэффициент

Замечание. Для описания положения объектов на странице и расстояний между ними используется двумерная система координат с горизонтальной и вертикальной осями. Точка отсчета (0, 0) координатных осей расположена в левом верхнем углу изображения. Положительное направление оси абсцисс - слева направо, оси ординат - сверху вниз.

  11. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где он присутствует.
  12. Задайте местоположение блока TotalAmount в виде прямоугольника региона элемента TotalAmount, увеличенного по высоте и ширине на 5 dot. Для этого выберите опцию Expression и задайте следующее выражение:

Rect outputRect;
outputRect = SumGroup.TotalAmount.Rect;
IsNull = SumGroup.TotalAmount.IsNull;
OutputRegion = outputRect;
OutputRegion.Inflate (5dt, 5dt);


Пример 4. Шаг 10. Поиск поля Company, описание составного элемента CompanyGroup, описание элемента Company

Проанализировав изображения, видим, что поле Company всегда располагается в первой трети первой страницы документов.

Для поиска поля Company воспользуемся элементом типа Static Text, который опишем в составе элемента CompanyGroup, типа Group.

Чтобы создать элемент CompanyGroup создайте составной элемент CompanyGroup (тип Group). Не меняйте параметры, заданные по умолчанию.

Чтобы создать элемент Company:

  1. В составе элемента CompanyGroup создайте элемент Company (тип Static Text).
  2. Выберите закладку Static Text.
  3. Отметьте опцию Search text from file и укажите путь к файлу Companies.txt.
    Замечание: Файл Companies.txt хранится в папке
    %allusersprofile%\Application Data\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Invoice\Dict для ОС Microsoft Windows XP или в папке
    %public%\ABBYY\FlexiCapture\10.0\Samples\FLS\English\Invoice\Dict     для ОС Microsoft Windows Vista, Windows 7, Windows Server 2008 и Windows Server 2008 R2.
Показать пример

  4. Выберите закладку Advanced.
  5. В поле Advanced pre-search relations задайте дополнительное условие поиска: искать объект изображения в первой трети первой страницы документа. На языке описания FlexiLayout данное условие выглядит следующим образом:

Above: Page(1).RectGlobal.Top + Page(1).RectGlobal.Height/3;

  6. Протестируйте изображения и убедитесь, что программа верно находит элемент на всех изображениях, где он присутствует.
  7. Просмотр результатов наложения гибкого описания на все изображения показывает, что в некоторых документах не удалось найти название компании. Причиной этого явился тот факт, что в данном документе текст написан в две строки, а в свойствах элемента мы задали в качестве текста для поиска однострочный текст. Чтобы исключить подобную ситуацию, внесите следующие изменения:
  • Откройте файл Companies.txt и укажите название компании YOUR SERVICE с пробелами. Это будет означать, что мы будем искать фразу, которая в общем случае может быть и не однострочной.
  • Откройте диалог Properties элемента Company и перейдите на закладку Static Text.
  • Для задания многострочности искомой фразы выберите свойство Permit multiple lines.
  • Задайте значение параметра Line break penalty равным 1. Это позволит сохранить качество сформированной гипотезы без изменения в случае многострочного текста. Задание меньшего значения приведет к штрафованию гипотезы.
  8. Протестируйте изображения и убедитесь, что программа верно находит элемент в тестовых документах.
  9. Задайте местоположение блока Company в виде прямоугольника региона элемента Company, увеличенного по высоте и ширине на 5 dot. Для этого выберите опцию Expression и задайте следующее выражение:

Rect outputRect;
outputRect = CompanyGroup.Company.Rect;
IsNull = CompanyGroup.Company.IsNull;
OutputRegion = outputRect;
OutputRegion.Inflate (5dt, 5dt);


Пример 4. Шаг 11. Экспорт гибкого описания и подключение его к определению документа FlexiCapture

Полученное гибкое описание можно экспортировать в формат ABBYY FlexiLayout (*.afl) и подключить к определению документа в программе ABBYY FlexiCapture.

Замечание. Подробнее об экспорте и подключении смотрите Пример1, Шаг 21 - Шаг 22.


Техническая поддержка

Если при использовании программы ABBYY FlexiLayout Studio у вас возникли вопросы, то прежде чем обратиться в отдел технической поддержки пользователей, просмотрите всю имеющуюся у вас документацию (справка к программе), а также зайдите на наш сайт, раздел технической поддержки - возможно, вы найдете ответ на свой вопрос.

Если же Вам не удалось найти ответ на интересующий вас вопрос, свяжитесь с нами по e-mail support@abbyy.com или по телефону.
Для того, чтобы дать Вам квалифицированные рекомендации, работникам отдела поддержки пользователей необходимо иметь следующую информацию:

  • Фамилия, имя, отчество,
  • Название организации,
  • Телефон (факс, адрес электронной почты),
  • Серийный номер вашей копии программы,
  • Выпуск (см. меню Help/About/Build),
  • Общее описание проблемы с полным текстом сообщения об ошибке (если такое имеется),
  • Тип вашего компьютера,
  • Версия операционной системы Windows,
  • Другую информацию, которую вы считаете важной.

Для получения данных сведений автоматически щелкните по кнопке System Info… в диалоге About ABBYY FlexiLayout Studio 10 (меню Help).

Внимание!
Бесплатная техническая поддержка предоставляется только зарегистрированным пользователем. Вы можете зарегистрироваться на сайте компании.

Офисы ABBYY


ABBYY Offices

Координаты офисов компании ABBYY

ABBYY Россия | Тел.: +7 495 783 3700 Факс: +7 495 783 2663 Почтовый адрес: 127273, Россия, Москва, а/я 32 Физический адрес: Москва, ст. м. Отрадное, ул. Отрадная, 2Б, строение 6, бизнес-цент "Отрадный" E-mail: sales@abbyy.ru Техническая поддержка: support@abbyy.ru http://www.abbyy.ru Схема проезда
ABBYY USA | Тел.: +1 408-457-9777 Факс: +1 408-457-9778 Адрес: 880 North McCarthy Blvd., Suite #220 Milpitas, CA 95035, USA E-mail: sales@abbyyusa.com Техническая поддержка: support@abbyyusa.com http://www.abbyy.com
ABBYY Ukraine | Тел.: +380 44 490 9999 Факс: +380 44 490 9461 Адрес: P.O. Box 23, 02002 Kiev, Ukraine E-mail: forms@abbyy.ua Техническая поддержка Тел.: +380 44 490 9463 E-mail: formsupport@abbyy.ua http://www.abbyy.ua
ABBYY Europe GmbH | Тел.: +49 (0)89 511 159 0 Факс: +49 89 (0)511 159 59 Адрес: Elsenheimerstraße 49, 80687 Munich, Germany E-mail: sales_eu@abbyy.com Техническая поддержка: support_eu@abbyy.com http://www.abbyy.com http://www.abbyy.de http://www.france.abbyy.com
ABBYY UK Ltd. | Тел.:+0870 600 0231 Факс: +01344 392 611 Адрес: Abbey House, Grenville Place, Bracknell RG12 1BP, United Kingdom E-mail: sales_UK@abbyy.com Техническая поддержка: support_eu@abbyy.com http://www.abbyy.co.uk
ABBYY Japan | Тел.:+81-42-795-1901 Факс: +81-42-795-1901 Адрес: 658-1 Tsuruma, Machida-shi, Tokyo 194-8510 E-mail: sales@abbyyusa.com Техническая поддержка: support@abbyyusa.com http://www.abbyy.com
ABBYY Taiwan | Тел.:+886-2-2655-0556 Факс: +886-2-2655-2339 Адрес: Room #524, 5Fl, Building E, No.19-11, Sanchong road, Nangang District, Taipei 115, Taiwan, R.O.C. E-mail: sales@abbyyusa.com Техническая поддержка: support@abbyyusa.com http://www.abbyy.com


Глоссарий

А

ABBYY FlexiLayout™ Studio

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

D

dot

dot, также dt - сокращение от "document unit", 1/300 дюйма. Единица измерения расстояний на изображении, не зависящая от разрешения. Для изображения с разрешением в 300 dpi расстояние в 1 dot равно 1 точке (пикселу). Не путать с англ. "dot" - "точка".
Замечание. В программе FlexiLayout Studio 10 можно выбрать единицу измерения расстояний для всех параметров поиска элементов, задаваемых диалогами свойств. См. Единицы измерения объектов. При задании параметров поиска с помощью языка FlexiLayout (закладка Advanced свойств элементов) также можно использовать другие единицы измерения расстояний - cm, mm, inch, pt (подробнее см. Cистема координат и единицы измерения). Все эти единицы измерения также не зависят от разрешения изображения, что позволяет накладывать одно и то же гибкое описание на изображения документов, отсканированные с различным разрешением.

Б

Блок

Указание области изображения, из которой необходимо извлечь данные.

В

Вариант гибкого описания

Набор элементов, описывающий одну из разновидностей документа.

Г

Гипотеза

Предположение, что найденный объект(ы) изображения соответствует элементу, т.е. удовлетворяет заданным свойствам и условиям поиска данного элемента.

К

Классификатор

Проект FlexiLayout Studio, предназначенной для предварительной идентификации страниц перед наложением шаблонов и выбора подходящего гибкого описания или его варианта.

Компиляция гибкого описания

Проверка корректности созданного описания: свойств блоков и элементов, условий поиска и т.д.

М

Многостраничное полотно

Множество всех страниц документа называется многостраничным полотном. Многостраничное полотно образуется при склеивании страниц документа сверху вниз, без стыков и зазоров, левые границы всех страниц лежат на одной прямой. Порядок склейки страниц определяется порядком страниц в пакете.

На многостраничном полотне используются две системы координат – глобальная (сквозная) и локальная (координаты на некоторой странице). Глобальная система отличается от локальных одностраничных координат только параллельными переносами (сдвигами), причём сдвиг свой для каждой страницы.

Н

Наложение гибкого описания

Процесс поиска на изображении объектов, соответствующих элементам, и разметки блоков.

Недопустимый элемент

Элементы данного типа не могут присутствовать на изображении. Цепочка гипотез, содержащая данный элемент, отбрасывается.

Необязательный элемент

Элементы данного типа могут отсутствовать на изображении. Если необязательный элемент не был найден, то наложение гибкого описания не прекращается, и формируется нулевая гипотеза с качеством, заданным при описании элемента.

Нулевая гипотеза

Гипотеза, формируемая в случае, если в области поиска не найден ни один объект соответствующий необязательному элементу. Качество нулевой гипотезы задается пользователем при описании элемента.

О

Область поиска

Условие поиска, позволяющее определить ту часть изображения, в которой надо искать объекты изображения, соответствующие данному элементу.

Обязательный элемент

Элементы данного типа не могут отсутствовать на изображении. Если обязательный элемент не был найден, то наложение гибкого описания прекращается.

Опорный элемент

Элемент, использующийся для поиска других элементов и для разметки блоков.

П

Предраспознавание

Процесс анализа изображения, выделение и классификация по типам элементарных объектов изображения.

Р

Регион

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

Э

Элемент

Описание одного или нескольких объектов изображения (разделитель, статический текст, картинка, и т.д.), позволяющее задать условия поиска объекта(ов) в заданной области изображения. Элемент содержит информацию о том, что за объект нужно искать на изображении, каковы его свойства, область поиска и отношения с другими элементами.

Эталонная разметка

Разметка блоков на изображении, созданная вручную или на основе результатов наложения гибкого описания.


Глоссарий

A D Б В Г К М Н О П Р Э


Условные операторы

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

The if statement controls conditional branching. The body of an if statement is executed if the value of the expression is true. The syntax for the if statement has two forms.

Syntax

selection-statement :

if ( expression ) then statement
if ( expression ) then statement else statement

In both forms of the if statement, the expressions are evaluated.

In the first form of the syntax, if expression is true, statement is executed. If expression is false, statement is ignored. In the second form of syntax, which uses else, the second statement is executed if expression is false.