Здравствуйте, гость ( Вход | Регистрация )

30 страниц V « < 26 27 28 29 30 >  
Ответить в эту темуОткрыть новую тему
> Разработка findcolor, findimage, Pure lua
Cockney
сообщение 13.9.2022, 19:30
Сообщение #541


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21063
Пользователь №: 16.156



Что значит не хочет ? не может вернуть dc или скрин битый выходит потом ? На сколько помню нет смысла работать с directx графикой через набор getdc/createbitmap/bitblt и т.п. т.к. графика идет через карточку и для винды не доступна по сути.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 13.9.2022, 19:45
Сообщение #542


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27724
Пользователь №: 11.279



dc не возвращает если в настройках игры включен 12 dx, но на 11 шуршит норм.

Если не через dc, то через что?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 13.9.2022, 19:58
Сообщение #543


********

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 не создает окно - возможно ситуация как с хромом, где то висит мастер окно, а внутри, как вкладки, рисуются окна, которые потом просто композируются при выводе
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 14.9.2022, 17:56
Сообщение #544


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21063
Пользователь №: 16.156



Еще одна мысль пришла. А ты после переключения на дх12 заново делаешь поиск окна ?
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 15.9.2022, 3:59
Сообщение #545


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27724
Пользователь №: 11.279



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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 16.9.2022, 14:15
Сообщение #546


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27724
Пользователь №: 11.279



Потестил... Результат очень странный...
Работает ровно 1 раз. Т.е. цвет снимает, но последующие попытки вызова GetDC возвращают 0. Учитывая некоторую специфику моей реализации я получал вечный скриншот. getimage фэйлился потихому, а финды это не смущало и они искали в старом захвате. Было весело (IMG:style_emoticons/default/smile.gif)


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 17.9.2022, 8:30
Сообщение #547


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21063
Пользователь №: 16.156



Цитата(DarkMaster @ 16.9.2022, 14:15) *

Потестил... Результат очень странный...
Работает ровно 1 раз. Т.е. цвет снимает, но последующие попытки вызова GetDC возвращают 0. Учитывая некоторую специфику моей реализации я получал вечный скриншот. getimage фэйлился потихому, а финды это не смущало и они искали в старом захвате. Было весело (IMG:style_emoticons/default/smile.gif)



А releasedc до очередного getdc вызывается ?

Учти еще что полученный dc можно юзать только в том же потоке откуда был вызов getdc
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 17.9.2022, 12:15
Сообщение #548


***********

Модератор 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 17.9.2022, 16:56
Сообщение #549


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21063
Пользователь №: 16.156



C.SelectObject(hdcMemDC,hbmScreen)

При первом вызове вернет объект, который уже выбран в hdc. Перед дропом всех хендлов нужно вызвать C.SelectObject(hdcMemDC, FIRST_CALL_VALUE). Не говорю что поможет в конкретно твоей ситуации, но это вроде как правильно делать.
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 17.9.2022, 19:39
Сообщение #550


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27724
Пользователь №: 11.279



Т.е. мне нужно сделать:
local objBackup = C.SelectObject(hdcMemDC,hbmScreen)
...
C.SelectObject(hdcMemDC, objBackup)
C.ReleaseDC(method, hdcWindow)
C.DeleteObject(hdcMemDC)
C.DeleteObject(hbmScreen)
?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 18.9.2022, 2:43
Сообщение #551


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21063
Пользователь №: 16.156



Цитата(DarkMaster @ 17.9.2022, 19:39) *

Т.е. мне нужно сделать:
local objBackup = C.SelectObject(hdcMemDC,hbmScreen)
...
C.SelectObject(hdcMemDC, objBackup)
C.ReleaseDC(method, hdcWindow)
C.DeleteObject(hdcMemDC)
C.DeleteObject(hbmScreen)
?



Да
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 11.12.2023, 18:29
Сообщение #552


***********

Модератор 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 11.12.2023, 18:56
Сообщение #553


***********

Модератор 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
yodich
сообщение 11.12.2023, 21:00
Сообщение #554


***

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 строк)

// Финдимидж покрыт координатными тестами. НЕ цветовыми. Девиэйшн только руками прогнан во время написания был.


ты фатит дразнться, уже пол года жду оригинал)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.12.2023, 6:00
Сообщение #555


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27724
Пользователь №: 11.279



мне тесты надо чтобы релизить. Нужно убрать косяки.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 12.12.2023, 10:08
Сообщение #556


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21063
Пользователь №: 16.156



Я один не понял, как пишутся тесты без тестируемого кода ? Или задача просто базу собрать изображений ?

В код не шибко вникал, но почему бы не использовать что то типа https://github.com/bluebird75/luaunit
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 12.12.2023, 10:29
Сообщение #557


***********

Модератор 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 17.12.2023, 14:43
Сообщение #558


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21063
Пользователь №: 16.156



Теоретический вопрос - getimage возвращает указатель на картинку как есть, или на картинку с некоей областью со всех сторон по размеру искомой картинки для поиска самых краев ? или это только файнд так делает у себя внутри ?
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 17.12.2023, 17:57
Сообщение #559


***********

Модератор 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____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 17.12.2023, 18:51
Сообщение #560


********

Master
Сообщений: 1.395
Регистрация: 22.6.2013
Группа: Пользователи
Наличность: 21063
Пользователь №: 16.156



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

ага, это вот оно вроде

https://forum.uokit.com/index.php?s=&sh...st&p=442986

следовательно то вопрос основной в том, а как пилот края такие обрабатвает-то, там постоянные проверки на выход за область памяти, они же перф гробят
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

30 страниц V « < 26 27 28 29 30 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 26.4.2024, 18:04
Designed by Nickostyle