Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: Vlas on April 28, 2022, 03:25:59 PM
-
Здравствуйте.
наверняка у кого-то уже существует писаный код для:
1. снятие скрина с области экрана.
берем пиксели по очереди и ...
2. сравнение с заранее созданным массивом цветов пикселей "фона" (выкинули при дубле)
3. сравнение с массивом только что найденных цветов (выкинули при дубле)
4. вывод всех найденных цветов пикселей из области скрина списком с отсевом дублей
Цель получить список всех используемых цветов из скрина-примера для дальнейшего поиска объекта на экране.
я начинающий и даже казалось сделал все сам, но результаты поиска в итоговом файле все равно дублируются. не понимаю, где я зациклился, что у меня идут дубли.
-
покажите ваш код, ошибки вам исправят.
-
[
// анализ участка экрана с составлением списка цветов по пиксельно
LOGSHOW(1,1570,770)
LOGCLEAR()
TFCLEAR("input.txt", 0)
PXLREPLACE(0,0, $_xmax,$_ymax, -1, 0) // заливаем буфер черным
$a = 15 // размах захвата
STRSEPARATE(" 7035985, 7760481, 7035985", ",", $arr_color_fon) // создаем массив цветов фона
$size_arr_color_fon = ARRSIZE($arr_color_fon)
LOGWRITE("кол-воцветов фона - ", $size_arr_color_fon )
//ARRPUSH ($arr_color_fon, 255)
//$x
//$y
LCLICK(310,447) // 3801117
LCLICK(327,461) // 0
$x1 = 310 //0 //475
$y1 = 447 //0 //560
$x2 = 327 //30 //574
$y2 = 461 //30 //681
$arr_color = 0
//$arr_color_prb = 0
//$arr_color_fon
$pxl_prb = 0
$z =0
$n = 0
GETSCREEN
//COLORMODE(2)
WHILE($n < 1)
FOR($y = $y1, $y <= $y2)
LOGWRITE ("$y -", $y) //
FOR($x = $x1, $x <= $x2)
LOGWRITE ("$x -", $x)
inc ($z)
$c = PXL ($x, $y)
$d = 0
$flag = 0
FOR($d = 0, $d < $size_arr_color_fon)
//LOGWRITE ("$c -", $c) //цвет найденого пикселя
IF($c = $arr_color_fon[$d])
//LOGWRITE ("совпадение с фоном")
$flag = 0
else
FOR($e = 0, $e < ARRSIZE($arr_color))
IF($c = $arr_color[$e])
$flag = 0
//LOGWRITE ("совпадение с уже найденым")
ELSE
$flag = 1
END_IF
END_CYC
END_IF
IF($flag = 1)
ARRPUSH ($arr_color, $c)
LOGWRITE ("новый цвет - ", $c, " в списке - ", ARRSIZE($arr_color))
ELSE
//LOGWRITE ("совпало")// Если не верно
END_IF
END_CYC
END_CYC
END_CYC
LOGWRITE ("сквозное z = ", $z)
$n = 1
//UNDEFINE ($arr_color)
END_CYC
TFWRITEARR("input.txt", $arr_color)
LOGWRITE ("halt")
halt
]
-
// 30.04.2022
#name "Цель список цветов"
//Цель получить текстовый файл список всех используемых цветов
// анализ участка экрана с составлением списка цветов по пиксельно
//LOGSHOW(1,1570,770)
//LOGCLEAR()
// выбрать одиин из вариантов получения массива цветов
TFREADARR("список цветов.txt", $arr_color_fon) // создаем массив цветов фона из файла "список цветов.txt"
//STRSEPARATE("7035985,7760481", ",", $arr_color_fon) // создаем массив цветов фона из строки
//=============================================
//LCLICK(310,447) // 3801117
//LCLICK(327,461) // 0
$x1 = 310 //0 //475
$y1 = 447 //0 //560
$x2 = 327 //30 //574
$y2 = 461 //30 //681
$size_arr_color_fon = ARRSIZE($arr_color_fon)
LOGWRITE("в списке цветов фона - ", $size_arr_color_fon )
GETSCREEN
//COLORMODE(2)
FOR($y = $y1, $y <= $y2)
// LOGWRITE ("$y -", $y)
FOR($x = $x1, $x <= $x2)
// LOGWRITE ("$x -", $x)
inc ($z)
$c = PXL ($x, $y)
FOR($d = 0, $d < ARRSIZE($arr_color_fon))
IF($c = $arr_color_fon[$d])
$d= ARRSIZE($arr_color_fon)+100
END_IF
END_CYC
IF($d<ARRSIZE($arr_color_fon)+100)
ARRPUSH ($arr_color_fon, $c)
LOGWRITE ("x,y - ", $x,",", $y," цвет ", $c)
END_IF
END_CYC
END_CYC
LOGWRITE ("сквозное z = ", $z)
LOGWRITE("в списке цветов фона - ",ARRSIZE($arr_color_fon))
ARRSORT($arr_color_fon) //сортировка полученных цветов
TFCLEAR("список цветов",1) //удаление старого списка
TFWRITEARR("список цветов.txt", $arr_color_fon) //запись нового списка цветов , можно не удалять а записывать в новый файл
LOGWRITE ("Стоп")
halt
-
Огромное спасибо)
Всё отлично работает 8) , но всё "чуток" не так как я себе представлял...)))
можно уточнить? не могу понять смысл-логику 38й строки, и зачем $d увеличивается на 100 и именно на 100? отсюда не понимаю, что происходит от 41 строки.
-
Огромное спасибо)
Всё отлично работает 8) , но всё "чуток" не так как я себе представлял...)))
можно уточнить? не могу понять смысл-логику 38й строки, и зачем $d увеличивается на 100 и именно на 100? отсюда не понимаю, что происходит от 41 строки.
если условие в строке 37
IF($c = $arr_color_fon[$d])
верно, то найденный цвет уже есть в массиве и дальше с ним ни каких действий и проверок совершать не нужно.
в строке 38 $d увеличивается не на 100, а на значение при котором прекратится работа текущего цикла
$d= ARRSIZE($arr_color_fon)+100
в данном случае нужно превысить текущее число элементов массива. увеличивать можно любым способом на любое значение, можно просто написать
$d= 64743866
главное превысить значение при котором цикл
FOR($d = 0, $d < ARRSIZE($arr_color_fon))
прекратит далее ненужную работу.
в строке 41 проверяется чем закончилась работа цикла сравнения цветов
IF($d<ARRSIZE($arr_color_fon)+100)
ARRPUSH ($arr_color_fon, $c)
LOGWRITE ("x,y - ", $x,",", $y," цвет ", $c)
END_IF
если условие верно, то такого цвета в массиве нет и следующие строки добавляют цвет в массив и делают запись в лог где и какой цвет найден
-
ясно) еще раз спасибо)
я совсем не так как вы рассуждал))) я пытался проверить по очерёдно два массива "фон" и "новый список" на совпадение с пикселем, но где-то запарился и получал кучу дублей. теперь немного допилив ваше, получаю по желанию и накопленный массив с множества скринов и разовый результат по скрину.
считал, что первое, что напишет для себя пользователь Clickermann это как раз грабер изображений...)))
отсюда еще вопрос. существует ли возможность работать в подобном ключе с видеорядом? погоняв в работе сперва свой вариант (ну очень долго) и ваш вариант (быстро, но...) столкнулся с тем, что для идеального результата все же не хватает. не получается снять все измерения с экрана игры, или цель пропадает быстро или ее подбирают другие и цели уже нет))) понимая, что видео это слайдшоу из отдельных изображений, как возможно реализовать пособработку скринов с целью сбора тех же списков пикселей.
а какие есть варианты по надежному определению движущихся объектов? colormode не помогает совсем, т.к. начинается "подтяжка" упрощеных участков фона.
или "всё, дальше питон..."? )