Author Topic: Не находит изображение, IF_PICTURE_IN, SCANPICTURE  (Read 3323 times)

0 Members and 1 Guest are viewing this topic.

m1hai

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Нужно найти аватарку группы (https://vk.com/behappy_1) от постов в середине экрана и вывести координаты.
Code: (clickermann) [Select]
GETSCREEN

COLORMODE(5)
IF_PICTURE_IN (536,323,1082,737,"inimaaa.bmp",-1,70)
print("нашёл:",$_return1, $_return2)
ELSE
print("не нашёл")
END_IF

Пробовал и с SCANPICTURE и тоже не находит. Попробовал IF_PIXEL_IN и по цвету находит.
В чём может быть проблема?
Битмап сделал сохраняя как в пейнте, стоит в папке со скриптом, пробовал 24-бит, 256, меньший размер, больший размер, всё равно не находит.
Помогите пожалуйста.

i0

  • Оплот сообщества
  • ****
  • Posts: 353
  • CMann 4.13.014 final, ie, presto, win7 x86, x64
    • View Profile
если используешь перед поиском colormode(5), то и искомый фрагмент "inimaaa.bmp" должен быть из картинки с colormode(5)
выполни простейший скрипт
GETSCREEN
COLORMODE(5)
SCREENSHOT
и потом из скриншота в папке screens вырежи нужную тебе аватарку и сохрани в папку со скриптом

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Нужно правильно подготавливать картинки.

Code: (clickermann) [Select]
GETSCREEN
COLORMODE(6)
IF_PICTURE_IN (536,323,1082,737,"inimaaa.bmp",-1,80)
   print("нашёл: ", $_return1,",",$_return2)
   MOVE($_return1,$_return2)
ELSE
   print("не нашёл")
END_IF

HALT

m1hai

  • Зашел в гости
  • *
  • Posts: 10
    • View Profile
Спасибо большое, буду знать, не знаю почему потупил и не заметил свою ошибку. Хорошего дня. :)

RomkaMarik

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Всем привет. У меня аналогичная проблема. Написал скрипт - работает, поменял картинку поиска и все! Не работает!!! Хоть обратно подставлял ту, с которой работало, хоть другую. Что не так - не пойму.
Code: [Select]
//LCLICK(962,657)
GETSCREEN(180,190,512,225)
//COLORMODE(6)
WAITMS(500)
//WAITMS(500)
IF_PICTURE_IN(187,190,512,225,"L.bmp",0,70)
WAITMS(500)
LCLICK(962,657)
END_IF
halt
В заданной области (см. картинку 111111111111.jpg),  от двоеточия после слова "Имя" и до слова "Сила", ищу имя с английской "L". Фон черный, буква белая. После запуска скрипта ничего не происходит от слова "совсем". Если раскоментировать HALT то скрипт останавливается примерно через секунду. Если Halt оставить закомментированным, а раскоментировать  верхний LCLICK(962,657) (нижний соответственно закомментировать), то скрипт идет по кругу... Вывод: не обрабатывается область сканирования. Или, если точнее, в скрипте происходит постоянное совпадение.
Colormode - тоже не дал результатов.

Помогите разобраться
« Last Edit: June 01, 2018, 03:47:53 PM by RomkaMarik »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Ты ж понимаешь что если считать черное за прозрачность то белую L функция найдет везде где достаточно белого пространства?!

RomkaMarik

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Ок, проблема, как оказалось, действительно не такая. Прошу прощения, что влез не в ту тему по недопониманию происходящего... После некоторых экспериментов я понял, что происходит, но как решить - не знаю.
По поводу фона: не имеет значения учитываю я фон или нет. Это я проверил на практике.
Что происходит: Скрипт останавливается не в том цикле, где найдено совпадение по картинке, а в следующем. Как прикрепить видео - не знаю. Выложил на ГуглДиск
https://drive.google.com/file/d/1XfC6NIhpW5DgXJtkdWH2ca2U-SHH0S2U/view?usp=sharing

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
посмотрел видео. я так понимаю, что нужно постоянно жать на эту зеленую кнопку, пока не появится адпись с буквой "Л".

