Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ Преобразование Цветов Dec -> Rgb (hex), Нахождение Диапазонов

Автор: Zeleax 20.8.2011, 10:37

В связи с тем, что гугл с какого-то перепугу прикрывал мой https://sites.google.com/site/leaxplace/ за нарушение условий использования (х.з. каких) то я на всякий случай выложил ссылки на свои файлы и на этот форум (файлы лежат на серверах iFolder)

избегаем диапазонов с помощью поиска статичных точек

https://forum.uokit.com/index.php?showtopic=27054&hl=%F1%F2%E0%F2%E8%F7

https://forum.uokit.com/index.php?act=Attach&type=post&id=1354 (рекомендуется)
Таблица Excel для разложения десятичного цвета (DecColor) на RGB-каналы
Позволит быстро определить диапазон цветов, который необходимо задать для проверок (поиска).

http://ifolder.ru/25284661
Импортирует текстовый файл с десятичными значениями цветов, затем экспортирует эти же значения, но уже в шестнадцатеричном формате RGB и отсортированные в порядке возрастания. Для работы требует установленную библиотеку .Net FrameWork 3.5

Для обработки вам необходимо будет создать файлик, в котором будут содержаться возможные цвета. Сделать его можно следующим скриптом:

Код
// Автор скрипта DarkMaster
wait 5s // Делаем паузу, чтобы развернуть нужное приложение и навести мышь на нужную точку.
set timer
set #n 1
get mouse_pos #x #y
while timer < 20000 // Собираем все цвета в выбранной точке на протяжении 20 секунд.
    get  color #colorForArr #x, #y
    set %colorArr [#n] #colorForArr // Напрямую массив использовать нельзя.
    set #n #n + 1
end_while
save_array %colorArr d:\color.txt
alarm // Подаем звуковой сигнал об окончании работы скрипта.
stop_script


****************

Таблица Excel более практична и удобна, так как в ней виден каждый RGB канал в десятичном виде (и сразу видно минимальное и максимальное значение каждого канала).


Прикрепленные файлы
Прикрепленный файл  Dec2RGB_v2.2.2.rar ( 5,62 килобайт ) Кол-во скачиваний: 2312

Автор: ДЖОНИ 3.9.2011, 19:01

Можно ли к этому скрипту добавить чтоб он ещё координату точки отмечал?

Автор: DarkMaster 3.9.2011, 19:27

всмысле? Там везде одна и та же точка будет. Координата снимается один раз перед началом сбора цветов.
Можно закончить скрипт вот так:
set %colorArr [#n 1 ] #x
set %colorArr [#n 2 ] #y
save_array %colorArr d:\color.txt
alarm // Подаем звуковой сигнал об окончании работы скрипта.

В конце текстового файла будут координаты.

Автор: Zeleax 12.11.2011, 9:44

Dec2RGB v.2.2
- исправил опечатку в формуле в одной ячейке (B4);
- добавил ячейки с отображением минимального и максимального цветов в десятичном виде (собранные из крайних значений отдельных каналов).

Автор: avgur 30.8.2012, 14:34

Дайте пожалуйста формулы (желательно в пилото-понимаемом виде) для вычисления
R =
G =
B =
каналов десятичного цвета. Я пытался понять ее из таблицы екселя, но не шарю в синтаксисе написания экселевских формул.
Просто возникла необходимость в скрипте гет-колорить цвет пиксела (гет-колор в RGB то сразу не может), а потом файнд-колорить участок на наличие "похожих" пикселов (я планирую выставить диапазоны в RGB, добавив +-5 к значению каждого или какого-то одного канала).

Автор: DarkMaster 30.8.2012, 16:08

R=rgbdec-rgbDec/256*256
G=(rgbDec-rgbDec/256/256*256*256)/256
B=rgbDec/256/256

Отдельно хочу заметить, что в пилоте десятичный цвет в формате BGR, а не RGB.

Автор: avgur 30.8.2012, 16:28

Спасибо.
Только G-канал не верно считает, остальные верно.

например для цвета 6956042

Код
set #rgbdec 6956042
set #R #rgbdec - #rgbdec / 256 * 256
set #G #rgbdec - #rgbdec / 256 / 256 * 256 * 256
set #B #rgbdec / 256 / 256
msg R#R G#G B#B
end_script

G должно быть равно 36, а пишет 9226

Автор: DarkMaster 30.8.2012, 16:45

раздели на 256

Автор: avgur 30.8.2012, 16:51

да спасибо, уже допер, посчитал методом тыка smile.gif
set #G (#rgbdec - #rgbdec / 256 / 256 * 256 * 256) / 256

Автор: Andrei777 21.11.2012, 21:02

правильно ли я высчитал RGB?

set #rgbdec 16713215
set #R #rgbdec - #rgbdec / 256 * 256
set #G (#rgbdec - #rgbdec / 256 / 256 * 256 * 256) / 256
set #B #rgbdec / 256 / 256
msg R#R G#G B#B
end_script

R-255 G-5 B-255

Автор: DarkMaster 21.11.2012, 21:16

да

Автор: Destruction 21.11.2012, 21:27

Цитата(Andrei777 @ 21.11.2012, 22:02) *

правильно ли я высчитал RGB?

set #rgbdec 16713215
set #R #rgbdec - #rgbdec / 256 * 256
set #G (#rgbdec - #rgbdec / 256 / 256 * 256 * 256) / 256
set #B #rgbdec / 256 / 256
msg R#R G#G B#B
end_script

R-255 G-5 B-255

Вы всегда можете проверить результаты своих вычислений в калькуляторе.

1. Открываем калькулятор, тыкаем "Вид" > "Программист" (в XP кажется назывался "Инженерный").
2. Вставляем нужное число.
3. Выбираем пункт "Hex", число будет преобразовано в Hex (16-ричная система счисления).

Видим: FF05FF (наиболее часто именно в таком формате цвет и записывается, например можно скормить в фотошоп).

Поочередно переводя "FF", "05", "FF" обратно в десятичный формат получите нужные цифры.

Автор: Andrei777 21.11.2012, 21:27

Используя описанный метот:

Добавил в 'findcolor' погрешность оттенка. Указывается в %. Слегка изменился синтаксис команды.
пример: есть погрешность 3%. точка имеет цвет 100 120 130, 255*3%=7, соответственно 100+/-7. При этом все цвета в пределах (93 113 123)-(107 127 137) будут считаться совпадением.

Задаю к своему R-255 G-5 B-255 погрешность в 3% получаю следующий диапозон, с учетом того, что 256 - это верхняя планка:

(248 0 248)-(256 12 256)

Добавляю в свой макрос, получаю:

:start

set $a 0
set $a findcolor (1807 79 1835 103 1 1 ((248 0 248)-(256 12 256)) %ResultArray 2 1)
if $a > 0
send 3 //(стоит скилл атаки)
else
send escape
end_if

goto start

Правильно ли?

Автор: DarkMaster 21.11.2012, 21:31

Нет. Нарушен синтаксис.
Внутри скобок должно быть примерно так:
Примеры задания 'RequiredColor':

'84235' - точный цвет
'84235-86027' - диапазон цветов
'R(11)' - значение красного канала = 11, остальные не проверяются
'G(73-80)' - диапазон значений зеленого канала, остальные не проверяются
'R(11)+G(73-80)+B(1)' - заданы значения по всем каналам
'84235, R(0), R(11)+G(73-80)+B(1)' - комбинированное указание искомых цветов
http://uopilot.tati.pro/index.php?title=Findcolor

Автор: Andrei777 21.11.2012, 22:26

т.е. диапозон я посчитал правильно (248 0 248)-(256 12 256), но не правильно записал в макрос?

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

Автор: DarkMaster 21.11.2012, 22:37

Цитата
т.е. диапозон я посчитал правильно (248 0 248)-(256 12 256), но не правильно записал в макрос?

Цитата
'G(73-80)' - диапазон значений зеленого канала, остальные не проверяются
'R(11)+G(73-80)+B(1)' - заданы значения по всем каналам

Автор: Andrei777 21.11.2012, 22:42

при всем уважении и понимании, что я в ваших глазах ламер и мало что понимаю.

Прошу написать: "вы посчитали диапозон правильно (или не правильно) в вашем случае нужно было посчитать так то, написать так то ..... ; потому что ..... ".

Автор: DarkMaster 21.11.2012, 22:49

(R(248-256)+G(0-12)+B(248-256))
ну потому, что синтаксис такой... ну вот так оно задеатся... честно я не знаю как это объяснить. я приводил выше несколько примеров способов задания цвета, они могут комбинироваться. Только значения подставляй и все. Кроме как медитировать на строчки из вики я не могу вам ничего предложить и пояснить. Просто нечего пояснять... Надо понять то, что там написано, а понять за вас я не могу. Если что-то не ясно в примерах указывайте точное место, спрашивайте, а так я просто не понимаю, что вам объяснять.

Автор: Andrei777 21.11.2012, 22:59

Такого пояснения достаточно.

Вставил в макрос, получилось:
:start

set $a 0
set $a findcolor (1164 73 1192 104 1 1 (R(248-256)+G(0-12)+B(248-256)) %ResultArray 2 1)
if $a > 0
send 3 //(стоит скилл атаки)
else
send escape
end_if

goto start

Все равно жмакает эскейп, т.е. цвет не находит. Что еще я мог не правильно посчитать или записать?

Автор: DarkMaster 21.11.2012, 23:13

в 2.32 расширился синтаксис(на вике висит еще старый)
'set $a FindColor (StartX StartY EndX EndY ShiftX ShiftY (RequiredColor) ResultArray [type [count [deviation]]] [abs])'
теперь можно делать еще проще:
set $a findcolor (1164 73 1192 104 1 1 (16713215) %ResultArray 2 1 10)
10 - % оттенка.
Я вас послал сюда, чтобы вы собрали побольше оттенков точки скриптом из шапки и могли потом обработать эти данные скриптом или таблицами. Чтобы вы смогли узнать как вообще выглядит эта точка в ргб и как она изменяется, а не в слепую перебирали варианты. Но мысль ваша свернула не туда, а я чет только сейчас вспомнил с чего все началось.

Автор: Andrei777 21.11.2012, 23:33

Вставил в макрос, получилось:

:start

set $a 0
set $a findcolor (1167 78 1195 105 1 1 (16713215) %ResultArray 2 1 10)
if $a > 0
send 3 //(стоит скилл атаки)
else
send escape
end_if

goto start

Сбрасывает таргет всё равно. Пробовал задать и 30%, 50% и 100, сбрасывает. Область указал верно (координаты левой верхней и правой нижней).
А задача банальна, что бы чар сбрасывал таргеты находящиеся за пределами указанной области, и оставлял таргет, если он находится в её границах.

Автор: DarkMaster 21.11.2012, 23:50

А окно привязываете? При 100 ну никак не должно сбрасывать. Сделайте log $a. Он походу ошибку возвращает.

Запуск от админа?

Автор: Andrei777 22.11.2012, 0:01

Окно привязываю (и контрлА жмакаю, и в разделе W выбираю линейку)
Запускал от админа

Макрос

:start

set $a 0
set $a findcolor (1167 78 1195 105 1 1 (16713215) %ResultArray 2 1 100)
log $a
if $a > 0
send 3 //(стоит скилл атаки)
else
send escape
end_if

goto start

1:00:20 5 (Сброс таргета.txt, 4): 0
1:00:21 5 (Сброс таргета.txt, 4): 0
1:00:21 5 (Сброс таргета.txt, 4): 0
1:00:22 5 (Сброс таргета.txt, 4): 0
1:00:23 5 (Сброс таргета.txt, 4): 0
1:00:24 5 (Сброс таргета.txt, 4): 0
1:00:25 5 (Сброс таргета.txt, 4): 0
1:00:25 5 (Сброс таргета.txt, 4): 0
1:00:26 5 (Сброс таргета.txt, 4): 0
1:00:27 5 (Сброс таргета.txt, 4): 0
1:00:28 5 (Сброс таргета.txt, 4): 0
1:00:28 5 (Сброс таргета.txt, 4): 0
1:00:29 5 (Сброс таргета.txt, 4): 0
1:00:30 5 (Сброс таргета.txt, 4): 0
1:00:31 5 (Сброс таргета.txt, 4): 0
1:00:31 5 (Сброс таргета.txt, 4): 0
1:00:32 5 (Сброс таргета.txt, 4): 0
1:00:33 5 (Сброс таргета.txt, 4): 0
1:00:34 5 (Сброс таргета.txt, 4): 0
1:00:35 5 (Сброс таргета.txt, 4): 0
1:00:35 5 (Сброс таргета.txt, 4): 0
1:00:36 5 (Сброс таргета.txt, 4): 0
1:00:37 5 (Сброс таргета.txt, 4): 0
1:00:38 5 (Сброс таргета.txt, 4): 0
1:00:38 5 (Сброс таргета.txt, 4): 0
1:00:39 5 (Сброс таргета.txt, 4): 0
1:00:40 5 (Сброс таргета.txt, 4): 0
1:00:41 5 (Сброс таргета.txt, 4): 0

Автор: DarkMaster 22.11.2012, 0:32

чет я прикола не пойму. у меня вообще ничего не ищет... завтра буду разбираться. сейчас спать. попробуй версию постарше, может что-то отломали. На 2.31 и 2.32 завести не смог. Либо я сильно туплю и тут правда есть ошибка.

set $a 0
set $a findcolor (187, 19 341, 110 1 1 (16777215) %arr 2 1)
log $a

работает. ваш код не работает. ниче не понимаю. Но % отклонения так и не смог завести. Попробуйте диапазоны с разложением на каналы, как я писал. Но сам код с нуля напишите. Может где-то букву русскую пробили или еще что-нибудь подобное.

Автор: Zeleax 22.11.2012, 8:33

А все довольно просто: похоже deviation в findcolor не работает...
Погонял у себя - ноль реакции. Что со значком процента (когда оно просто игнорится), что без. Так что нужно указывать в виде диапазона

Автор: DarkMaster 22.11.2012, 11:35

Дык я в его код вставлял белый цвет, искал в окне пилота - не находит, даже если убрать deviation.

Автор: Andrei777 22.11.2012, 12:25

- Попробуйте диапазоны с разложением на каналы, как я писал.

С разложением макрос

:start

set $a 0
set $a findcolor (1157 65 1203 112 1 1 (R(180-255)+G(0-120)+B(180-255)) %ResultArray 2 1)
log $a
if $a > 0
send 3 //(стоит скилл атаки)
else
send escape
end_if

goto start

Работает. Диапозон задавал методом подбора, исходя из вычесленного ранее R-255 G-5 B-255, т.е. постепенно увеличивал диапозон по этим трем показателям. Единственная обнаруженная трабла заключается в том, что на радаре Ла2 есть перекрестие, которое закрывает розовую точку моба, если он находится на нём (есть предположения как это обойти? пробовал задавать более широкий диапозон, не помогло). Во всех остальных случаях работает корректно.

Финколор с процентами по прежнему не работает (набрал макрос заново ручками).

:start

set $a 0
set $a findcolor (1157 65 1203 112 1 1 (16713215) %ResultArray 2 1 100)
log $a
if $a > 0
send 3 //(стоит скилл атаки)
else
send escape
end_if

goto start

Автор: Andrei777 22.11.2012, 12:40

Смею предположить, почему
set $a findcolor (1157 65 1203 112 1 1 (16713215) %ResultArray 2 1 10)

не работает.
В данном случае R-255 G-5 B-255, когда система начинает считать -/+10%, а это примерно 25, то получается R(230-280) G(-20-30) B(230-280). А если я правильно начитался, то диапозон может быть только от 0-255, и когда система видет цифры типо 280 или (-20), то работает не корректно. Я пробовал задавать диапозон более 255 на работающем макросе, он сразу переставал работать корректно, всегда выдавал "0"

Автор: DarkMaster 22.11.2012, 12:47

Цитата
Единственная обнаруженная трабла заключается в том, что на радаре Ла2 есть перекрестие, которое закрывает розовую точку моба, если он находится на нём (есть предположения как это обойти? пробовал задавать более широкий диапозон, не помогло).

Возьмите скрипт из шапки и посмотрите какие там бывают цвета при перекрытии крестом, куски все равно должно быть видно. Можно задать два диапазона.
Вообще при сложных случаях, которые не поддаются нормальному анализу(например по море с волнами и бликами различить время суток), я задаю очень большой диапазон, потом начинаю уменьшать один из каналов и смотреть на флуд лога(нашел/не нашел). Если все еще находит - еще уменьшаем, нет - чуть увеличиваем. Ну и так с каждым каналом с минимальным и максимальным значениями.

Автор: Andrei777 22.11.2012, 14:11

Именно так я и задаю диапозон - играя с его размером в каналах. На это нужно много времени, так что займусь вечером.

Автор: Zeleax 16.1.2013, 22:47

Обновил версию Excel-файла- поправил ссылки, оформление

Автор: MaXiS 15.9.2015, 22:32

Функция погрешности в % работает. Проверил на v2.35.
set $a findcolor (513 642 513 642 1 1 (11599871) %ResultArray 2 1 5)

Это формула для экселя в 1м посту для определения среднего значения в 10 значном цвете.
=$A$2-($A$2-$A$1)/2

Автор: Andrey1984 21.9.2016, 23:43

Здравствуйте, подскажите, как написать скрипт чтобы пилот определял диапазон цвета, например зеленый, он постоянно разный, нужно задать диапазон. Как переписать данный скрипт который находит только четко заданный цвет, чтобы он находил диапазон зеленого цвета?
set #xcentr 843
set #ycentr 141

//искомый диапазон цвета(зеленый)
set #color1 47367
set #color2 37888

// радиус к которому должен принадлежать таргет
set #r 9
set #r2 #r * 2


set #x #xcentr - #r //начальная координата Х
set #y #ycentr - #r //начальная координата Y
set #xmax #xcentr + #r //конечная координата x
set #ymax #ycentr + #r //конечная координата
set #a findcolor (#x, #y #xmax, #ymax 1 1 (#color1-#color2) %arr 2 )
if #a > 0
set #a findcolor (#x, #y #xmax, #ymax 1 1 (#color1-#color2) %arr 2 )
goto ddnedaleko
else
set #x 811 + random(100)
set #y 619 + random(240)
(нажатие мыши)
wait 300 + random (2000)
(действие)
wait 4800 + random (2000)
hint (15 ( сообщение #a ))
end_if

Автор: cirus 22.9.2016, 2:35

http://uopilot.tati.pro/index.php?title=Findcolor
Читайте про deviation, смотрите пример 5.

Автор: Andrey1984 22.9.2016, 11:00

Цитата(cirus @ 22.9.2016, 2:35) *

http://uopilot.tati.pro/index.php?title=Findcolor
Читайте про deviation, смотрите пример 5.

Спасибо, только мне не понятно как сделать поиск диапазона погрешности цвета в ограниченном квадрате например на радаре игры? // Пример 5
// Использование отклонения цвета - deviation
set #d findcolor (403, 138 973, 502 1 1 (3949430) %arr 2 -1 3) // 2 - это тип поиска
// -1 - количество найденных пикселей (искать все)
// 3 - погрешность оттенка
if #d > 0 // если найден нужный цвет
kleft %arr [1 1], %arr [1 2]
wait 2000
else
log Цвет не найден!
end_if

Вот мне не понятны эти координаты: set #d findcolor (403, 138 973, 502 , -----, если мне нужен поиск в квадрате по координатам 1807, 130 цвет - 3243636 то как это правильно написать в примере 5?

Автор: cirus 22.9.2016, 11:08

Оставляете ваш код как есть, указываете в findcolor погрешность оттенка.

Код
set #a findcolor (#x, #y #xmax, #ymax 1 1 (#color1-#color2) %arr 2 -1 3)

Подбираете нужную погрешность меняя 3.

Автор: Andrey1984 22.9.2016, 11:26

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

Автор: Andrey1984 22.9.2016, 11:45

Цитата(cirus @ 22.9.2016, 11:08) *

Оставляете ваш код как есть, указываете в findcolor погрешность оттенка.
Код
set #a findcolor (#x, #y #xmax, #ymax 1 1 (#color1-#color2) %arr 2 -1 3)

Подбираете нужную погрешность меняя 3.

Огромное спасибо! добавил в готовый скрипт -1 3 и все заработало! Супер! cool.gif я год уже как мучился, давно надо было тут вопрос задать rolleyes.gif

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)