|
|
|
Разработка findcolor, findimage, Pure lua |
|
|
Cockney |
13.9.2022, 19:58
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21063
Пользователь №: 16.156
|
Для начала попробуй https://docs.microsoft.com/en-us/windows/wi...winuser-getdcexВряд ли поможет, но потыкать настройки можно. К слову, getdc никаких ошибок не возвращает (возвращает 0, если неверно указан хендл окна), что косвенно может говорить о том дх12 не создает окно или оно таковым не считается для getdc(). Обычно два варианта используют и оба через прямое апи ДХ: 1) Инжект в жертву и перехват различных событий отрисовки (так делал фрапс году на 2017 год минимум). 2) Попросить ДХ отдать контент из своего приложения, как это сделано здесь ну или нагуглить на эту тему кучу страниц на хакерских форумах, где не первый год ковыряют ДХ. а по поводу того что дх12 не создает окно - возможно ситуация как с хромом, где то висит мастер окно, а внутри, как вкладки, рисуются окна, которые потом просто композируются при выводе
|
|
|
|
DarkMaster |
17.9.2022, 12:15
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27724
Пользователь №: 11.279
|
Код local hdcWindow = C.GetDC(method or 0) -- если хендл не указан, то получим скрин с экрана local hdcMemDC = C.CreateCompatibleDC(hdcWindow) local hbmScreen = C.CreateCompatibleBitmap(hdcWindow, w, h)
C.SelectObject(hdcMemDC,hbmScreen) -- сохранить в памяти скрин с окна или экрана C.BitBlt(hdcMemDC, 0, 0, w, h, hdcWindow, x1, y1, SRCCOPY)
local bi = ffi.new('BITMAPINFO', { {ffi.sizeof('BITMAPINFOHEADER'), w, -h, 1, 24, BI_RGB,0,0,0,0,0} }) -- узнать какого размера нужен массив C.GetDIBits(hdcWindow, hbmScreen, 0, h, nil, bi, DIB_RGB_COLORS) -- получить битовый массив local h_copied = C.GetDIBits(hdcWindow, hbmScreen, 0, h, buffer_pointer, bi, DIB_RGB_COLORS)
C.ReleaseDC(method, hdcWindow) C.DeleteObject(hdcMemDC) C.DeleteObject(hbmScreen)
--return h_copied and ffi.cast("int", buffer_pointer) or nil, w, h_copied, math.floor(w*3/4+0.75)*4 if h_copied > 0 then a = tonumber(ffi.cast("int", buffer_pointer)) return {bitmap=buffer_pointer, address=a, w=w, h=h_copied, l=l, offset_x = x1, offset_y = y1, dots_total={["1_1"] = w*h}} else return nil end
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
11.12.2023, 18:29
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27724
Пользователь №: 11.279
|
Собственно, если есть желающие помочь, нужны тесты имиджа и колора. Имидж в моем видении покрыт тестами, но там точно есть ошибка и я ее стабильно воспроизводил, какая вспомнить не могу. Вроде в типе deviation равном r. Полтора года прошло когда я релизить уже готовился, но пришлось сняться срочно. Насколько помню там либо с пограничными значениями была проблема 0/1 254/255/256 (256 существовать не должно это переполнение) либо единичка при каких-то условиях уплывала. Ограничиваться этой проблемой не стоит. Колор вообще не покрыт тестами. Требования к тестам: Тест должен быть реализован скриптом, который вернет некоторую функцию для вызова (в конце скрипта просто return ваша_функция). Ну т.е. типа: local name_test = require "findcolor_test" name_test() -- запустило выполнение На каждый вызов он должен возвращать номер теста, общее количество теств (типа 51/1126), состояние ok|fail, после окончания тестирования выводить общее количество успешных и проваленных тестов. Если тест НЕ должен был ничего найти и НЕ нашел, то это OK, а не fail. Изображения должны быть приложены, путь к папке с изображениями вынесен в отдельную переменную, чтобы потом не править миллион вызовов. Тесты нужны, как на положительное нахождение, так и на отрицательный результат. Самая большая проблема "убежавшие" единички, в координатах и цвтеах. Тесты могут быть, как полностью сгенерированными некоторым вашим скриптом, так и созданными вручную. Синтаксис громоздкий, кривой. Пока так, обертки на него сделать не проблема. Функции для проверки: Код function ext.findcolor_multi(t) --[==[ -- ([screen,] <color> [, count] [, deviation] [, deviation_type]) -- -- [screen] -- массив массивов изображений. Значение по умолчанию {{workwindow()}} -- каждое изображение задается массивом: -- [path|handle|img_obj], [[x1, y1, x2, y2], abs_flag] -- -- [path|handle|img_obj] - источник изображения. -- path - путь по которому находится изображение. -- handle - хэндл приложения из которого необходимо получить изображение. 0 - экран. -- img_obj - таблица {address=адрес_bitmap_в_памяти, h=высота_изображения, w=ширина_изображеия} -- ------------------------------------------------------------------------------------------------ -- x1, y1, x2, y2 - координаты могут быть заданы переменными, -- -- {x1, y1, x2, y2} - массивом, -- {x1, y1, x2, y2} - массив массивов (например, результат работы findcolor/findimage), -- {x1=var1, y1=var2, - таблицей с полями: -- x2=var3, y2=var4} - x1, y1, x2, y2. -- ------------------------------------------------------------------------------------------------ -- abs_flag - флаг абсолютных координат -- -- <color> -- массив массивов искомых цветов. -- массив каждого цвета может быть заданы следующим образом: -- {color} | {color_dec_1, color_dec_2} | {r, g, b} | {r_min, g_min, b_min, r_max, g_max, b_max} -- -- count - количество искомых пикселей. Значение по умолчанию 1. -- -- [deviation] -- Допустимые отклонения цвета. Значение по умлочанию: 0.98, 0.98, 0.98, 1.02, 1.02, 1.02 -- Возможные варианты синтаксиса: -- deviation_general - задано одним числом на все каналы в + и в - -- {blue, green, red} - на каждый канал отдельно, + и - одинаковые. -- {blue_lower, green_lower, red_lower, - на каждый канал отдельно, + и - индивидуальные. -- blue_upper, green_upper, red_upper} -- -- [deviation_type] -- Тип расчета допустимого отклонения цвета. Значение по умолчанию "s". -- Возможные значения: -- "a" - absolute. Абсолютное отклонение канала. -- Например, при цвете 50 100 200 и абсолютном отклонении 10, -- допустимый диапазон цветов будет равен 40-60, 90-110, 190-210 -- "r" - relative. Относительное отклонение, задается множителем. -- Например, при цвете 50 100 200 и относительном отклонении 0.1, -- допустимый диапазон цветов будет равен 45-55 90-110 180-220. -- Округление происход в сторону расширения диапазона. -- Например, при значении канала 101 и допустимом отклонении 10%, -- допустимыми значениями канала будут 101-11 101+11, т.е. 90-112. -- "s" - shadow. Затемнение/осветление. Рассчитывается соотношение каналов, отклонение задается множителем. -- Данный метод может быть полезен, например, при смене суток в игре. -- В рамках данного метода цвета 50 100 200 и 25 50 100 - будут полностью идентичны. -- Для указанных цветов: 200/50=4 50/100=0.5 100/200=0.5 -- 100/25=4 25/50=0.5 50/100=0.5 -- При допустимом отклонении в 0.1, будут считаться допустимыми соотношения каналов: -- 3.6-4.4 0.45-0.55 0.45-0.55 ]==]
ext.findimage_multi = function(t) --[====[ -- findimage -- Ищет изображение в изображении. -- Синтаксис: -- ([{screen},] <{pattern}>, [acc[, deviation[, deviation_type] [, count[, step_x, step_y] [, bg]]]]) -- Допустимые упрощенные варианты синтаксиса: -- (<pattern_source>) -- -- screen и pattern -- массивы/массивы массивов с параметрами изображений. -- screen - где искать. Значение по умолчанию {{workwindow()}}. -- pattern - что искать -- -- структруа массива с изображением: -- [path|handle|img_obj], [[x1, y1, x2, y2], abs_flag] -- -- [path|handle|img_obj] - источник изображения. Для pattern является обязательным. -- path - путь по которому находится изображение. -- handle - хэндл приложения из которого необходимо получить изображение. 0 - экран. -- img_obj - таблица {address=адрес_bitmap_в_памяти, h=высота_изображения, w=ширина_изображеия} -- ------------------------------------------------------------------------------------------------ -- x1, y1, x2, y2 - координаты могут быть заданы переменными, -- -- {x1, y1, x2, y2} - массивом, -- {x1, y1, x2, y2} - массив массивов (например, результат работы findcolor/findimage), -- {x1=var1, y1=var2, - таблицей с полями: -- x2=var3, y2=var4} - x1, y1, x2, y2. -- ------------------------------------------------------------------------------------------------ -- abs_flag - флаг абсолютных координат -- -- [acc] -- Минимальная допустимая точность. Указывается в процентах. -- Значение по умолчанию 90. -- -- [deviation] -- Допустимые отклонения цвета. Значение по умлочанию: 0.98, 0.98, 0.98, 1.02, 1.02, 1.02 -- Возможные варианты синтаксиса: -- deviation_general - задано одним числом на все каналы в + и в - -- {blue, green, red} - на каждый канал отдельно, + и - одинаковые. -- {blue_lower, green_lower, red_lower, - на каждый канал отдельно, + и - индивидуальные. -- blue_upper, green_upper, red_upper} -- -- [deviation_type] -- Тип расчета допустимого отклонения цвета. Значение по умолчанию "s". -- Возможные значения: -- "a" - absolute. Абсолютное отклонение канала. -- Например, при цвете 50 100 200 и абсолютном отклонении 10, -- допустимый диапазон цветов будет равен 40-60, 90-110, 190-210 -- "r" - relative. Относительное отклонение, задается множителем. -- Например, при цвете 50 100 200 и относительном отклонении 0.1, -- допустимый диапазон цветов будет равен 45-55 90-110 180-220. -- Округление происход в сторону расширения диапазона. -- Например, при значении канала 101 и допустимом отклонении 10%, -- допустимыми значениями канала будут 101-11 101+11, т.е. 90-112. -- "s" - shadow. Затемнение/осветление. Рассчитывается соотношение каналов, отклонение задается множителем. -- Данный метод может быть полезен, например, при смене суток в игре. -- В рамках данного метода цвета 50 100 200 и 25 50 100 - будут полностью идентичны. -- Для указанных цветов: 200/50=4 50/100=0.5 100/200=0.5 -- 100/25=4 25/50=0.5 50/100=0.5 -- При допустимом отклонении в 0.1, будут считаться допустимыми соотношения каналов: -- 3.6-4.4 0.45-0.55 0.45-0.55 -- -- [count] -- Количество искомых изображений. По умолчанию 1. -- -- [step_x, step_y] -- шаг поиска паттерна: проверять каждый step_x пиксель по горизонтали, step_y пиксель по вертикали. -- Увеличение step_y дает большую разгрузку процессора, чем step_x при том же количестве точек. -- Значение по умолчанию: рассчитывается исходя из размеров паттерна, -- максимальная разница между step_x и step_y не более 1, -- количество значимых пикселей от 11 до 21 если фон не задан. -- При заданном фоне количество искомых пикселей 21-40 (до вычета фона). -- -- [bg] -- Цвет бэкграунда. Может быть задан: -- true - будет считан цвет левого верхнего пикселя паттерна (с учетом start_x, start_y) -- false - проверка бэкграунда выключена (поиск будет быстрее) -- number - Цвет. Может быть задан десятичным значением либо в hex форме, например: 123456(десятичное), 0x123DEF(hex). -- {r, g, b} - массив с элементам 1-3 содержащими значения каналов r, g, b. -- {r=var1, - таблица с полями r, g, b со значениями каналов (имеет больший приоритет чем массив). -- g=var2, -- b=var3} -- Значение по умолчанию true. ]====]
Сообщение отредактировал DarkMaster - 11.12.2023, 18:32
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
11.12.2023, 18:56
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27724
Пользователь №: 11.279
|
Пример теста: Код --lua local ext = require[[extended]]
-- Для проверки использовать следующую конструкцию: -- если нумерация координат начинается с 1 а не с 0, -- заменить findimage_checker.get_task() на findimage_checker.get_task("start_from_1") -- заменить findimage_checker.check_answer(result) на findimage_checker.check_answer(result, "start_from_1") --[=====[
-- подгружаем тест local findimage_checker = require[[scripts\findimage_checker]]
-- папка с тестами (в ней должны быть подпапки 96x96, 97x97 и т.д.) -- не забываем "\" в конце пути папки. local test_folder = [[image\test\]]
for task in findimage_checker.get_task do -- task будет содержать следующие поля: -- name - имя папки задачи, например, 96x96. -- pattern - имя искомого изображения. -- x1 - стартовая координата поиска по оси x. -- y1 - стартовая координата поиска по оси y. -- x2 - конечная координата поиска по оси x. -- y2 - конечная координата поиска по оси y. -- answer - массив с правильным результатом для проверки, -- аналогично содержит поля x1, y1, x2, y2.
local a1, w1, h1, l1 = loadimage(test_folder..task.name.."\\"..task.screen) local a2, w2, h2, l2 = loadimage(test_folder..task.name.."\\"..task.pattern) local result = findimage(task.x1, task.y1, task.x2, task.y2, a1, a2) findimage_checker.check_answer(result) end
]=====]
local check_list = {
{name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=5, y2=5 , answer={x1=0, y1=0, x2=5, y2=5 }}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=95, y2=95, answer={x1=0, y1=0, x2=5, y2=5 }}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=1, y1=0, x2=95, y2=95}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=1, x2=95, y2=95}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=4, y2=95}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=95, y2=4 }, }
local task_i = 0 local export = {} export.get_task = function() return function(array_starts_from_1) task_i = task_i + 1 if array_starts_from_1 then local task = {} task.name = check_list[task_i].name task.pattern = check_list[task_i].pattern task.x1 = check_list[task_i].x1 + 1 task.y1 = check_list[task_i].y1 + 1 task.x2 = check_list[task_i].x2 + 1 task.y2 = check_list[task_i].y2 + 1 task.answer = {} task.answer.x1 = check_list[task_i].answer.x1 + 1 task.answer.y1 = check_list[task_i].answer.y1 + 1 task.answer.x2 = check_list[task_i].answer.x2 + 1 task.answer.y2 = check_list[task_i].answer.y2 + 1 return task else if i ~= #check_list then return check_list[task_i] else return nil end end end end
export.reset_pos = function() task_i = 0 end
export.check_answer = function(result, array_starts_from_1) --ext.lg(check_list[task_i]) --ext.lg(result) local add = array_starts_from_1 and 1 or 0 if result and result[1] then result[1].x1 = result[1].x1 or result[1].start_x or result[0+add] result[1].y1 = result[1].y1 or result[1].start_y or result[1+add] result[1].x2 = result[1].x2 or result[1].end_x or result[2+add] result[1].y2 = result[1].y2 or result[1].end_y or result[3+add] end
if (result and check_list[task_i].answer) then if (result and result[1].x1 == check_list[task_i].answer.x1+add and result[1].y1 == check_list[task_i].answer.y1+add and result[1].x2 == check_list[task_i].answer.x2+add and result[1].y2 == check_list[task_i].answer.y2+add) then --log(check_list[task_i].name.." "..check_list[task_i].pattern..": success.") return true else local err = table.concat( {check_list[task_i].name.." "..check_list[task_i].pattern..": fail." ..string.format("\nexpected: x1=%3d y1=%3d x2=%3d y2=%3d", check_list[task_i].answer.x1, check_list[task_i].answer.y1, check_list[task_i].answer.x2, check_list[task_i].answer.y2) ..string.format("\nresult: x1=%3d y1=%3d x2=%3d y2=%3d", result[1].x1, result[1].y1, result[1].x2, result[1].y2)}, "") return false, err end elseif (not result and check_list[task_i].answer) then local err = table.concat( {check_list[task_i].name.." "..check_list[task_i].pattern..": fail." ..string.format("\nexpected: x1=%3d y1=%3d x2=%3d y2=%3d", check_list[task_i].answer.x1, check_list[task_i].answer.y1, check_list[task_i].answer.x2, check_list[task_i].answer.y2) .."\nresult: table is nil"}, "") return false, err elseif (result and result[1] and not check_list[task_i].answer) then local err = table.concat( {check_list[task_i].name.." "..check_list[task_i].pattern..": fail. " .."Phantom result, nil expected but founded in: " ..string.format("\nresult: x1=%3d y1=%3d x2=%3d y2=%3d", result[1].x1, result[1].y1, result[1].x2, result[1].y2)}, "") return false, err elseif (not result and not check_list[task_i].answer) then --log("Offset succes.") return true else log("wtf") end end
return export
check_list соответственно список задач. Там фрагмент, полный лист почти 4000 строк) // Финдимидж покрыт координатными тестами. НЕ цветовыми. Девиэйшн только руками прогнан во время написания был.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
yodich |
11.12.2023, 21:00
|
Novice
Сообщений: 90
Регистрация: 24.8.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.728
Возраст: 29
|
Цитата(DarkMaster @ 11.12.2023, 20:56) Пример теста: Код --lua local ext = require[[extended]]
-- Для проверки использовать следующую конструкцию: -- если нумерация координат начинается с 1 а не с 0, -- заменить findimage_checker.get_task() на findimage_checker.get_task("start_from_1") -- заменить findimage_checker.check_answer(result) на findimage_checker.check_answer(result, "start_from_1") --[=====[
-- подгружаем тест local findimage_checker = require[[scripts\findimage_checker]]
-- папка с тестами (в ней должны быть подпапки 96x96, 97x97 и т.д.) -- не забываем "\" в конце пути папки. local test_folder = [[image\test\]]
for task in findimage_checker.get_task do -- task будет содержать следующие поля: -- name - имя папки задачи, например, 96x96. -- pattern - имя искомого изображения. -- x1 - стартовая координата поиска по оси x. -- y1 - стартовая координата поиска по оси y. -- x2 - конечная координата поиска по оси x. -- y2 - конечная координата поиска по оси y. -- answer - массив с правильным результатом для проверки, -- аналогично содержит поля x1, y1, x2, y2.
local a1, w1, h1, l1 = loadimage(test_folder..task.name.."\\"..task.screen) local a2, w2, h2, l2 = loadimage(test_folder..task.name.."\\"..task.pattern) local result = findimage(task.x1, task.y1, task.x2, task.y2, a1, a2) findimage_checker.check_answer(result) end ]=====]
local check_list = {
{name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=5, y2=5 , answer={x1=0, y1=0, x2=5, y2=5 }}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=95, y2=95, answer={x1=0, y1=0, x2=5, y2=5 }}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=1, y1=0, x2=95, y2=95}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=1, x2=95, y2=95}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=4, y2=95}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=95, y2=4 }, } local task_i = 0 local export = {} export.get_task = function() return function(array_starts_from_1) task_i = task_i + 1 if array_starts_from_1 then local task = {} task.name = check_list[task_i].name task.pattern = check_list[task_i].pattern task.x1 = check_list[task_i].x1 + 1 task.y1 = check_list[task_i].y1 + 1 task.x2 = check_list[task_i].x2 + 1 task.y2 = check_list[task_i].y2 + 1 task.answer = {} task.answer.x1 = check_list[task_i].answer.x1 + 1 task.answer.y1 = check_list[task_i].answer.y1 + 1 task.answer.x2 = check_list[task_i].answer.x2 + 1 task.answer.y2 = check_list[task_i].answer.y2 + 1 return task else if i ~= #check_list then return check_list[task_i] else return nil end end end end
export.reset_pos = function() task_i = 0 end
export.check_answer = function(result, array_starts_from_1) --ext.lg(check_list[task_i]) --ext.lg(result) local add = array_starts_from_1 and 1 or 0 if result and result[1] then result[1].x1 = result[1].x1 or result[1].start_x or result[0+add] result[1].y1 = result[1].y1 or result[1].start_y or result[1+add] result[1].x2 = result[1].x2 or result[1].end_x or result[2+add] result[1].y2 = result[1].y2 or result[1].end_y or result[3+add] end
if (result and check_list[task_i].answer) then if (result and result[1].x1 == check_list[task_i].answer.x1+add and result[1].y1 == check_list[task_i].answer.y1+add and result[1].x2 == check_list[task_i].answer.x2+add and result[1].y2 == check_list[task_i].answer.y2+add) then --log(check_list[task_i].name.." "..check_list[task_i].pattern..": success.") return true else local err = table.concat( {check_list[task_i].name.." "..check_list[task_i].pattern..": fail." ..string.format("\nexpected: x1=%3d y1=%3d x2=%3d y2=%3d", check_list[task_i].answer.x1, check_list[task_i].answer.y1, check_list[task_i].answer.x2, check_list[task_i].answer.y2) ..string.format("\nresult: x1=%3d y1=%3d x2=%3d y2=%3d", result[1].x1, result[1].y1, result[1].x2, result[1].y2)}, "") return false, err end elseif (not result and check_list[task_i].answer) then local err = table.concat( {check_list[task_i].name.." "..check_list[task_i].pattern..": fail." ..string.format("\nexpected: x1=%3d y1=%3d x2=%3d y2=%3d", check_list[task_i].answer.x1, check_list[task_i].answer.y1, check_list[task_i].answer.x2, check_list[task_i].answer.y2) .."\nresult: table is nil"}, "") return false, err elseif (result and result[1] and not check_list[task_i].answer) then local err = table.concat( {check_list[task_i].name.." "..check_list[task_i].pattern..": fail. " .."Phantom result, nil expected but founded in: " ..string.format("\nresult: x1=%3d y1=%3d x2=%3d y2=%3d", result[1].x1, result[1].y1, result[1].x2, result[1].y2)}, "") return false, err elseif (not result and not check_list[task_i].answer) then --log("Offset succes.") return true else log("wtf") end end
return export
check_list соответственно список задач. Там фрагмент, полный лист почти 4000 строк) // Финдимидж покрыт координатными тестами. НЕ цветовыми. Девиэйшн только руками прогнан во время написания был. ты фатит дразнться, уже пол года жду оригинал)
|
|
|
|
DarkMaster |
12.12.2023, 10:29
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27724
Пользователь №: 11.279
|
Задача именно база изображений и любой вменяемый формат описаний где А (не) должно найтись в Б в координатах В. Пример описания выше. Можно тупо взять тот же самый код полностью. И просто создать свой check_list. Про отсчеты с 1 - забей, аттавизм. Код
{name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=5, y2=5 , answer={x1=0, y1=0, x2=5, y2=5 }}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=95, y2=95, answer={x1=0, y1=0, x2=5, y2=5 }}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=1, y1=0, x2=95, y2=95}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=1, x2=95, y2=95}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=4, y2=95}, {name="96x96", screen="big.bmp", pattern="upper_left_6x6.bmp", x1=0, y1=0, x2=95, y2=4 },
Вот подобное мне нужно. С вашими картинками, координатами, дивиэйшенами. С кодом пока сложно. Там сейчас сам разбираюсь что где и как. Около 20к строк по пачке файлов из-за того, что искались правильные пути оптимизаций. Сейчас все это собирается в кучу. Если я вывалю этот код - толку не будет никакого вообще. Там черт ногу сломит и даже я писавший его уже второй день тупо сижу и вспоминаю, что где и как. Из-за того, что используется общий буфер чтобы экономить память и не перевыделять - пришлось фактически писать менеджер памяти, скрины рамера разного, в зависимости от типа разные преобразования, буфер искомых изображений, три типа дивиэйшенов - там уже нужен большой рефакторинг. На данный момент задача заставить это все-таки как-то работать, чтобы можно было делать какие-то тесты стабильности и нагрузочные. Дальше большой список уже есть, что нужно допиливать. Я хочу сделать хоть какой-то релиз, а то так пилить можно вечно. Цитата В код не шибко вникал, но почему бы не использовать что то типа https://github.com/bluebird75/luaunitМожно. Мне вообще без разницы. Мне главное получить изображения и прогноз результата. Как это будет подключаться и что при этом использовать значения не имеет. Имхо написать массив проще, чем разбираться с либой, но я никак не ограничиваю. Единственное, что действительно желательно, чтобы я написал require и получил результат, а не сидел и не сращивал тесты с кодом. Синтаксис вызываемых функций описан. Можно следовать ему, можно check_list просто забить. Цитата можно check_list просто забить. Поля тоже можно добавлять при необходимости, например, для дивейшена, точности и т.д. Оберну эти моменты. Сообщение отредактировал DarkMaster - 12.12.2023, 10:18
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
DarkMaster |
17.12.2023, 17:57
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27724
Пользователь №: 11.279
|
если я правильно тебя понял, то: ищем в 10 10 19 19, getimage при этом заберет картинку размером 10 на 10. Размер искомого паттерна значения не имеет, никаких забеганий на поля. Поиск в координатах 10 10 19 19 означает, что при обнаружении паттерна стартовая коорината местоположения паттерна должна быть не менее 10, а конечная не более 19. Никаких вариантов, что мы ищем в 10 10 19 19, но нам достаточно совпавших пикселей в области, скажем 10 10 12 12, если паттерн расположить в 9 9 не рассматирвается. Пилотовский финд сейчас работает так же, но там кривой хотфикс. Пилот ищет с полями, а потом выкидывает эти варианты. Хотя может уже и не кривой... Давно дело было.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
Cockney |
17.12.2023, 18:51
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21063
Пользователь №: 16.156
|
Че-то хз как даже по кейвордам найти то обсуждение: речь там шла про то, что пилот файнд делает скрин области неявно большей чем это указывает юзер, это нужно например для того, чтобы поймать случаи, когда в начале области поиска на экране есть только конец паттерна, соответственно для алгоритма там как-то это нужно, мб чтобы не сильно париться с расчетами смещений ага, это вот оно вроде https://forum.uokit.com/index.php?s=&sh...st&p=442986следовательно то вопрос основной в том, а как пилот края такие обрабатвает-то, там постоянные проверки на выход за область памяти, они же перф гробят
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|