Author Topic: создание массива из пикселей скриншота и их сортировка  (Read 2282 times)

0 Members and 1 Guest are viewing this topic.

Vlas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Здравствуйте.
наверняка у кого-то уже существует писаный код для:

1. снятие скрина с области экрана.
берем пиксели по очереди и ...
2. сравнение с заранее созданным массивом цветов пикселей "фона" (выкинули при дубле)
3. сравнение с массивом только что найденных цветов (выкинули при дубле)
4.  вывод всех найденных цветов пикселей из области скрина списком с отсевом дублей

Цель получить список всех используемых цветов из скрина-примера для дальнейшего поиска объекта на экране.

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

Иван_Васильевич

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
покажите ваш код, ошибки вам исправят.

Vlas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Code: (clickermann) [Select]
[
// анализ участка экрана с составлением списка цветов по пиксельно
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
]

Иван_Васильевич

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
Code: (clickermann) [Select]
// 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

Vlas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Огромное спасибо)
Всё отлично работает 8) , но всё "чуток" не так как я себе представлял...)))
можно уточнить? не могу понять смысл-логику 38й строки, и зачем $d увеличивается на 100 и именно на 100? отсюда не понимаю, что происходит от 41 строки. 

Иван_Васильевич

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
Огромное спасибо)
Всё отлично работает 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
 если условие верно, то такого цвета в массиве нет и следующие строки добавляют цвет в массив и делают запись в лог где  и какой цвет найден

Vlas

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
ясно) еще раз спасибо)
я совсем не так как вы рассуждал))) я пытался проверить по очерёдно  два массива "фон" и "новый список" на совпадение с пикселем, но где-то запарился и получал кучу дублей. теперь немного допилив ваше, получаю по желанию и накопленный массив с множества скринов и разовый результат по скрину.
считал, что первое, что напишет для себя пользователь Clickermann это как раз грабер изображений...)))

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

а какие есть варианты по надежному определению движущихся объектов? colormode не помогает совсем, т.к. начинается "подтяжка" упрощеных участков фона.

или "всё, дальше питон..."? )
« Last Edit: May 01, 2022, 11:55:43 AM by Vlas »