Author Topic: Поиск по картинке  (Read 1578 times)

0 Members and 2 Guests are viewing this topic.

KREM

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Поиск по картинке
« on: August 17, 2020, 02:24:04 PM »
Всем привет, мне нужна ваша помощь. В одной игре, для крафта предмета нужно сыграть в мини игру, которая заключается в быстром нажатии клавиш, указанных на экране. В моем случае - это стрелочки. Выскакивает картинка с повернутой в сторону (верх, низ и т.д.) стрелкой. Скажу, что я чайник в этой теме, но готов разбираться. Написал я вот такую шнягу.

Code: [Select]
KEYPRESS(#E)

GETSCREEN
IF_PICTURE_IN(921,770, 996,842, "Screenshot_1.bmp" )
   KEYPRESS(#LEFT)
   WAITMS(100)
ELSE
END_IF
IF_PICTURE_IN(921,770, 996,842, "Screenshot_2.bmp" )
   KEYPRESS(#RIGHT)
   WAITMS(100)
ELSE
END_IF
IF_PICTURE_IN(921,770, 996,842, "Screenshot_4.bmp" )
   KEYPRESS(#UP)
   WAITMS(100)
ELSE
END_IF
IF_PICTURE_IN(921,770, 996,842, "Screenshot_3.bmp" )
   KEYPRESS(#DOWN)
   WAITMS(100)
ELSE
END_IF

Но, когда я нажимаю старт, программа виснет. Как я понимаю, это из-за непраильной оптимизации. Размер скриншотов разнится от 60х60 до 70х70, формат .bmp . Так же приложение со скриншотом из самой игры. Спасибо заранее! :D  :-*

KREM

  • Зашел в гости
  • *
  • Posts: 2
    • View Profile
Re: Поиск по картинке
« Reply #1 on: August 17, 2020, 02:29:05 PM »
Я хотел отталкиваться не от сожердимого изображения, а от координатов определенного пикселя и его цвета. Брать конец и начало стрелки, и, если они соджерат черный пиксель, то нажимается соответствуюющая клавиша. Если такое возможно, то прошу, помогите. :-* :-*

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Поиск по картинке
« Reply #2 on: August 17, 2020, 04:14:59 PM »
Ничего не зависает. Просто у тебя картинки не находит и скрипт ищет по кругу.
Плюс загрузка процессора ~25% т.к. задержки нет после поиска.

А не находит, скорее всего, потому что картинка рендерится со сглаживанием.
Вариантов решения полно.

Можно и  картинку искать, но с применением COLORMODE 7 или 8 и задавая процент совпадения.
Code: (clickermann) [Select]
GETSCREEN(921,770, 996,842)
COLORMODE(8, 921,770, 996,842)
IF_PICTURE_IN(921,770, 996,842, "Left.bmp", -1, 85)
    KEYPRESS(#LEFT)
    WAITMS(100)
END_IF

Картинки заготовить УЖЕ с применением выбранного режима COLORMODE.
Картинки лучше обрезать примерно так... (во вложении). Минимум пустого пространства вокруг. По возможности левый верхний угол не фон.


Если твои стрелки всегда строго в одном месте, можно найти центр и определять количество чёрных пикселов левее/правее/выше/ниже. Где больше, туда и стрелка
Code: (clickermann) [Select]
// координаты центра задать точно!
$cx = 958
$cy = 806
GETSCREEN(921,770, 996,842)
COLORMODE(8, 921,770, 996,842)

// считаем кол-во чёрных пикселов левее/правее/выше/ниже центра
$left  = PXLCOUNT($cx-12, $cy-6,  $cx,    $cy+6, 0)
$right = PXLCOUNT($cx,    $cy-6,  $cx+12, $cy+6, 0)
$up    = PXLCOUNT($cx-6,  $cy-12, $cx+6,  $cy, 0)
$down  = PXLCOUNT($cx-6,  $cy_y,  $cx+6,  $cy+12, 0)

IF(($left > $right) & ($left > $up) & ($left > $down))
    KEYPRESS(#LEFT)
ELSE
    IF(($right > $left) & ($right > $up) & ($right > $down))
        KEYPRESS(#RIGHT)
    ELSE
        IF(($up > $left) & ($up > $right) & ($up > $down))
            KEYPRESS(#UP)
        ELSE
            IF(($down > $left) &($down > $right) & ($down > $up))
                KEYPRESS(#DOWN)
            ELSE
                LOGWRITE("Не нашли")
            END_IF
        END_IF
    END_IF
END_IF
WAITMS(100)

И если всегда совсем всё одинаково, можно определять цвет всего 4 пикселов. На скрине примерно пиксел для "Лево". Но для верности я бы прикрутил всё равно COLORMODE(8 )
« Last Edit: August 17, 2020, 04:18:57 PM by Vint »