Author Topic: IF_PICTURE_IN поиск нескольких картинок  (Read 6220 times)

0 Members and 1 Guest are viewing this topic.

-ELRO-

  • Зашел в гости
  • *
  • Posts: 19
  • фффа-а-а-а-а-тит!!!!!
    • View Profile
Добрый день товарищи!
У меня к вам вопрос с вытекающей просьбой)
Думаю по названию темы уже должно быть понятно о чем пойдет речь.
Имеется некое окно на рабочем столе, в этом окне нужно найти некоторые картинки по которым далее нужно совершить клик. Я написал скрипт и он находит все картинки, кроме тех которые повторяются. Т.е. если одинаковых картинок одного типа несколько, клик происходит только по одной картинке для каждого типа. А мне нужно чтобы клик происходил по всем картинкам всех типов независимо от их количества. Обычно на экране картинок каждого типа не более 5.
Прошу подсказать решение....

[spoiler]
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      IF_PICTURE_IN (700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
         LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5))) // клик со смещением  по всем координатам
         WAITMS(100)
         $check = 1
         $n=9999
      END_IF
   END_CYC
END_CYC
[/spoiler]

P.S. забыл добавить, а как правильно сделать нажатие на кнопку после выполнения всего цикла. Не важно нашел он картинки или нет...

[spoiler]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4)
      IF_PICTURE_IN (700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
         LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))
         WAITMS(100)
         $check = 1
         $n=9999
      END_IF
   END_CYC
END_CYC
KEYPRESS(#PAGEDOWN) // переход ниже, верно ли установлено?!?!!?!?!?!

[/spoiler]
« Last Edit: July 30, 2017, 03:15:17 PM by -ELRO- »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #1 on: July 30, 2017, 03:20:21 PM »
Какой же это рандом если от 5 до 5? Кроме того в конце лишняя скобка.
LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))

Для поиска всех картинок у нас есть функция SCANPICTURE
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1
         $n=9999
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

-ELRO-

  • Зашел в гости
  • *
  • Posts: 19
  • фффа-а-а-а-а-тит!!!!!
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #2 on: July 30, 2017, 03:34:13 PM »
Какой же это рандом если от 5 до 5? Кроме того в конце лишняя скобка.
LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))

Для поиска всех картинок у нас есть функция SCANPICTURE
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1
         $n=9999
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

Да, согласен. С рандомом я что то намудрил... Скобку убрал.
Запустил скрипт и вот что вышло.
PICTURE_1.BMP находит все что были
PICTURE_2.BMP нашел только 2, хотя в окне их было 4. Причем эти картинки находятся на одной линии по координате Х, но имеют разный Y. Те две что нашло имели одну координату  Y.

-ELRO-

  • Зашел в гости
  • *
  • Posts: 19
  • фффа-а-а-а-а-тит!!!!!
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #3 on: July 30, 2017, 03:53:19 PM »
Проблему с поиском 2-го типа картинки решил. При проверки более доскональна она оказалось отличается на 8 пикселей от другой, которая обычным глазом точно такая)))

Qwerry

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #4 on: July 30, 2017, 03:55:41 PM »
Как раз хотела написать про то, что если скрипт не нашел, значит не совпадают.
Можете уменьшить процент совпадения (число перед закрывающей скобкой в SCANPICTURE), поставив не 100, а 95, 90, 85  - сами подберете оптимальный баланс между быстродействием и эффективностью.
Про вариант "заменить картинку на более мелкий кусочек из ее серединки (ту часть, которая точно ничем не будет ничем перекрываться), тоже помните. Но это уже на крайний случай.

Если проблема не исчезнет, тогда возможной причиной является несовпадение оттенков,  и решать ее нужно будет через COLORMODE.

-ELRO-

  • Зашел в гости
  • *
  • Posts: 19
  • фффа-а-а-а-а-тит!!!!!
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #5 on: July 30, 2017, 04:07:39 PM »
P.S. забыл добавить, а как правильно сделать нажатие на кнопку после выполнения всего цикла. Не важно нашел он картинки или нет... Ну и так по кругу.....

[spoiler]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4)
      IF_PICTURE_IN (700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
         LCLICK($_RETURN1+RND(5,5),$_RETURN2+RND(5,5)))
         WAITMS(100)
         $check = 1
         $n=9999
      END_IF
   END_CYC
END_CYC
KEYPRESS(#PAGEDOWN) // переход ниже, верно ли установлено?!?!!?!?!?!

[/spoiler]

А вот с этим пока не получается.....

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #6 on: July 30, 2017, 04:37:51 PM »
Очевидно что после KEYPRESS(#PAGEDOWN) нужна задержка.

-ELRO-

  • Зашел в гости
  • *
  • Posts: 19
  • фффа-а-а-а-а-тит!!!!!
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #7 on: July 30, 2017, 05:05:11 PM »
Очевидно что после KEYPRESS(#PAGEDOWN) нужна задержка.

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

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #8 on: July 30, 2017, 05:23:44 PM »
Ну так а зачем же у тебя там написан выход из цикла при первом совпадении? Убери $n=9999 и цикл проверит все картинки.
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1     
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)

-ELRO-

  • Зашел в гости
  • *
  • Posts: 19
  • фффа-а-а-а-а-тит!!!!!
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #9 on: July 30, 2017, 10:48:31 PM »
Ну так а зачем же у тебя там написан выход из цикла при первом совпадении? Убери $n=9999 и цикл проверит все картинки.


Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1     
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)

Весело получается, с этой проблемой решили. Но при тесте выскочила новая.
Если во время работы скрипта попадается окно в котором нет ни одной картинки, то весь процесс просто напросто зависает.
Полагаю что можно использовать условие else которое будет выполняться  именно в той случае когда нет картинок.
Code: (clickermann) [Select]
$check = 0
WHILE($check = 0)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $check = 1
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
ELSE
   SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
   FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
      LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
      WAITMS(100)
      $check = 0
   END_CYC
   UNDEFINE($ARR_SCAN)
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)
HINTPOPUP("начинаю процесс", "Идем далее")
WAITMS(100)



