Author Topic: IF_PICTURE_IN - Для новичков  (Read 106190 times)

0 Members and 8 Guests are viewing this topic.

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

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #90 on: January 12, 2022, 11:51:54 PM »
Code: (clickermann) [Select]
// 12.01.2022
#name "New herb"
SUB(herb, $par1, $par2) // подпрограмма с параметрами
   GETSCREEN(26,597,367,1090)
   COLORMODE(6,26,597,367,1090)
   SCREENSHOTFIX(26,597,367,1090,$par1)
   IF_PIXEL_IN(26,597,367,1090,$par2)
      KEYDOWN(#ctrl)
      WAITMS(100)
      LCLICK($_return1, $_return2)
      WAITMS(100)
      KEYUP(#ctrl)
      WAITMS(200)
   END_IF
END_SUB

herb("herb.bmp",8355647) // вызов подпрограммы (обязательно ниже подпрограммы)
herb("herb1.bmp",8355839)
herb("herb2.bmp",8388607)

GETSCREEN(61,382,343,413)
IF_PIXEL_IN(61,382, 343,413, 269907)
   LCLICK($_return1, $_return2)
   WAITMS(500)
END_IF

HALT
GETSCREEN(26,597,367,1090)
   COLORMODE(6,26,597,367,1090)
   SCREENSHOTFIX(26,597,367,1090,$par1)
 о какой оптимальности можно говорить если этот скрипт трижды сканирует одну область и трижды подряд сохраняет её как картинку под разными названиями!
в чём смысл утраивания усилий?
 Было-бы логично  сначала проверять цвет пикселя а уже в зависимости от найденного цвета, обновлять картинку, а так
только команда HALT спасает от перегрузки компа ненужными и ресурсоёмкими действиями. действиями
Code: (clickermann) [Select]
// 12.01.2022
#name "New herb2"
SUB(herb, $par1, $par2) // подпрограмма с параметрами
   IF_PIXEL_IN(26,597,367,1090,$par2)
      SCREENSHOTFIX(26,597,367,1090,$par1)
      KEYDOWN(#ctrl)
      WAITMS(100)
      LCLICK($_return1, $_return2)
      WAITMS(100)
      KEYUP(#ctrl)
      WAITMS(200)
   END_IF
END_SUB
GETSCREEN(26,597,367,1090)
COLORMODE(6,26,597,367,1090)
herb("herb.bmp",8355647) // вызов подпрограммы (обязательно ниже подпрограммы)
herb("herb1.bmp",8355839)
herb("herb2.bmp",8388607)

GETSCREEN(61,382,343,413)
IF_PIXEL_IN(61,382, 343,413, 269907)
   LCLICK($_return1, $_return2)
   WAITMS(500)
END_IF

HALT

Aleksey999

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #91 on: January 13, 2022, 06:27:39 PM »
Code: (clickermann) [Select]
// 12.01.2022
#name "New herb"
SUB(herb, $par1, $par2) // подпрограмма с параметрами
   GETSCREEN(26,597,367,1090)
   COLORMODE(6,26,597,367,1090)
   SCREENSHOTFIX(26,597,367,1090,$par1)
   IF_PIXEL_IN(26,597,367,1090,$par2)
      KEYDOWN(#ctrl)
      WAITMS(100)
      LCLICK($_return1, $_return2)
      WAITMS(100)
      KEYUP(#ctrl)
      WAITMS(200)
   END_IF
END_SUB

herb("herb.bmp",8355647) // вызов подпрограммы (обязательно ниже подпрограммы)
herb("herb1.bmp",8355839)
herb("herb2.bmp",8388607)

GETSCREEN(61,382,343,413)
IF_PIXEL_IN(61,382, 343,413, 269907)
   LCLICK($_return1, $_return2)
   WAITMS(500)
END_IF

HALT
GETSCREEN(26,597,367,1090)
   COLORMODE(6,26,597,367,1090)
   SCREENSHOTFIX(26,597,367,1090,$par1)
 о какой оптимальности можно говорить если этот скрипт трижды сканирует одну область и трижды подряд сохраняет её как картинку под разными названиями!
в чём смысл утраивания усилий?
 Было-бы логично  сначала проверять цвет пикселя а уже в зависимости от найденного цвета, обновлять картинку, а так
только команда HALT спасает от перегрузки компа ненужными и ресурсоёмкими действиями. действиями
Code: (clickermann) [Select]
// 12.01.2022
#name "New herb2"
SUB(herb, $par1, $par2) // подпрограмма с параметрами
   IF_PIXEL_IN(26,597,367,1090,$par2)
      SCREENSHOTFIX(26,597,367,1090,$par1)
      KEYDOWN(#ctrl)
      WAITMS(100)
      LCLICK($_return1, $_return2)
      WAITMS(100)
      KEYUP(#ctrl)
      WAITMS(200)
   END_IF
END_SUB
GETSCREEN(26,597,367,1090)
COLORMODE(6,26,597,367,1090)
herb("herb.bmp",8355647) // вызов подпрограммы (обязательно ниже подпрограммы)
herb("herb1.bmp",8355839)
herb("herb2.bmp",8388607)

GETSCREEN(61,382,343,413)
IF_PIXEL_IN(61,382, 343,413, 269907)
   LCLICK($_return1, $_return2)
   WAITMS(500)
END_IF

HALT

dramster, спасибо за ответ. Учту ваше замечание на будущее.

Иван_Васильевич, Огромная благодарность за рабочий скрипт с "программой с параметрами". Благодаря этому примеру получил понимание как работает эта программа с параметрами.
В итоге получил вот такой вариант, при котором делается один скриншот и по нему кликликер отыскивает 3 контрольных пикселя:


Code: (clickermann) [Select]

// 12.01.2022
#name "New herb2"
SUB(herb, $par1)   
   IF_PIXEL_IN(2,807,345,1304,$par1)
      KEYDOWN(#ctrl)
      WAITMS(100)
      LCLICK($_return1, $_return2)
      WAITMS(100)
      KEYUP(#ctrl)
      WAITMS(200)
   END_IF
END_SUB

GETSCREEN(2,807,345,1304)
COLORMODE(6,2,807,345,1304)
SCREENSHOTFIX(2,807,345,1304,"herb.bmp")

herb(8355647)
herb(4194175)
herb(8388607)

GETSCREEN(61,382,343,413)
IF_PIXEL_IN(61,382, 343,413, 269907)
   LCLICK($_return1, $_return2)
   WAITMS(100)
END_IF

HALT



Спасибо большое за помощь.
« Last Edit: January 14, 2022, 01:58:43 AM by Aleksey999 »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #92 on: January 13, 2022, 10:32:29 PM »
Есть предположение, что из трех твоих вызовов подпрограмм находит только один цвет. Если это так, то нужно знать, что IF_PIXEL_IN может искать сразу множество цветов одновременно, и завершит поиск при первом совпадении в области:
Code: (clickermann) [Select]
GETSCREEN(2,807,345,1304)
COLORMODE(6,2,807,345,1304)
SCREENSHOTFIX(2,807,345,1304,"herb.bmp")

IF_PIXEL_IN(2,807,345,1304, 8355647, 4194175, 8388607)  //ищем сразу 3 цвета
   KEYDOWN(#ctrl)
   WAITMS(100)
   LCLICK($_return1, $_return2)
   WAITMS(100)
   KEYUP(#ctrl)
   WAITMS(200)
END_IF

GETSCREEN(61,382,343,413)
IF_PIXEL_IN(61,382, 343,413, 269907)
   LCLICK($_return1, $_return2)
   WAITMS(100)
END_IF

HALT

Aleksey999

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #93 on: January 13, 2022, 11:41:29 PM »
Есть предположение, что из трех твоих вызовов подпрограмм находит только один цвет. Если это так, то нужно знать, что IF_PIXEL_IN может искать сразу множество цветов одновременно, и завершит поиск при первом совпадении в области:
Code: (clickermann) [Select]
GETSCREEN(2,807,345,1304)
COLORMODE(6,2,807,345,1304)
SCREENSHOTFIX(2,807,345,1304,"herb.bmp")

IF_PIXEL_IN(2,807,345,1304, 8355647, 4194175, 8388607)  //ищем сразу 3 цвета
   KEYDOWN(#ctrl)
   WAITMS(100)
   LCLICK($_return1, $_return2)
   WAITMS(100)
   KEYUP(#ctrl)
   WAITMS(200)
END_IF

GETSCREEN(61,382,343,413)
IF_PIXEL_IN(61,382, 343,413, 269907)
   LCLICK($_return1, $_return2)
   WAITMS(100)
END_IF

HALT

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

А конкретно этот вариант будет применять действие только к одному из них.

wert19s

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #94 on: February 10, 2022, 01:45:51 AM »
Добрый вечер,

Голову сломал:

GETSCREEN // Clickermann
COLORMODE(3)
IF_PICTURE_IN (20,150, $_xmax,$_ymax, "Y.bmp", -1, 80)
   BEEP(800,200)
     LOGWRITE ("BOMBA")
      DBLCLICK(493,99)
       WAIT(3)
   DBLCLICK(557,108)
ELSE // "ИНАЧЕ"
   BEEP(800,200)
   BEEP(800,200)
   BEEP(800,200)
   LOGWRITE ("О")
END_IF //
HALT

этот код не работает, когда не находит картинку то работает и пишет в лог О, а если находит то виснет кликер "не отвечает" закрываю его через диспечер.
и еще когда координаты оставляю :0,0 тоже виснет.
что может быть проблема?
спасибо

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

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

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #95 on: February 10, 2022, 06:30:34 PM »
Добрый вечер,

Голову сломал:

GETSCREEN // Clickermann
COLORMODE(3)
IF_PICTURE_IN (20,150, $_xmax,$_ymax, "Y.bmp", -1, 80)
   BEEP(800,200)
     LOGWRITE ("BOMBA")
      DBLCLICK(493,99)
       WAIT(3)
   DBLCLICK(557,108)
ELSE // "ИНАЧЕ"
   BEEP(800,200)
   BEEP(800,200)
   BEEP(800,200)
   LOGWRITE ("О")
END_IF //
HALT

этот код не работает, когда не находит картинку то работает и пишет в лог О, а если находит то виснет кликер "не отвечает" закрываю его через диспечер.
и еще когда координаты оставляю :0,0 тоже виснет.
что может быть проблема?
спасибо

ребят помогите ....вернулся опять  к старой проблеме...смотрел видео читал  сообщения здесь но таки не понял...
вы ошибаетесь в  своих наблюдениях или код показали другой
так-как команда HALT даёт коду возможность только одноразового срабатывания и ни о каком зависании даже речи быть не может.

wert19s

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #96 on: February 10, 2022, 09:46:10 PM »
Добрый вечер,

Голову сломал:

GETSCREEN // Clickermann
COLORMODE(3)
IF_PICTURE_IN (20,150, $_xmax,$_ymax, "Y.bmp", -1, 80)
   BEEP(800,200)
     LOGWRITE ("BOMBA")
      DBLCLICK(493,99)
       WAIT(3)
   DBLCLICK(557,108)
ELSE // "ИНАЧЕ"
   BEEP(800,200)
   BEEP(800,200)
   BEEP(800,200)
   LOGWRITE ("О")
END_IF //
HALT

этот код не работает, когда не находит картинку то работает и пишет в лог О, а если находит то виснет кликер "не отвечает" закрываю его через диспечер.
и еще когда координаты оставляю :0,0 тоже виснет.
что может быть проблема?
спасибо

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

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

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #97 on: February 11, 2022, 04:53:17 AM »
Добрый вечер,

Голову сломал:

GETSCREEN // Clickermann
COLORMODE(3)
IF_PICTURE_IN (20,150, $_xmax,$_ymax, "Y.bmp", -1, 80)
   BEEP(800,200)
     LOGWRITE ("BOMBA")
      DBLCLICK(493,99)
       WAIT(3)
   DBLCLICK(557,108)
ELSE // "ИНАЧЕ"
   BEEP(800,200)
   BEEP(800,200)
   BEEP(800,200)
   LOGWRITE ("О")
END_IF //
HALT

этот код не работает, когда не находит картинку то работает и пишет в лог О, а если находит то виснет кликер "не отвечает" закрываю его через диспечер.
и еще когда координаты оставляю :0,0 тоже виснет.
что может быть проблема?
спасибо

ребят помогите ....вернулся опять  к старой проблеме...смотрел видео читал  сообщения здесь но таки не понял...
вы ошибаетесь в  своих наблюдениях или код показали другой
так-как команда HALT даёт коду возможность только одноразового срабатывания и ни о каком зависании даже речи быть не может.
Поверьте виснет при первом нажатии....Я поборол это при первом использовани...недавно опять понадобилось поиск по картинке в том же проэкте...и опять я застрял ....
я проверил, хотя отлично знал, результат который получу, но пусть вам будет стыдно за ваше неуместное  требование проверки, вместо того, чтоб по простому, по человечески спросить о причине ваших собственных неудач.
 вот лог работы!
4:47:35 О
 как видите ни чего у нормальных-то пользователей ни где не виснет, а работает ожидаемо и после проверки скрипт, как и положено выключается, к вашему стыду! :-[

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

  • Освоившийся
  • **
  • Posts: 72
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #98 on: February 11, 2022, 05:09:41 AM »
Добрый вечер,

Голову сломал:

GETSCREEN // Clickermann
COLORMODE(3)
IF_PICTURE_IN (20,150, $_xmax,$_ymax, "Y.bmp", -1, 80)
   BEEP(800,200)
     LOGWRITE ("BOMBA")
      DBLCLICK(493,99)
       WAIT(3)
   DBLCLICK(557,108)
ELSE // "ИНАЧЕ"
   BEEP(800,200)
   BEEP(800,200)
   BEEP(800,200)
   LOGWRITE ("О")
END_IF //
HALT

этот код не работает, когда не находит картинку то работает и пишет в лог О, а если находит то виснет кликер "не отвечает" закрываю его через диспечер.
и еще когда координаты оставляю :0,0 тоже виснет.
что может быть проблема?
спасибо

ребят помогите ....вернулся опять  к старой проблеме...смотрел видео читал  сообщения здесь но таки не понял...
вы ошибаетесь в  своих наблюдениях или код показали другой
так-как команда HALT даёт коду возможность только одноразового срабатывания и ни о каком зависании даже речи быть не может.
Поверьте виснет при первом нажатии....Я поборол это при первом использовани...недавно опять понадобилось поиск по картинке в том же проэкте...и опять я застрял ....
Если вам уже стало стыдно, за своё неадекватное поведение, то:
1. уменьшайте размер картинки для поиска
2. увеличивайте процент совпадения
3. ограничивайте область обновления графического буфера и область цветокоррекции область поиска картинки
4. точнее указывайте область поиска картинки
5. точнее подбирайте для сохранённого образца режим цветокоррекции и игнорирования фона, чтоб повысить процент совпадения.
 

wert19s

  • Освоившийся
  • **
  • Posts: 28
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #99 on: February 12, 2022, 10:49:47 PM »
Добрый вечер,

Голову сломал:

GETSCREEN // Clickermann
COLORMODE(3)
IF_PICTURE_IN (20,150, $_xmax,$_ymax, "Y.bmp", -1, 80)
   BEEP(800,200)
     LOGWRITE ("BOMBA")
      DBLCLICK(493,99)
       WAIT(3)
   DBLCLICK(557,108)
ELSE // "ИНАЧЕ"
   BEEP(800,200)
   BEEP(800,200)
   BEEP(800,200)
   LOGWRITE ("О")
END_IF //
HALT

этот код не работает, когда не находит картинку то работает и пишет в лог О, а если находит то виснет кликер "не отвечает" закрываю его через диспечер.
и еще когда координаты оставляю :0,0 тоже виснет.
что может быть проблема?
спасибо

ребят помогите ....вернулся опять  к старой проблеме...смотрел видео читал  сообщения здесь но таки не понял...
вы ошибаетесь в  своих наблюдениях или код показали другой
так-как команда HALT даёт коду возможность только одноразового срабатывания и ни о каком зависании даже речи быть не может.
Поверьте виснет при первом нажатии....Я поборол это при первом использовани...недавно опять понадобилось поиск по картинке в том же проэкте...и опять я застрял ....
Добрый вечер
 Если вам уже стало стыдно, за своё неадекватное поведение, то:
1. уменьшайте размер картинки для поиска
например мне нужна область 500х200 и на 1200 на 400 квадрат...я делаю скрин этого участка с цветокорекцией 4-5-6 ....перепробовал все 3///
2. увеличивайте процент совпадения
максимально 100 минимально 0....экспререминтировал от 0 до 100
3. ограничивайте область обновления графического буфера и область цветокоррекции область поиска картинки
сдесь можна подробней?
4. точнее указывайте область поиска картинки
как указывать точнее? указываю ту же область когда беру скрин до вырезания картинки размером 30х30...
5. точнее подбирайте для сохранённого образца режим цветокоррекции и игнорирования фона, чтоб повысить процент совпадения.
цветокорекция ? выставляю так же как когда делаю скрин....а вот насчет фона можна подробнее?
заранее спасибо

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #100 on: February 19, 2022, 04:39:10 PM »
1. уменьшайте размер картинки для поиска
2. увеличивайте процент совпадения
3. ограничивайте область обновления графического буфера и область цветокоррекции область поиска картинки
4. точнее указывайте область поиска картинки
5. точнее подбирайте для сохранённого образца режим цветокоррекции и игнорирования фона, чтоб повысить процент совпадения.

  На сколько я понимаю, вот это все тут ни при чем. Ведь человек сказал, что если у него НЕ находит картинку, то скрипт не зависает и в лог благополучно прописывается "О". Но для того, чтобы картинку НЕ найти, скрипту нужно поискать ее по всему экрану (в пределах заданных координат) и с заданными параметрами, а значит, что с размером экрана и условиями самого поиска процессор компа все же справляется, если в итоге он все же переходит в раздел ELSE. Ну, это чисто логика и терять ее в нашем деле нельзя...
  Мое мнение - человек что-то путает, так как я не вижу в скрипте проблемных мест. Либо я очень невнимателен - что вполне возможно. В любом случае у меня тоже часто возникают моменты, в которых вроде бы ВСЁ перепроверишь 50 раз, а оно всё равно не работает и тогда меня удивляет одна вещь на форуме - почему так боимся пользоваться логом? Да - ты прописал некие отмашки в лог в обоих направлениях, в которых может идти скрипт, но если сложилась такая ситуация, как у тебя, то не считаешь ли ты, что этих отметок мало и что тебе пора выяснить конкретно - на какой строке у тебя возникает трабл? Я понимаю - скрипт был бы в 3.000 строк... И то можно было бы сделать то же самое в проблемном месте скрипта.

Code: (clickermann) [Select]
GETSCREEN // Clickermann
COLORMODE(3)
IF_PICTURE_IN (20,150, $_xmax,$_ymax, "Y.bmp", -1, 80)
   LOGWRITE ("Картинка найдена в координатах: ",$_return1,",",$_return2)
   BEEP(800,200)
   LOGWRITE ("BOMBA")
   DBLCLICK(493,99)
   LOGWRITE ("Ждемс три сек")
   WAIT(3)
   LOGWRITE ("Двойной клик")
   DBLCLICK(557,108)
   LOGWRITE ("Условие с найденной картинкой закончено")
ELSE // "ИНАЧЕ"
   LOGWRITE ("Картинка не найдена")
   BEEP(800,200)
   LOGWRITE ("BEEP")
   BEEP(800,200)
   LOGWRITE ("BEEP")
   BEEP(800,200)
   LOGWRITE ("О")
END_IF //
HALT

Запускаем скрипт и лог в студию.
« Last Edit: February 19, 2022, 05:20:50 PM by Hito »
Я не ду... Потому и не бу...

Oblie1968

  • Освоившийся
  • **
  • Posts: 29
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #101 on: February 21, 2022, 02:03:27 PM »
не считаешь ли ты, что этих отметок мало и что тебе пора выяснить конкретно - на какой строке у тебя возникает трабл? Я понимаю - скрипт был бы в 3.000 строк... И то можно было бы сделать то же самое в проблемном месте скрипта.
Другой вариант, закомментить все строки в проблемном месте и по одной вводить в строй.
Проблема в одном из DBLCLICK, больше просто негде, надо ему смотреть, чего он там кликает.
« Last Edit: February 21, 2022, 02:07:43 PM by Oblie1968 »

Benedict

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #102 on: October 09, 2022, 04:31:22 PM »
Не понимаю окончательно бесповоротно, что делаю не так?
Есть скрипт:
Code: (clickermann) [Select]
print("Начали скрипт")

SCREENSHOT //делаем контрольный скриншот
GETSCREEN (0,0, $_xmax,$_ymax) //забираем экран в буфер
SCREENSHOTEX (0,0, $_xmax,$_ymax, "scr_from_mem") //делаем контрольный скриншот из буфера
// HALT 
 
IF_PICTURE_IN (3380,1947, 3746,2025, "exit_2.bmp", -1, 90) //проверяем на наличие образца на экране
   print("Нашли кнопку", $_return1, $_return2)
   WAIT(10)
ELSE
   SCREENSHOTEX (3380,1947, 3746,2025, "NOT_FOUND") // делаем контрольный скриншот того места, где искали
   print("Не нашли кнопку")
   WAIT(10)
END_IF

halt


И вот смотрите, что происходит: экран коррекнтый, в памяти всё корректно, контрольный скрин с того места где искали совпадает с шаблонным изображением. А НЕ НАХОДИТ!
Что не так-то?

P.S. Картинки сюда не размещаются, поэтому все примеры тут: https://drive.google.com/drive/folders/1k1mtqkjKowj4IXrOTsCFBq62ZHnaA5Yj?usp=sharing

kiril

  • Активный участник
  • ***
  • Posts: 106
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #103 on: October 09, 2022, 06:00:51 PM »
Всё просто; в указанной вами области нет изображения совпадающего с картинкой exit_2 более чем на 90 %
много отличий видит уважаемая программа, странно, что вы их не видите.

Benedict

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: IF_PICTURE_IN - Для новичков
« Reply #104 on: October 09, 2022, 09:38:44 PM »
Честное слово - не понимаю и не вижу разницы между объектами.
При значении в 30% что-то находит, но это что-то не совсем то.