Данный скрипт предназначен для распознавания чисел, текста и различных символов (например, значков серебра, голда).
Есть 2 версии скрипта: одна на языке пилота, вторая на языке lua.
Минимальная версия пилота 2.39. Запускать от администратора.
Автор скрипта DarkMaster.
Вопросы, баги, предложения на форум
в специальную тему по этому скрипту
https://forum.uokit.com/index.php?showtopic=30000 Мануал по использованию:
Данный скрипт предназначен для распознавания чисел,
текста и различных символов (например, значков серебра, голда).
Скрипт учитывает возможные пробелы и переносы строк.
Параметры в квадратных [] скобках являются не обязательными,
параметры в угловых скобках <> указываются всегда.
Квадратные и фигурные скобки при вызове функций не пишутся,
они лишь указывают на возможность не задавать параметр.
Фигурные {} и круглые () скобки пишутся там, где указаны.
Символ '|' означает исключающее или, например, sub=0|1 означает,
что значение sub может быть равно либо 0, либо 1.
Для удобства использования необходимо
сохранить скрипт в отдельный файл
и подгружать в начале вашего скрипта:
imageToString = require("luaPlugins\\FindString")
Вызов данной команды загрузит модуль
FindString.lua из папки luaPlugins,
расположенной рядом с пилотом.
Т.е. "luaPlugins\FindString.lua"
Скрипт включает в себя следующие функции:
Управление буфером:
Добавление изображения в буфер (вернет адрес):
imageToString.bufferAdd(<путь>,
Получение адреса в памяти загруженного в буфер изображения:
imageToString.bufferGet(<путь>)[адрес])
Удаление изображения из буфера:
imageToString.bufferDelete(<путь>)
Полная очистка буфера:
imageToString.bufferFlush()
Получение текста из изображения:
t = imageToString.get{[parms],[parms],[parms],...}
Внимание! Скобки фигурные!
Указывается либо папка либо набор символов!
[loadFolder] | [[symbols],[path],[ext]]
Полный синтаксис:
t = imageToString.get{
Параметр(все необязательные) Значение по умолчанию
window=<хендл|метод> -- workwindow()
loadFolder={<path="путь">, [mask="маска"], [sub=0|1]} -- nil
symbols={"0", "1", ["2"] = {"two", "second"}, "3"} -- {["1"]={"1"}, ["2"]={"2"}, ["3"]={"3"}, ["4"]={"4"}, ["5"]={"5"},
-- ["6"]={"6"}, ["7"]={"7"}, ["8"]={"8"}, ["9"]={"9"}, ["0"]={"0"}}
path=<"путь"> -- "images\\"
ext=<"расширение"> -- "*.bmp"
crds={<xStart>, <yStart>, <xEnd>, <yEnd>, [abs=0|1]} -- размер окна (workwindow(), если окно явно не указано), если не задано - рабочего стола.
accuracy=<число> -- 95
deviation=<число> -- 2
deltaSpace=<число> -- 2
deltaY=<число> -- 8
dupImage=<число> -- 3
toNumber=<0|1> -- 1
source={<address>, <width>, <height>} -- nil
saveImage=<"путь"> -- nil
wait=<число> -- 2
durationMax=<число> -- 0
secondFrame=<число> -- 0
bufferAddNew=<0|1> -- 1
bufferUpdate=<0|1> -- 0
bufferIgnore=<0|1> -- 0
}
Результат при поиске текста:
t = imageToString.get{[parms],[parms],[parms],...}
Функция возвращает двумерную таблицу,
где первый индекс является номером строки,
второй номером слова.
Если ничего не найдет, вернет nil.
Например, при распознавании текста:
Съешь еще
этих
мягких французских булок.
Массив будет содержать следующие значения:
t[1][1] -- Съешь
t[1][2] -- еще
t[2][1] -- этих
t[3][1] -- мягких
t[3][2] -- французских
t[3][3] -- булок
Параметры при поиске текста:
Данный оператор имеет большое количество возможных параметров,
все они являются необязательными.
В теле скрипта есть блок значений
параметров, используемых по умолчанию,
которые вы при желании можете изменить (таблица default).
window=<хендл|метод>
Хендл окна в котором происходит поиск либо метод 1|2.
Поиск в перекрытых окнах происходит только при указании хендла.
При указании хендла для корректного считывания изображения может
понадобиться указывать хендл родительского окна.
Значение по умолчанию: workwindow().
loadFolder={<path="путь">, [mask="маска"], [sub=0|1]}
Загрузка всех изображений из указанной папки.
Имена файлов должны соответствовать символу
который они означают (расширение не учитывается).
Допускаются файлы с одинаковым именем в разных папках.
<path="путь"> - абсолютный путь по которому находится папка.
Для преобразования относительного пути в абсолютный можно
использовать конструкцию: path=homepath() .. "относительный путь".
[mask="маска"] - маска по которой будут загружены файлы.
Допускается использование символов '?' и '*'.
? - означает один любой символ,
* - любое количество неизвестных символов.
Обратите внимание, что mask=".bmp" означает
точное совпадение полного имени файла с указанной маской,
т.к. символы подстановки не использованы.
Если же указать mask="*.bmp",
то будут загружены все файлы, заканчивающиеся сочетанием ".bmp".
Значение по умолчанию: "*.bmp".
[sub=0|1] - флаг, указывающий на загрузку изображений,
в том числе из подпапок.
При указании loadFolder будут проигнорированы параметры:
symbols, path, ext.
Значение по умолчанию: nil.
symbols={}
Символы для поиска.
Набор символов возможно указать в двух вариантах синтаксиса:
упрощенном и полном.
Упрощенный вариант синтаксиса допускает не указывать
соответствие имен файлов и строке/символу,
который они обозначают: считается, что они идентичны.
Пример упрощенного синтаксиса:
symbols = {"0", "1", "2", "3", "a", "b", "c", "test"}
Полный синтаксис бывает необходим при использовании нескольких
изображений, соответствующих одной и той же строке/символу.
Допускаются переносы строк:
symbols = {
["0"] = {"zero1", "zero2"},
["1"] = {"1a", "1b"},
["2"] = {"two", "second"}
}
Оба варианта синтаксиса можно сочетать:
symbols = {"0", "1", ["2"] = {"two", "second"}, "3"}
Данный параметр игнорируется,
если указана загрузка папки (loadFolder).
Значение по умолчанию:
{["1"]={"1"}, ["2"]={"2"}, ["3"]={"3"}, ["4"]={"4"}, ["5"]={"5"},
["6"]={"6"}, ["7"]={"7"}, ["8"]={"8"}, ["9"]={"9"}, ["0"]={"0"}}
path=<"путь">
Путь, по которому находятся изображения, указанные в symbols.
Путь может быть задан относительным или абсолютным.
Данный параметр игнорируется,
если указана загрузка папки (loadFolder).
Все символы '\' должны быть удвоены (escape-последовательность).
Пример:
path="c:\\image.bmp"
Если путь будет начинаться с символа '\',
то он будет восприниматься относительно корня диска.
Пример:
Если пилот находится по адресу d:\uopilot\uopilot.exe,
то параметр path="\\myFolder"
будет указывать на папку d:\myFolder.
Значение по умолчанию: "images\\".
Это относительный путь, указывающий на папку images,
которая находится рядом с .exe пилота (создается пользователем).
ext=<"расширение">
Расширение картинок, указанных в symbols.
Данный параметр игнорируется,
если указана загрузка папки (loadFolder).
Значение по умолчанию: ".bmp".
crds={<xStart>, <yStart>, <xEnd>, <yEnd>, [abs=0|1]}
Координаты, в которых необходимо производить поиск.
При указании флага abs=1 координаты будут считаться
относительно левого верхнего угла экрана,
в противном случае координаты рассчитываются
относительно левого верхнего угла приложения.
Значение по умолчанию:
размер окна с которым работает функция и относитльные координаты,
если окно не указано и привязка плиота отсутствует, то
используется разрешение рабочего стола и абсолютные координаты.
accuracy=<число>
Точность поиска изображений.
Для текста рекомендуется указывать 95-100.
Значение по умолчанию: 95.
deviation=<число>
Допустимое отклонение оттенка в процентах (255/100*deviation).
Если цвет 50 100 150, то при указании deviation=2
допустимыми значениями будут являться 44-55 94-105 144-155.
Дробная часть при вычислении диапазона
не округляется, а отбрасывается.
Значение по умолчанию: 2.
deltaSpace=<число>
Допустимое расстояние по горизонтали между изображениями.
Если значение превышено считается,
что началось новое слово (присутствует пробел).
Значение по умолчанию: 2.
deltaY=<число>
Смещение по высоте при превышении которого считается,
что символы принадлежат к разным строкам.
Значение по умолчанию: 5.
dupImage=<число>
Смещение, при котором два найденных изображения
будут считаться дубликатом одного.
Значение по умолчанию: 3.
symbolPrio={symbol_1, symbol_2, symbol_3, ...}
Устатнавливает приоритет удаления дублей.
Часть симоволов может содержаться в других символах.
Например при распозновании "Q" очень велика вероятность,
что будет надена буква Q и буква O, аналогично в парах:
7 и 1, 4 и 1 и т.д.
Приоритет определяется позицией символа в массиве,
чем меньше индекс, тем выше приоритет.
Например: {"q", "o", "7", "4", "1"}
заменит О на Q, 1 на 4, 4 на 7 и т.д.,
если они обнаружены в пределах области
считающейся дублями.
Для выключения использовать: {}
Значение по умолчанию: {"q", "o", "7", "4", "1"}
toNumber=<0|1>
Флаг, при котором слова, состоящие только из цифр
будут преобразованы из строки в числовой тип данных.
Это необходимо для арифметических действий, а также
для сравнения чисел.
Значение по умолчанию: 1.
source={<address>, <width>, <height>}
Источник загруженного в память изображения
в котором производить поиск.
<address> - адрес в памяти
<width> - ширина изображения
<height> - высота изображения
Изображение возможно загрузить в память при помощи
getimage() или loadimage().
Значение по умолчанию: nil.
saveImage=<"путь">
Путь, по которому будет сохранено изображение
в котором происходил поиск.
Значение по умолчанию: nil.
wait=<число>
Пауза в миллисекундах (1000мс=1сек) между поиском изображений.
Используется для снижения нагрузки на процессор
ценой увеличения времени поиска.
Значение по умолчанию: 2.
durationMax=<число>
Время в течении которого будут происходить
повторные попытки найти изображение.
Значение может быть дробным, например:
durationMax=2.5.
При указании durationMax=-1 поиск будет происходить
бесконечно до тех пор, пока изображение не будет найдено.
Если первое изображение было найдено,
то остальные будут обработаны полностью
вне зависимости от таймера,
т.е. вы не получите обрезанный текст.
При первом успешном распознавании текста функция завершит работу
и передаст результат, не дожидаясь окончания таймера.
Значение по умолчанию: 0.
secondFrame=<число>
Параметр позволяет задать паузу между
первым нахождением изображения и началом
считывания изображений для распознавания текста.
Позволяет дождаться полной прогрузки
текста перед обработкой.
Обратите внимание, что параметр durationMax учитывает значение
secondFrame и не позволит функции работать дольше,
чем указано в durationMax. Значение по умолчанию:0.
bufferAddNew=<0|1>
Флаг разрешающий добавлять в память буфера изображения,
которые отсутствовали в буфере и были считаны с диска.
Данный параметр игнорируется,
если указан bufferIgnore=1.
Значение по умолчанию: 1.
bufferUpdate=<0|1>
Флаг указывающий на то,
что изображения в буфере должны быть обновлены.
Они будут считаны с диска заново.
Обновятся только те изображения,
которые будут участвовать в поиске.
Данный параметр игнорируется, если указан bufferIgnore=1.
Значение по умолчанию: 0.
bufferIgnore=<0|1>
Флаг, запрещающий работать с буфером.
Данный из буфера считаны не будут,
загрузка искомых изображений произойдет с диска.
Никаких данных в буфер не сохраняется.
Значение по умолчанию: 0.
Пример вызова:
local cell = fs.get{
loadFolder = {path = "image\\comeback", mask="*"},
crds ={x*254, y*36, 108+x*254, 17+y*36},
deltaSpace = 10
}
Если в области для распознования содержатся посторонние данные,
то может быть полезено вызвать функцию несколько раз с областями
непосредственно содержащими данные.
Пример функции для сбора значений представленных в виде таблицы:
get_prices = function(offset_x, offset_y)
local img, w, h, l = getimage(offset_x, offset_y,
410+offset_x, 340+offset_y)
local price = {}
for x = 0, 1 do
for y = 0, 9 do
local cell = fs.get{
loadFolder = {path = "image\\comeback", mask="*"},
source = {img, w, h},
crds ={x*254, y*36, 108+x*254, 17+y*36},
deltaSpace = 10
}
if cell then
price[#price+1] = cell[1][1]
end
end
end
deleteimage(img)
return price
end