Templates

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

  • Name — имя шаблона.
  • Default Item — которое определяет, какой итем шаблона будет искаться по умолчанию. Когда в коде программы мы пишем Rect.FindPicture(); мы не указываем имя итема, который нужно искать, и вот в этом случае искаться будет итем указанный в этом свойстве.
  • ConnectedScreen — ссылка на конвеер скриншотов, в котором будет искаться данный шаблон.
  • FourSearch — признак указывающий на то, что шаблон будет искаться по 4м фрагментам. В качестве фрагментов необходимо создать 4 итема и в каждом указать в свойстве disposition положение элемента относительно остальных. Метод предназначен для поиска таблиц, которые меняют размер, поэтому фрагменты должны быть расположены в вершинах четырехугольника (таблицы которую мы ищем). Если фрагмент не  будет расположен на одной линии с другими фрагментами, он не будет найден. Данный метод поиска можно использовать в режиме Fix Borders или  в режиме ColMap, в режиме Borders будет сложно достигнуть удовлетворительных результатов, поэтому использовать для поиска по четырем фрагментам его не рекомендуется.
  • PrimePart — показывает с какого фрагмента будет начинаться поиск по 4м фрагментам, на данный момент это всегда верхний левый угол.

                У шаблона есть подчиненные элементы «Items», собственно в них, и содержаться шаблоны изображений,  итемов может быть неограниченное количество. Если один и тот же объект в разные моменты времени выглядит по разному, то можно завести к одному шаблону  итем на каждый из случаев. Выбрав итем шаблона Rect в дереве объектов мы опять увидим инспектор объектов с большим количеством свойств. Рассмотрим их подробнее:

  • Name — имя итема, по умолчанию это Default Item, если не планируется использовать несколько итемов, то называть его по-другому не рекомендуется.
  • RegularSearch — постоянный поиск. Если это свойство установить в значение истина, то шаблон будет искаться в параллельном потоке непрерывно (подобно тому, как если вы запустили 2 программы в ОС и они работают параллельно). В этом режиме поиск объекта идет постоянно, непрерывно и одновременно с исполнением основного кода вашей программы, вне зависимости от того вызывали ли вы команду поиска этого объекта из кода своей программы или нет. Таким образом, когда ваша программа пытается узнать, где находится этот объект (т.е. вы даете команду FindPicture), то ей просто передаются уже вычисленные координаты, и она не тратит время на выполнение поиска, т.е. с точки зрения вашего кода поиск занял 0 миллисекунд. Тем не менее, нужно учитывать, что процессорное время при этом тоже расходуется, и если реальной необходимости частого поиска картинки нет, то этим режимом лучше не злоупотреблять. При этом в окне отладочных сообщений показывается время, затраченное на поиск параллельным потоком, причем вы получите это сообщение столько раз, сколько параллельный поток выполнит поисков.
  • SearchPeriod — Значение указывается в секундах. Частота выполнения поиска картинки. Координаты объекта будут обновляться через промежуток времени указанном в этом свойстве. Если время поиска шаблона превышает или равно значению SearchPeriod, то поиск будет выполняться непрерывно, что при поиске в параллельном потоке создаст высокую нагрузку на процессор, поэтому не рекомендуется допускать такую ситуацию.
  • SearchFixed — если объект ранее был найден, в какой-то области, то поиск будет выполняться только в этих же самых координатах и только в них.
  • mashtab — не используется, ни на что на данный момент не влияет, менять его значение не рекомендуется (если в дальнейшем оно будет задействовано, может нехорошо получится, если вы там что-то изменили)
  • Treshold — чувствительность фильтра Borders, должно равняться значению, которое было указано в шапке программы в момент, когда вы делали этот шаблон, в противном случае результаты поиска будут неудовлетворительными. Для шаблона, созданного в режиме ColMap это свойство ни на что не влияет.
  • mainсolor — если шаблон создавался в режиме Borders, то тут должно быть указано None, если в режиме ColMap, то в этом поле должен быть указан цвет, в котором создавался этот шаблон.
  • k — коэффициент совпадения шаблона с изображением на экране. При стопроцентном совпадении коэффициент равен 1. Тут мы указываем значение коэффициента, при котором шаблон будет считаться найденным.
  • disposition — для поиска по 4м фрагментам показывает местоположение данного фрагмента относительно остальных фрагментов (слева сверху, справа сверху, слева в низу, справа  в низу).

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

                На картинке из предыдущего примера (желтый квадрат и надпись Hello world) сделаем еще 1 шаблон, скриншот квадрата отфильтруем в режиме Borders (нажать кнопку Borders), и нажав кноку Select выделим слова Hello world