а теперь давай посмотрим что ты написал в скрипте:
делаем скрин и ищем букву Л - не нашли - ждем немного и жмем на кнопку - после нажатия СРАЗУ  МГНОВЕННО снова делаем скрин.... и как ты думаешь, в момент перед кликом и сразу после него чтото изменится на нашем экране? да ничего не изменится, и буквы Л ни в коем разе там не появится, картинка не успеет подгрузиться. поэтому в конце после клика по зеленой кнопке, требуется соответствующая задержка, чтобы твоя буква подгрузилась и появилась на экране.

если ничего не понял, то :
Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN
   move($_return1, $_return2)
   halt
END_IF

wait(1)

LCLICK

wait(2)

образно

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Вообще я в таких случаях делаю скрин перед кликом в той области, которая после клика должна измениться, и после самого клика запускаю цикл с таймером. Из цикла выход в двух вариантах. 1 - таймер истек (тогда повторяю операцию) и 2 - картинка, с которой я делал скрин, сменилась (это значит, что клик прошел удачно и вот теперь можно анализировать экран)

Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN(187,190,512,225,"L.bmp",0,70)
   // L.bmp найдена и если нужно кликнуть на картинку, то я иногда извращаюсь  :)
   LCLICK($_return1+(ширина_картинки/2), $_return2+(высота_картинки/2))
else
   SCREENSHOTFIX(187,190,512,225, "proverka.bmp", 0) // Если L.bmp не найдена, то делаем проверочный скрин
   $click = 0
   WHILE($click = 0) // Запускаем цикл
      GETSCREEN
      IF_PICTURE_IN(187,190,512,225,"proverka.bmp",0,70) // Если проверочный скрин найден, значит соперник не сменился
         LCLICK(962,657) // На сколько я понял, это клик на кнопку "Сменить соперника"  - кликаем
         
         $time = $_time_t + 5 // Запускаем цикл с таймером на 5 сек
         WHILE($time > $_time_t)
            GETSCREEN
            IF_PICTURE_IN(187,190,512,225,"proverka.bmp",0,70) // В течении 5 секунд ждем, пока проверочный скрин не будет найден
               WAITMS(50)
            ELSE
               $time = 0 // Если мы его не нашли, значит соперник сменился и мы выходим из этого цикла
               $click = 1 // и предыдущего
            END_IF
         END_CYC
         // Если же проверочный скрин так и останется на месте,
         //значит страница вообще не отреагировала на клик, либо зависла, или еще что-то.
         // В таком случае мы выйдем из цикла с таймером
         // Но останемся в предыдущем цикле и снова кликнем и
         // снова будем ждать, пока картинка сменится
      else
         $click = 1
      END_IF
   END_CYC
END_IF
halt

И я тебя уверяю, что такая схема будет работать точнее и быстрее, чем с твоими WAITMS(500)  :)
В скрипте паузы должны быть минимальными (только для разгрузки процессора). Все остальные ожидания должны быть "интеллектуальными" и сбоеустойчивыми ))
« Last Edit: June 02, 2018, 10:50:28 PM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Code: (clickermann) [Select]
            IF_PICTURE_IN(187,190,512,225,"proverka.bmp",0,70) // В течении 5 секунд ждем, пока проверочный скрин не будет найден
               WAITMS(50)
            ELSE
               $time = 0 // Если мы его не нашли, значит соперник сменился и мы выходим из этого цикла
               $click = 1 // и предыдущего
            END_IF

Кстати... Опытным путем показало, что в некоторых случаях нужно проверять не только исчезновение проверочного скрина, но и появления, после этого, какого-нибудь скрина, который было бы видно только при полной загрузке новой страницы, или какой-либо панели.
« Last Edit: June 09, 2018, 08:58:42 AM by Hito »
Я не ду... Потому и не бу...