|
|
|
Поиск числа с помощью Findimage, Готовый скрипт |
|
|
cirus |
27.9.2017, 14:06
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26747
Пользователь №: 16.971
Возраст: 29
|
Цитата Даже если в умлочаниях вместо nil'ов что-то задать, то это не приведет как каким-то последствиям. Код result = imageToString{crds={33, 189, 292, 255}, loadFolder = {path="C:\\l2number3", mask="*bmp", sub=1}} Так нормально. Я думал нет никакой разницы передать в качестве параметра или сразу задать по умолчанию Код default.loadFolder = {path="C:\\l2number3", mask="*bmp", sub=1}
|
|
|
|
DarkMaster |
30.9.2017, 4:09
|
Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27738
Пользователь №: 11.279
|
Данный скрипт предназначен для распознавания чисел, текста и различных символов (например, значков серебра, голда). Скрипт учитывает возможные пробелы и переносы строк. Параметры в квадратных [] скобках являются не обязательными, параметры в угловых скобках <> указываются всегда. Квадратные и фигурные скобки при вызове функций не пишутся, они лишь указывают возможность не задавать параметр. Фигурные {} и круглые () скобки пишутся, там где указаны. Символ '|' означает исключающее или, например, sub=0|1 означает, что значение sub может быть равно либо 0, либо 1. Скрипт включает в себя следующие функции:Код --Получение текста из изображения: t = imageToString.get({[parms],[parms],[parms],...})
--Управление буфером: --Получение адреса в памяти загруженного в буфер изображения: imageToString.buffer.get(<путь>)
--Добавление изображения в буфер: imageToString.buffer.add(<путь>, [адрес])
--Удаление изображения из буфера: imageToString.buffer.delete(<путь>)
--Полная очистка буфера: imageToString.buffer.flush() Результат при поиске текста:Код 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] -- булок Известные проблемы:
1.Упрощенный вызов фунции func{} не работает, вызов только через func({}) (ограничено пилотом). 2.Переделать default.crds на get windowpos (ограничено пилотом). 3.Подчитсить findimage (ограничено пилотом). 4.Из-за особенностей костыля финдимиджа создается НЕ локальня переменная tmpOtNiAotNiaorNCOsnaOT.(огрничено пилотом). 5.При передаче источника поиск происходит в ошибочных координатах. Для компенсации конечная X координата задается, как: options.crds[3] - options.crds[1] Данная проблема присутствует на версии пилота 2.39 beta10. Если вы используете более свежую версию, то options.crds[3] - options.crds[1] может быть необходимо заменить в двух местах на: options.crds[3] Параметры при поиске текста:Данный оператор имеет большое количество возможных параметров, все они необязательными. В теле скрипта есть блок значений параметров используемых по умолчанию, которые вы при желании можете изменить (таблица default). window=<хендл|метод>Хендл окна в котором происходит поиск либо метод 1|2. Поиск в перекрытых окнах происходит только при указании хендла. При указании хендла для корректного считывания изображения может понадобиться указывать хендл родительского окна. Значение по умолчанию: workwindow. loadFolder={<path="путь">, [mask="маска"], [sub=0|1]}Загрузка всех изображений из указанной папки. Имена файлов должны соответствовать символу который они означают (расширение не учитывается). Допускаются файлы с одинаковым именем в разных папках. <path="путь"> - абсолютный путь по которому находится папка. Для преобразования относительного пути в абсолютный можно использовать конструкцию path=homepath .. "относительный путь". [mask="маска"] - маска по которой будут загружены файлы. Допускается использование символов '?' и '*'. ? - означает один любой символ, * - любое количество неизвестных символов. Обратите внимание, что mask=".bmp" означает означает точное совпадение полного имени файла с указанной маской, т.к. символы подстановки не использованы. Если же указать mask="*.bmp", то будут загружены все файлы заканчивающиеся ".bmp". [sub=0|1] - флаг указывающий, что изображения должны быть загружены в том числе из подпапок. При указании loadFolder будут проигнорированы параметры: symbols, path, ext. Значение по умолчанию: nil. symbols={}Cимволы для поиска. Возможно указать в двух вариантах синтаксиса: упрощенном и полном. Упрощенный вариант синтаксиса допускает не указывать соответствие имен файлов и строке/символу, который они обозначают: считается, что они идентичны. Пример упрощенного синтаксиса: local symbols = {"0", "1", "2", "3", "a", "b", "c", "test"} Полный синтаксис бывает необходим при использовании нескольких изображений соответствующих одной и той же строке/символу. Допускаются переносы строк: local symbols = { ["0"] = {"zero1", "zero2"}, ["1"] = {"1a", "1b"}, ["2"] = {"two", "second"} } Оба варианта синтаксиса можно сочетать: local 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 координаты будут считаться относительно левого верхнего угла экрана, в противном случае координаты рассчитываются относительно левого верхнего угла приложения. Значение по умолчанию: 0, 0, 1919, 1079, abs=0. accuracy=<число>Точность поиска изображений. Для текста рекомендуется указывать 95-100. Значение по умолчанию: 95. deviation=<число>Допустимое отклонение оттенка в процентах (255/100*deviation). Если цвет 50 100 150, то при указании deviation=2 допустимыми значениями будут являться 45-55 95-105 145-155. Дробная часть при вычислении диапазона не округляется, а отбрасывается. Значение по умолчанию: 2. deltaSpace=<число>Допустимое расстояние по горизонтали между изображениями. Если значение превышено считается, что началось новое слово (присутствует пробел). Значение по умолчанию: 2. deltaY=<число>Смещение по высоте при превышении которого считается, что символы принадлежат к разным строкам. Значение по умолчанию: 8. dupImage=<число>Смещение при котором два найденных изображения будут считаться дубликатом одного. Значение по умолчанию: 3. 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. Сообщение отредактировал DarkMaster - 6.10.2017, 7:53
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
cirus |
4.10.2017, 14:46
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26747
Пользователь №: 16.971
Возраст: 29
|
Цитата Уточнить при deviation происходит trunc() или round(). Если верить вики, то trunc. Цитата Пример: есть погрешность 3%. точка имеет цвет 100 120 130, 255*3%=7. Т. е. 7.65 = 7. Цитата timeProc=<число> т.е. вы не получите обрезанный тест. те кст Может в timeFunc переименовать, понятнее будет. Цитата source Изображение возможно загрузить в память при помощи getimage() или loadimage() Тут есть нюанс. Если передавать изображение, то не нужно указывать crds. Искать будет на всём скрине, т. к. findimage (0, 0 width, height .... options.abs не в getimage должен быть? По идее нужно скрин получать в abs координатах. В findimage он никакой роли не играет, ищем же на скрине.
|
|
|
|
DarkMaster |
5.10.2017, 6:03
|
Модератор UOPilot
Сообщений: 9.468
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27738
Пользователь №: 11.279
|
Скачать скрипт:
FindString.lua_1.0.zip ( 9,55 килобайт )
Кол-во скачиваний: 232Мануал
Данный скрипт предназначен для распознавания чисел, текста и различных символов (например, значков серебра, голда). Скрипт учитывает возможные пробелы и переносы строк. Параметры в квадратных [] скобках являются не обязательными, параметры в угловых скобках <> указываются всегда. Квадратные и фигурные скобки при вызове функций не пишутся, они лишь указывают на возможность не задавать параметр. Фигурные {} и круглые () скобки пишутся, там где указаны. Символ '|' означает исключающее или, например, sub=0|1 означает, что значение sub может быть равно либо 0, либо 1. Известные проблемы: 1. Упрощенный вызов фунции func{} не работает, вызов только через func({}) (ограничено пилотом). 2. Переделать default.crds на get windowpos (ограничено пилотом). 3. Подчитсить findimage (ограничено пилотом). 4. Из-за особенностей костыля финдимиджа создается НЕ локальня переменная tmpOtNiAotNiaorNCOsnaOT (огрничено пилотом). 5. При передаче источника поиск происходит в ошибочных координатах. Данная проблема обусловлена багом финдимиджа. После фикса пилота следовать инструкциям в коде после фразы "Фикс финдимиджа" (всего три правки). 6.Из-за фантазий разработчика CrystalLua при вызове функции со вложенностью происходит передача массива в котором содержится функция. Т.е. при вызове: imageToString.buffer.get ("d:\\test.bmp") на самом деле произойдет вызов: imageToString.buffer.get (imageToString.buffer, "d:\\test.bmp") НО при вызове: imageToString.buffer.get "d:\\test.bmp" будет произведен корректный вызов: imageToString.buffer.get "d:\\test.bmp" Для ликвидации этих фантазий введен дополнительный параметр функциях: bugFix, а так же смещение параметров. После фикса необходимо будет удалить помеченные строки: Следующая строка должна быть удалена при фиксе пиота. Параметр функции bugFix так же должен быть удален. Всего три правки. Установка:Для удобства использования необходимо скачать и сохранить скрипт в отдельный файл и подгружать в начале вашего скрипта: imageToString = require("luaPlugins\\FindString") Вызов данной команды загрузит модуль FindString.lua из папки luaPlugins, расположенной рядом с пилотом. Т.е. "luaPlugins\FindString.lua". Скрипт включает в себя следующие функции:Код --Получение текста из изображения: t = imageToString.get{[parms],[parms],[parms],...}
--Управление буфером: --Добавление изображения в буфер (вернет адрес): imageToString.buffer.add(<путь>, [адрес])
--Получение адреса в памяти загруженного в буфер изображения: imageToString.buffer.get(<путь>)
--Удаление изображения из буфера: imageToString.buffer.delete(<путь>)
--Полная очистка буфера: imageToString.buffer.flush() Результат при поиске текста:Код 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". [sub=0|1] - флаг указывающий на загрузку изображений, в том числе из подпапок. При указании loadFolder будут проигнорированы параметры: symbols, path, ext. Значение по умолчанию: nil. symbols={}Cимволы для поиска. Набор символов возможно указать в двух вариантах синтаксиса: Упрощенный вариант синтаксиса допускает не указывать соответствие имен файлов и строке/символу, который они обозначают: считается, что они идентичны. Пример упрощенного синтаксиса: local symbols = {"0", "1", "2", "3", "a", "b", "c", "test"} Полный синтаксис бывает необходим при использовании нескольких изображений соответствующих одной и той же строке/символу. Допускаются переносы строк: local symbols = { ["0"] = {"zero1", "zero2"}, ["1"] = {"1a", "1b"}, ["2"] = {"two", "second"} } Оба варианта синтаксиса можно сочетать: local 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 координаты будут считаться относительно левого верхнего угла экрана, в противном случае координаты рассчитываются относительно левого верхнего угла приложения. Значение по умолчанию: 0, 0, 1919, 1079, abs=0. accuracy=<число>Точность поиска изображений. Для текста рекомендуется указывать 95-100. Значение по умолчанию: 95. deviation=<число>Допустимое отклонение оттенка в процентах (255/100*deviation). Если цвет 50 100 150, то при указании deviation=2 допустимыми значениями будут являться 45-55 95-105 145-155. Дробная часть при вычислении диапазона не округляется, а отбрасывается. Значение по умолчанию: 2. deltaSpace=<число>Допустимое расстояние по горизонтали между изображениями. Если значение превышено считается, что началось новое слово (присутствует пробел). Значение по умолчанию: 2. deltaY=<число>Смещение по высоте при превышении которого считается, что символы принадлежат к разным строкам. Значение по умолчанию: 8. dupImage=<число>Смещение при котором два найденных изображения будут считаться дубликатом одного. Значение по умолчанию: 3. toNumber=<0|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. Если каких замечаний нет, то можешь релизить, да тему почищу. Сообщение отредактировал DarkMaster - 14.10.2017, 6:59
Прикрепленные файлы
FindString_1.0.4.zip ( 10,52 килобайт )
Кол-во скачиваний: 152
FindString_1.0.5.zip ( 10,53 килобайт )
Кол-во скачиваний: 140
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
cirus |
6.10.2017, 15:09
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26747
Пользователь №: 16.971
Возраст: 29
|
Исправил: Код startX, startY, endX, endY = options.crds[1], 0, options.crds[3] + options.crds[1], height Если передано изображение source, то по Y ищет на всём скрине. Добавлен блок для удаления того что не входит в область указанную в crds. Код -- Удаление лишнего по Y если передано изображение source -- Убрать после исправления бага FindImage, искал снизу вверх if options.source then for i = #crdsRaw, 1, -1 do if crdsRaw[i].y < options.crds[2] or crdsRaw[i].y > options.crds[4] then table.remove(crdsRaw, i) end end end
FindString.lua_1.0.2.zip ( 10,04 килобайт )
Кол-во скачиваний: 206В выходные ещё погоняю, если будет нормально, то можно будет в первый пост добавить.
|
|
|
|
cirus |
7.10.2017, 23:16
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26747
Пользователь №: 16.971
Возраст: 29
|
Цитата Если передано изображение source, то по Y ищет на всём скрине. В общем с координатой X тоже приколы какие-то, так что при передаче изображения source придётся искать на всем скрине, а потом лишнее удалять. Это я переделал. Цитата --Получение адреса в памяти загруженного в буфер изображения: imageToString.buffer.get(<путь>) А оно так работает? Код imageToString["buffer"]["get"]("C:\\l2number\\1.bmp") Так нормально. Цитата --Получение текста из изображения: t = imageToString.get({[parms],[parms],[parms],...}) Результат при поиске текста: t = imageToString.get{[parms],[parms],[parms],...} В одном случае со скобками (), в другом без. Без скобок нормально работает. Или есть какая-то разница?
|
|
|
|
cirus |
9.10.2017, 12:28
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26747
Пользователь №: 16.971
Возраст: 29
|
Цитата Правок больше не будет? X, Y все поправлено? Вроде всё работает. X, Y подправил. При передаче source ищет на всём скрине, что не входит в crds удаляется. Исправлено: Код screenshot, width, height = options.source[1],options.source[2],options.source[3] startX, startY, endX, endY = 0, 0, width, height -- чтобы искало на всём скрине Код -- Если передано изображение source удаляем из crdsRaw всё что не входит в область crds -- Убрать после исправления багов FindImage if options.source then for i = #crdsRaw, 1, -1 do if crdsRaw[i].y < options.crds[2] or crdsRaw[i].y > options.crds[4] or crdsRaw[i].x < options.crds[1] or crdsRaw[i].x > options.crds[3] then table.remove(crdsRaw, i) end end if #crdsRaw < 1 then return nil end end ------------
FindString.zip ( 10,04 килобайт )
Кол-во скачиваний: 191
|
|
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|