rect5

Внутри квадрата жмем правой кнопкой мыши, и получаем окно:

insert

                В котором напротив слова Parent (родитель) написано красными буквами Not selected, теперь в дереве объектов выберем объект Rect

tree2

И надпись Not selected изменится на Rect, это значит, что родителем создаваемого шаблона будет Rect. Вводим имя HelloRect и жмем кнопку Input, и теперь в дереве объектов мы видим, что у Rect появился еще 1 подчиненный элемент:tree3

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

Если мы напишем программу вида:

text5

То в результате ее выполнения, сначала будет выдана команда на поиск шаблона Rect, а затем уже на поиск HelloRect, причем HelloRect будет искаться только внутри координат родительского объекта, если же родительский объект найден не будет, то поиск подчиненного не будет выполнен и вовсе, и он будет считаться не найденным. Этот режим позволяет сократить время поиска, сократить объем кода программы, и уменьшить количество ложных срабатываний. Так в реальных условиях родительским шаблоном может быть шаблон окна игры, а для всех объектов, которые должны находиться внутри этого окна создаются шаблоны подчиненные шаблону окна игры, и они будут искаться только внутри области игры. В данном случае, можно сделать так, чтобы окно игры искалось в параллельном потоке (т.к. поиск каждого подчиненного объекта будет вызывать поиск  родителя  но даже при поиске в одном потоке, родитель будет искаться с той периодичностью, которая задана в его настройках). Если бы у нас на экране было бы несколько фраз «Hello World», причем одна внутри квадрата, а другие вне его, то с помощью такого  приема мы бы нашли только ту фразу, которая находится внутри квадрата. В реальной ситуации при поиске мелких объектов часто может получаться так, что программа находит подходящий набор точек совсем на другом участке экрана. Например, если мы применили фильтр красного цвета, а рядом с окном игры нарисован залитый красным цветом прямоугольник, то при поиске в этом квадрате нашего объекта совпадение будет 100%. А применение иерархических шаблонов решает  данную проблему. Рекомендую строить шаблоны именно таким образом. Количество уровней вложенности не ограничено, у любого подчиненного шаблона могут быть свои подчиненные шаблоны и т.д.

                Если в текстовом редакторе после имени шаблона ввести  символ ‘.’ (точка), то появится список методов шаблона. Т.к. интерпретатор не поддерживает перегрузку функций, то у каждой функции есть 2 варианта, которые отличаются префиксом ‘F’ в начале названия и количеством параметров. В функциях без префикса ‘F’ некоторые параметры принимаются по умолчанию, и у вас нет необходимости их каждый раз указывать.

FFindPicture(NumberOfSearchingPicture: Byte; ItemName: string):boolean — метод ищет шаблон в пределах подчинения родителю. NumberOfSearchingPicture — номер искомого шаблона. Если этот параметр >0, то при поиске шаблон считается найденым если процент совпадения больше или равен свойству k, поиск прекращается когда найден NumberOfSearchingPicture-й шаблон. Если же этот параметр = 0, то ищется самый подходящий участок изображения, поиск будет остановлен, если будет найдено 100% совпадение или если изображение закончится. Шаблон будет считаться найденным, если степень совпадения самого совпадающего участка изображения больше свойства k. С помощью данного метода также можно искать изображения в цикле:

text6

                Т.е. таким образом можно перебрать все одинаковые шаблоны на изображении. Т.к. параметр имеет тип Byte, то его максимальное значение = 255. (Если этого недостаточно, сигнализируйте, увеличим).

Параметр ItemName — имя итема шаблона, если необходимо найти итем по умолчанию, то можно указать  слово ‘default’, либо имя итема в дереве объектов. Интерпретатор не поддерживает значений по умолчанию, поэтому все параметры необходимо обязательно указывать.

FindPicture:boolean — аналогична предыдущей функции, но не требует никаких параметров, т.к. NumberOfSearchingPicture по умолчанию принимается = 0, а ItemName = ‘default’;

 

FFindPictureBottomFrom(PrimeObjectName: string; ItemName: string; PrimeItemName: string; NumberOfSearchingPicture: Byte; NumberOfPrimePicture: Byte) — ищет шаблон снизу.

