|
|
|
Цветокоррекция |
|
|
DarkMaster |
13.2.2023, 16:27
|
Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27680
Пользователь №: 11.279
|
Тут важно понимать о чем именно идет речь. Если речь идет о картинках, то в findcolor/findimage есть параметр deviaton который позволяет очень мягко сглаживать оттенки. В приведенном вам примере всегда будет существовать проблема пограничных значений. Например значения каналов 127 и 128 улетят в "разные" цвета. deviaton дает поиск +/- по каналу. Скажем при deviaton 3 и цвете 127 корректными будут цвета 127 +/- (2.55*3). Если идет речь о колор, то из коробки прозрачного сравнения таким образом нет. Мой вариант решения данного вопроса относительно единичного цвета. Код local ext = {} -- Равен ли цвет dynamic_color -- цвету static_color -- с учетом погрешности deviaton -- Deviation задается в виде абсолютного значения, -- где 1 = +/-1, 5 = +/-5 и т.д. -- deviation применяется ко второму цвету. -- второй цвет считается эталоном. -- Первый цвет может быть задан числом -- или координатами (будет вызван color()) ext.color_compare_a = function(dynamic_color, static_color, deviation, tmp) if tmp then dynamic_color = color(dynamic_color, static_color) static_color = deviation deviation = tmp end
local r1, g1, b1 = ext.color_to_rgb(dynamic_color) local r2, g2, b2 = ext.color_to_rgb(static_color) if r2-deviation <= r1 and r2+deviation >= r1 and g2-deviation <= g1 and g2+deviation >= g1 and b2-deviation <= b1 and b2+deviation >= b1 then return true else return false end end
-- Равен ли цвет dynamic_color -- цвету static_color -- с учетом погрешности deviaton -- Deviation задается в виде множетеля, -- где 0.1 = +/-10%, 0.5 = +/-50% и т.д. -- deviation применяется ко второму цвету. -- второй цвет считается эталоном. -- Первый цвет может быть задан числом -- или координатами (будет вызван color()) ext.color_compare_r = function(dynamic_color, static_color, deviation) if tmp then dynamic_color = color(dynamic_color, static_color) static_color = deviation deviation = tmp end local d_min = 1 - deviation local d_max = 1 + deviation
local r1, g1, b1 = ext.color_to_rgb(dynamic_color) local r2, g2, b2 = ext.color_to_rgb(static_color) if r2*d_min <= r1 and r2*d_max >= r1 and g2*d_min <= g1 and g2*d_max >= g1 and b2*d_min <= b1 and b2*d_max >= b1 then return true else return false end end
-- Равен ли цвет dynamic_color -- цвету static_color -- с учетом погрешности deviaton -- Deviation задается в виде множетеля, -- отношеня каналов (режим теней). -- deviation применяется ко второму цвету. -- второй цвет считается эталоном. -- Первый цвет может быть задан числом -- или координатами (будет вызван color()) ext.color_compare_s = function(dynamic_color, static_color, deviation) if tmp then dynamic_color = color(dynamic_color, static_color) static_color = deviation deviation = tmp end local d_min = 1 - deviation local d_max = 1 + deviation
local r2, g2, b2 = ext.color_to_rgb(dynamic_color) local r1, g1, b1 = ext.color_to_rgb(static_color) local rg_min = r2 / g2 * d_min local gb_min = g2 / b2 * d_min local br_min = b2 / r2 * d_min local rg_max = (r2+2) / g2 * d_max local gb_max = (g2+2) / b2 * d_max local br_max = (b2+2) / r2 * d_max r1 = r1+1 g1 = g1+1 b1 = b1+1 local rg_static = r1 / g1 local gb_static = g1 / b1 local br_static = b1 / r1
if rg_min <= rg_static and rg_max >= rg_static and gb_min <= gb_static and gb_max >= gb_static and br_min <= br_static and br_max >= br_static then return true else return false end end По поводу конвертации изображения: Код ext.get_pix = function(img, x, y) local r, g, b, dec, bright local pix = rmem("unsigned char*", img[1]) b = pix[ img[4]*y + x*3 ] g = pix[ img[4]*y + x*3+1] r = pix[ img[4]*y + x*3+2] dec = b*255*255 + g*255 + r bright = b + g + r return {r, g, b, dec, bright} end
ext.pix_painting = function(img, x, y, color) local r, g, b = ext.color_to_rgb(color) local pix = rmem("unsigned char*", img[1]) pix[ img[4]*y + x*3 ] = b pix[ img[4]*y + x*3+1] = g pix[ img[4]*y + x*3+2] = r end
ext.black_and_white = function(img, w, h, l, edge) for j = 0, h - 1 do for i = 0, w - 1 do if ext.get_pix({img, w, h, l}, i, j)[5] > edge then ext.pix_painting({img, w, h, l}, i, j, 0xFFFFFF) else ext.pix_painting({img, w, h, l}, i, j, 0x000000) end end end return img end Вызывать black_and_white, где img - адрес в памяти с изображением, w - ширина в пикселях, h - высота в пикселях, l - длина линии в байтах с выравниванием, edge - граница по которой делать конвертацию. Все параметры изображения вам даст getimage, edge - исключительно ваша фантазия, допустимые значения 0-765, фактически это сумма каналов по которой будет определяться в белое уводить или в черное.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
lyvrik |
13.2.2023, 19:22
|
Registred
Сообщений: 8
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 0
Пользователь №: 20.487
Возраст: 17
|
Цитата(DarkMaster @ 13.2.2023, 16:27) Тут важно понимать о чем именно идет речь. Если речь идет о картинках, то в findcolor/findimage есть параметр deviaton который позволяет очень мягко сглаживать оттенки. В приведенном вам примере всегда будет существовать проблема пограничных значений. Например значения каналов 127 и 128 улетят в "разные" цвета. deviaton дает поиск +/- по каналу. Скажем при deviaton 3 и цвете 127 корректными будут цвета 127 +/- (2.55*3). Если идет речь о колор, то из коробки прозрачного сравнения таким образом нет. Мой вариант решения данного вопроса относительно единичного цвета. Код local ext = {} -- Равен ли цвет dynamic_color -- цвету static_color -- с учетом погрешности deviaton -- Deviation задается в виде абсолютного значения, -- где 1 = +/-1, 5 = +/-5 и т.д. -- deviation применяется ко второму цвету. -- второй цвет считается эталоном. -- Первый цвет может быть задан числом -- или координатами (будет вызван color()) ext.color_compare_a = function(dynamic_color, static_color, deviation, tmp) if tmp then dynamic_color = color(dynamic_color, static_color) static_color = deviation deviation = tmp end
local r1, g1, b1 = ext.color_to_rgb(dynamic_color) local r2, g2, b2 = ext.color_to_rgb(static_color) if r2-deviation <= r1 and r2+deviation >= r1 and g2-deviation <= g1 and g2+deviation >= g1 and b2-deviation <= b1 and b2+deviation >= b1 then return true else return false end end -- Равен ли цвет dynamic_color -- цвету static_color -- с учетом погрешности deviaton -- Deviation задается в виде множетеля, -- где 0.1 = +/-10%, 0.5 = +/-50% и т.д. -- deviation применяется ко второму цвету. -- второй цвет считается эталоном. -- Первый цвет может быть задан числом -- или координатами (будет вызван color()) ext.color_compare_r = function(dynamic_color, static_color, deviation) if tmp then dynamic_color = color(dynamic_color, static_color) static_color = deviation deviation = tmp end local d_min = 1 - deviation local d_max = 1 + deviation
local r1, g1, b1 = ext.color_to_rgb(dynamic_color) local r2, g2, b2 = ext.color_to_rgb(static_color) if r2*d_min <= r1 and r2*d_max >= r1 and g2*d_min <= g1 and g2*d_max >= g1 and b2*d_min <= b1 and b2*d_max >= b1 then return true else return false end end -- Равен ли цвет dynamic_color -- цвету static_color -- с учетом погрешности deviaton -- Deviation задается в виде множетеля, -- отношеня каналов (режим теней). -- deviation применяется ко второму цвету. -- второй цвет считается эталоном. -- Первый цвет может быть задан числом -- или координатами (будет вызван color()) ext.color_compare_s = function(dynamic_color, static_color, deviation) if tmp then dynamic_color = color(dynamic_color, static_color) static_color = deviation deviation = tmp end local d_min = 1 - deviation local d_max = 1 + deviation
local r2, g2, b2 = ext.color_to_rgb(dynamic_color) local r1, g1, b1 = ext.color_to_rgb(static_color) local rg_min = r2 / g2 * d_min local gb_min = g2 / b2 * d_min local br_min = b2 / r2 * d_min local rg_max = (r2+2) / g2 * d_max local gb_max = (g2+2) / b2 * d_max local br_max = (b2+2) / r2 * d_max r1 = r1+1 g1 = g1+1 b1 = b1+1 local rg_static = r1 / g1 local gb_static = g1 / b1 local br_static = b1 / r1
if rg_min <= rg_static and rg_max >= rg_static and gb_min <= gb_static and gb_max >= gb_static and br_min <= br_static and br_max >= br_static then return true else return false end end По поводу конвертации изображения: Код ext.get_pix = function(img, x, y) local r, g, b, dec, bright local pix = rmem("unsigned char*", img[1]) b = pix[ img[4]*y + x*3 ] g = pix[ img[4]*y + x*3+1] r = pix[ img[4]*y + x*3+2] dec = b*255*255 + g*255 + r bright = b + g + r return {r, g, b, dec, bright} end
ext.pix_painting = function(img, x, y, color) local r, g, b = ext.color_to_rgb(color) local pix = rmem("unsigned char*", img[1]) pix[ img[4]*y + x*3 ] = b pix[ img[4]*y + x*3+1] = g pix[ img[4]*y + x*3+2] = r end
ext.black_and_white = function(img, w, h, l, edge) for j = 0, h - 1 do for i = 0, w - 1 do if ext.get_pix({img, w, h, l}, i, j)[5] > edge then ext.pix_painting({img, w, h, l}, i, j, 0xFFFFFF) else ext.pix_painting({img, w, h, l}, i, j, 0x000000) end end end return img end Вызывать black_and_white, где img - адрес в памяти с изображением, w - ширина в пикселях, h - высота в пикселях, l - длина линии в байтах с выравниванием, edge - граница по которой делать конвертацию. Все параметры изображения вам даст getimage, edge - исключительно ваша фантазия, допустимые значения 0-765, фактически это сумма каналов по которой будет определяться в белое уводить или в черное. Конечно немного сложновато из за того что я не многу найти такие команды какие используются у тебя в коде, не знаю может это у тебя переменные. Можно как нибудь поподробнее ?
|
|
|
|
DarkMaster |
13.2.2023, 20:13
|
Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27680
Пользователь №: 11.279
|
https://uopilot.uokit.com/wiki/index.php?ti...Findimage_(Lua)https://uopilot.uokit.com/wiki/index.php?ti...=Getimage_(Lua)все color_compare - это мои функции и я скинул именно функции, а не их вызов. Перед каждой написано что и как она делает. black_and_white тоже фунция, которая тянет за собой еще две, но вам это особо не надо понимать. Ваша задача скопировать этот код, вставить в скрипт и вызывать по мере надобности. Код -- белая ли точка с погрешностью 5 на каждый канал. if ext.color_compare_a(color(123, 321), 0xFFFFFF, 5) then msg"white" end
-- захватить изображение local img, w, h, l = getimage(100, 100, 200, 200) -- конвертируем в монохромное по границе 300. 0-300 = черный, 301-765 = белый ext.black_and_white(img, w, h, l, 300) -- ищем local result = findimage(x1, y1, x2, y2, {[[path]]}, img, acc, count, deviation) if result then -- если нашли кликаем left(result[1][1], result[1][2]) end
вообще очень сложно отвечать на вопрос "как-нибудь поподробнее". Я не знаю вашего уровня знаний языков программирования и луа в частности. Задавайте более конкретные вопросы либо пишите код который пробовали и не получилось. Без разницы какого качества будет этот код - смысл в том, что будет понятно, что вам нужно разъяснить. Сообщение отредактировал DarkMaster - 13.2.2023, 20:14
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
lyvrik |
13.2.2023, 20:26
|
Registred
Сообщений: 8
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 0
Пользователь №: 20.487
Возраст: 17
|
Цитата(DarkMaster @ 13.2.2023, 20:13) https://uopilot.uokit.com/wiki/index.php?ti...Findimage_(Lua)https://uopilot.uokit.com/wiki/index.php?ti...=Getimage_(Lua)все color_compare - это мои функции и я скинул именно функции, а не их вызов. Перед каждой написано что и как она делает. black_and_white тоже фунция, которая тянет за собой еще две, но вам это особо не надо понимать. Ваша задача скопировать этот код, вставить в скрипт и вызывать по мере надобности. Код -- белая ли точка с погрешностью 5 на каждый канал. if ext.color_compare_a(color(123, 321), 0xFFFFFF, 5) then msg"white" end
-- захватить изображение local img, w, h, l = getimage(100, 100, 200, 200) -- конвертируем в монохромное по границе 300. 0-300 = черный, 301-765 = белый ext.black_and_white(img, w, h, l, 300) -- ищем local result = findimage(x1, y1, x2, y2, {[[path]]}, img, acc, count, deviation) if result then -- если нашли кликаем left(result[1][1], result[1][2]) end
вообще очень сложно отвечать на вопрос "как-нибудь поподробнее". Я не знаю вашего уровня знаний языков программирования и луа в частности. Задавайте более конкретные вопросы либо пишите код который пробовали и не получилось. Без разницы какого качества будет этот код - смысл в том, что будет понятно, что вам нужно разъяснить. Извините за некорректный вопрос, я плохо знаю lua. Моя задача на данный момент это переписать код из одной программы в другую (из за того что здесь привязка к окну работает не криво ). Хочу задать вопрос ( в правилах не нашел ), разрешено ли оглашать программу в которой написан скрипт ( и сам скрипт) который я хочу переписать в UOPilot?
|
|
|
|
lyvrik |
14.2.2023, 17:33
|
Registred
Сообщений: 8
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 0
Пользователь №: 20.487
Возраст: 17
|
Цитата(DarkMaster @ 14.2.2023, 4:41) В правилах не написано, но я затираю через модерку. По факту название ничем в данном случае не поможет. Вы используете старый синтаксис. Пишите на lua. Для этого в нулевой строке должно быть: --lua по части луа если есть хоть небольшой опыт программирования: https://tylerneylon.com/a/learn-lua/более приземленная версия: https://uopilot.uokit.com/wiki/index.php?ti...D0%B8%D1%81_Luaв вашем случае финды нужно будет заменить на конструкцию из getimage black_and_white и после этого findimage. Как в примере выше указывал. Код который я скинул вам нужно поместить в шапку (можно в отдельный файл и подгружать через require, но давайте не спешить) Я делаю как вы и объясняете, но по непонятным мне причинам выскакивают ошибки при запуске кода (код брал из "более приземленная версия" ).
|
|
|
|
lyvrik |
16.2.2023, 1:06
|
Registred
Сообщений: 8
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 0
Пользователь №: 20.487
Возраст: 17
|
Так, я вообще не понимаю но у меня не работает скрипт в "стиле" --lua Код --lua local handle = findwindow ("Will To Live Online") local startX, startY, endX, endY = 0, 0, 1920, 1080 local path = [["\F.bmp"]] if handle then local arr, a = findimage (startX, startY, endX, endY, {path}, handle[1][1]) if a > 0 then log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2]) send217 ("f") else log ("Изображение не найдено") end else log("Окно не найдено") end
Я его запускаю без привязки к окну, он проигрывает только 0 строчку, а дальше не идет. Я делал wait (100) после каждой строки чтобы проверить он вообще работает или нет, оказалось что нет
|
|
|
|
DarkMaster |
16.2.2023, 5:48
|
Модератор UOPilot
Сообщений: 9.465
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27680
Пользователь №: 11.279
|
Цитата findimage (startX, startY, endX, endY, {path}, handle[1][1]) вы дергаете изображение по хэндлу. это работает не со всеми приложениями (вне зависимости луа это или нет). Так же иногда нужно бывает указать хэндл родительского окна. сделайте log(a) сразу после финдимиджа. может он с ошибкой падает, например, если путь указан неверно.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|