Имхо?
« Last Edit: July 30, 2017, 10:53:27 PM by -ELRO- »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #10 on: July 31, 2017, 07:37:25 AM »
ELSE пишется только внутри условий.
В твоем случаи достаточно написать цикл с таймером.

Если за 20 секунд никакие картинки не будут найдены то цикл завершится, будет нажат PAGEDOWN и все сначала.
Code: (clickermann) [Select]
$time = $_time_t + 20 // таймер на 20 секунд
WHILE($time > $_time_t)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $time = 0
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)

-ELRO-

  • Зашел в гости
  • *
  • Posts: 19
  • фффа-а-а-а-а-тит!!!!!
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #11 on: August 01, 2017, 11:16:03 PM »
ELSE пишется только внутри условий.
В твоем случаи достаточно написать цикл с таймером.

Если за 20 секунд никакие картинки не будут найдены то цикл завершится, будет нажат PAGEDOWN и все сначала.
Code: (clickermann) [Select]
$time = $_time_t + 20 // таймер на 20 секунд
WHILE($time > $_time_t)
   GETSCREEN
   FOR($n=1,$n<4) // количество типов картинок, сейчас 3
      SCANPICTURE($ARR_SCAN, 700,90, 1270,1035, STRCONCAT("PICTURE_", $n, ".BMP"), 16777215, 100)
      FOR($im=0,$im<ARRSIZE($ARR_SCAN),2)
         LCLICK($ARR_SCAN[$im]+RND(0,5), $ARR_SCAN[$im+1]+RND(0,5)) // Клик
         WAITMS(100)
         $time = 0
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
END_CYC

KEYPRESS(#PAGEDOWN)
WAITMS(500)
Спасибо. Одну часть решил

Иллидан

  • Освоившийся
  • **
  • Posts: 40
  • Дзен-Мастер
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #12 on: August 12, 2021, 12:22:23 PM »
для скана, поиска и клика по куче копий одной и той же картинки, разбросанных по экрану, у меня такой код
Code: [Select]
$time = $_time_t + 1
      WHILE($time > $_time_t)
         GETSCREEN(0,10, 1200,900)
         COLORMODE(6)
         SCANPICTURE($ARR_SCAN, 0,10, 1200,900, "Поиск звёзд.bmp", -1, 60)
         $time = 0
         $ARR_NUM = 0
         WHILE ($ARR_NUM < ARRSIZE($ARR_SCAN))
            $X = $ARR_SCAN [$ARR_NUM]
            INC($ARR_NUM,1)
            $Y = $ARR_SCAN [$ARR_NUM]
            INC($ARR_NUM,1)
            LCLICK($X,$Y)
            END_CYC
         UNDEFINE($ARR_SCAN)
      END_CYC
а как добавить в поиск, требование минимального расстояния, между найденными одинаковыми картинками - для исключения лишних кликов по соседним пикселям тела найденной картинки и кликать следующую картинку, если размер картинки 5х5 и она разбросана по экрану копиями?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: IF_PICTURE_IN поиск нескольких картинок
« Reply #13 on: August 12, 2021, 01:37:44 PM »
а как добавить в поиск, требование минимального расстояния, между найденными одинаковыми картинками - для исключения лишних кликов по соседним пикселям тела найденной картинки и кликать следующую картинку, если размер картинки 5х5 и она разбросана по экрану копиями?
Примерно так:
Code: (clickermann) [Select]
$shift_X = 5  // минимальный отступ по x
$shift_Y = 5  // минимальный отступ по y

GETSCREEN(0,10, 1200,900)
COLORMODE(6)
SCANPICTURE($ARR_SCAN, 0,10, 1200,900, "Поиск звёзд.bmp", -1, 60)
$safe_X = -2000
$safe_Y = -2000
$ARR_NUM = 0
WHILE($ARR_NUM < ARRSIZE($ARR_SCAN))
    $X = $ARR_SCAN[$ARR_NUM]
    $Y = $ARR_SCAN[$ARR_NUM+1]
    INC($ARR_NUM, 2)
    IF(($X >= $safe_X) | ($Y >= $safe_Y))
        $safe_X = $X + $shift_X
        $safe_Y = $Y + $shift_Y
        LCLICK($X, $Y)
        WAITMS(100)
    END_IF
END_CYC
UNDEFINE($ARR_SCAN)
« Last Edit: August 12, 2021, 01:43:46 PM by Vint »