FFindPictureRightFrom(PrimeObjectName: string; ItemName: string; PrimeItemName: string; NumberOfSearchingPicture: Byte; NumberOfPrimePicture: Byte)- ищет шаблон справа.

FFindPictureLeftFrom(PrimeObjectName: string; ItemName: string; PrimeItemName: string; NumberOfSearchingPicture: Byte; NumberOfPrimePicture: Byte)- ищет шаблон слева.

FFindPictureTopFrom(PrimeObjectName: string; ItemName: string; PrimeItemName: string; NumberOfSearchingPicture: Byte; NumberOfPrimePicture: Byte)- ищет шаблон сверху.

FFindPictureBetween(PrimeObjectName: string; SecondaryObjectName: string; ItemName: string; PrimeItemName: string; SecondaryItemName: string; NumberOfSearchingPicture: Byte; NumberOfPrimePicture: Byte; NumberOfSecondaryPicture: Byte) — ищет шаблон между PrimeObjectName и SecondaryObjectName

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

FMouseClick(NumberOfSearchingPicture: Byte; ItemName: string; T: string) — кликает мышью в случайной точке области шаблона если он найден. В случае успеха возвращает True. В параметре T передаем ‘L’ — клик левой кнопкой мыши. ‘R’- клик правой кнопкой мыши. ‘D’ — двойной клик мышью. ВНИМАНИЕ! вызов этой функции вызовет также и функцию FindPicture, а потому вызывать ее отдельно не нужно!

FMouseDrag(ObjectNameDest: string; ItemName: string; ItemNameDest: string; NumberOfSearchingPicture: Byte; NumberOfSearchingPictureDest: Byte)  — зажимает левую кнопку мыши в случайной точке области шаблона и перемещает мышь в область Dest, и затем отпускает левую кнопку мыши. В случае успеха возвращает True. ВНИМАНИЕ! вызов этой функции вызовет также и функцию FindPicture, а потому вызывать ее отдельно не нужно!

FMouseMove(NumberOfSearchingPicture: Byte; ItemName: string) — двигает мышь в случайной точке области шаблона если он найден. В случае успеха возвращает True. ВНИМАНИЕ! вызов этой функции вызовет также и функцию FindPicture, а потому вызывать ее отдельно не нужно!

FFindColor(ColorName: string; ItemName: string; sensitivity: Cardinal; NumberOfSearchingPicture: Byte) — ищет в области шаблона цвет имя которого передано в параметре ColorName (имя цвета из дерева объектов).  Можно передавать несколько имен цветов в этом параметре, разделяя их символом ‘,’ или ‘|’. Запятая значит И, т.е. ‘цвет1,цвет2’ означает что нужно найти  цвет1 и цвет2, если оба цвета будут найдены, то функция вернет значение истина, иначе ложь. Знак ‘|’ означает ‘ИЛИ’. Пример: ‘цвет1|цвет2’ означает, что нужно найти цвет1 или цвет 2, если хоть один из цветов будет найден, то функция вернет истину. Параметр sensitivity — количество пикселей, которое нужно найти, чтобы цвет считался найденным. В случае успеха функция возвращает истину, а также в свойства Left, Right, Top,Bottom записывает координаты области, в которой сосредоточены искомые цвета. Нужно иметь это ввиду, т.к. после успешного поиска цвета в этих параметрах уже не координаты шаблона, а координаты цвета!  ВНИМАНИЕ! вызов этой функции вызовет также и функцию FindPicture, а потому вызывать ее отдельно не нужно!

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

FRecognizeText(AlphabetName: string; NameObject: string; ItemName: string; NumberOfSearchingPicture: Byte) — распознает текст в области шаблона. AlphabetName — имя алфавита, в котором находятся шаблоны для распознавания. Возвращает истину в случае успеха. Записывает распознанный текст в свойство Text шаблона. ВНИМАНИЕ! вызов этой функции вызовет также и функцию FindPicture, а потому вызывать ее отдельно не нужно!

                Короткие варианты методов мы не стали рассматривать для всех функций, т.к. их отличия аналогичны рассмотренным  в начале.

Свойства:

Name                   — Имя шаблона в дереве объектов.

text                       — сюда помещается распознанный текст.

PictureFound    — содержит True если последний поиск шаблона был успешен и False если нет.

Left, Right, Top, Bottom — содержит координаты найденного шаблона, в случае если была выполнена функция найти цвет, то содержит координаты найденного участка с цветом.

 

Bot Development Engine