Author Topic: поиск по картинке с игнорированием фона  (Read 2296 times)

0 Members and 1 Guest are viewing this topic.

lokipall

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

1)хочу что бы программа с экрана брала область с пятью иконками и распознавало их, нумеруя в массиве, что бы эти переменные потом использовать далее. файлы прикрепил для примера но не все.
Безымянный- область для распознавания
1,2,3- варианты
и вроде работает, пока я не пытаюсь игнорировать белый фон иконок:
Code: [Select]
#name "New Script"



$a=0
$b=1

GETSCREEN (12,151,530,225)//выбираем область для анализа экрана
FOR($a, $a < 5) //цикл на номер врага с лева на право от 1 до 5
$b=1 
$p[$a]=0
FOR($b, $b < 6)
IF_PICTURE_IN (12+$a*103,151,12+($a+1)*103,225, STRCONCAT("variant\",$b, ".bmp"), 16777215, 100)
WAITMS(100)
      $p[$a]=$b
  END_IF
END_CYC
print("враг №"$a," получает ", $p[$a]," мечей" )
END_CYC

 
     

на выходе всем дает значение 5
такой вариант работает правильно:
Code: [Select]
#name "New Script"



$a=0
$b=1

GETSCREEN (12,151,530,225)//выбираем область для анализа экрана
FOR($a, $a < 5) //цикл на номер врага с лева на право от 1 до 5
$b=1 
$p[$a]=0
FOR($b, $b < 6)
IF_PICTURE_IN (12+$a*103,151,12+($a+1)*103,225, STRCONCAT("variant\",$b, ".bmp"), -1, 100)
WAITMS(100)
      $p[$a]=$b
  END_IF
END_CYC
print("враг №"$a," получает ", $p[$a]," меченй" )
END_CYC

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


2) цветокорекция позволит сделать код универсальным для двух машин с одинаковой ОС, ну конечно при условии что идет привязка к окну по названию и координаты приводятся в соответствие. первый опыт показал что отснятые на одной машине скрины не подходят на второй. Да и какой показатель цветокорекции подойдет лучше
 

3) http://crapware.aidf.org/forum/index.php?topic=33.30 тут читал про :
Написание подпрограммы для вычисления даты
Пример создания пользовательских подпрограмм и их подключения через директиву include
такая конструкция у меня упорно не работает
а работает чуть другая форма:

Code: [Select]

SUB(loka)

  HINTPOPUP ("Нажмите CTRL для продолжения","Укажите локацию которую чистим")    //выводим всплывающее окно
  WHILE(iskeydown(#CTRL)=0)  //ждем пока не нажмут контрл
      WAITMS(20)
  END_CYC
  $lokx = $_xmouse //запоминаем координаты
  $loky = $_ymouse //запоминаем координаты
//WHILE(iskeydown(#CTRL)=1)
//   WAITMS(20)
//END_CYC
print ("кординаты локации(подпрограмма):  ",$lokx," ; ",$loky)


END_SUB


Code: [Select]
#name "gneci"

#include "loka.cms"   //подгружаю файл подпрограммы, файл ф той же папке что и скрипт имя -loka для определения целевой локации

//тут пропущу кусок кода он не к тому относится

 loka() // запускаю подпрограмму loka переменные в нее не передаются
   print("локация врага(осн)",$lokx,"; ",$loky)
 
//тут пропущу кусок кода он не к тому относится

 
halt // Точка выхода из скрипта

версия программы 4.12 это устаревшая безнадежно? или я опять чего то не понял? есле устаревшая, то кода на новую перенос вызовет большие трудности?

P.S. справку читал, гуглом пользовался, ответов не нашел. может просмотрел, может чукча :) :)


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: поиск по картинке с игнорированием фона
« Reply #1 on: December 21, 2016, 11:22:14 AM »
Версия кликера какая? Почему начальные значения не задаются в самом FOR?

По первому вопросу.
Если всё написано так как в посте, то должно работать. Такой результат как есть вижу только в двух случаях.
1. Если в скрипте по невнимательности строка IF_PICTURE_IN была повреждена (лишний параметр, не хватает или лишняя скобка), то условие IF не будет выполнятся совсем и тело условия будет работать всегда.
Как раз получим все последние значения.

2. Если при проверке случайно включил привязку, да ещё не к тому окну. То у нас GETSCREEN будет выдавать всё поле чёрным. Проигнорировав белый, на образцах ничего и нет кроме чёрного 0. Получаем что нашли все.

Ну проверь логами что находит, а что нет
Code: (clickermann) [Select]
GETSCREEN (12,151,530,225)//выбираем область для анализа экрана
FOR($a=0, $a < 5) //цикл на номер врага с лева на право от 1 до 5
    $p[$a]=0
    FOR($b=1, $b < 6)
        IF_PICTURE_IN (12+$a*103, 151, 12+($a+1)*103, 225, STRCONCAT("variant\",$b, ".bmp"), 16777215, 100)  // "
            print("нашли ", $b, "  в позиции ", $a)
            $p[$a]=$b
        ELSE
            print("НЕ нашли ", $b, "  в позиции ", $a)
        END_IF
    END_CYC
    print("враг №"$a," получает ", $p[$a]," мечей" )
END_CYC
« Last Edit: December 21, 2016, 11:26:16 AM by Vint »


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: поиск по картинке с игнорированием фона
« Reply #2 on: December 21, 2016, 11:39:03 AM »
2) цветокорекция позволит сделать код универсальным для двух машин с одинаковой ОС, ну конечно при условии что идет привязка к окну по названию и координаты приводятся в соответствие. первый опыт показал что отснятые на одной машине скрины не подходят на второй. Да и какой показатель цветокорекции подойдет лучше

Цветокоррекция помогает бороться с флуктуациями цвета. Она не всегда позволит сделать код универсальным для двух машин ДАЖЕ с одинаковой ОС.
Может быть разное разрешение экрана и соответственно разный размер окна игры. Для универсальности часто их нужно привести в один размер. Зависит от того как рендерится.
Даже на одном типе OC может быть включен разный режим сглаживания экранных шрифтов, что влияет, например на текст в Win и FLASH.

Ещё за масштабом проследить, чтоб 100% был везде.


Про 3 вопрос совсем не понятно. Что не работает? В "той" теме обсуждается не один вопрос и код не один. К тому же она очень... нет, ОЧЕНЬ старая и под старые версии.
4.12 - последняя релизная.
4.13 пока beta, там ошибок вагон.
4.11 тоже ничего, отличий мало. Я пользуюсь 4.11 в основном.
« Last Edit: December 21, 2016, 11:46:02 AM by Vint »


lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: поиск по картинке с игнорированием фона
« Reply #3 on: December 21, 2016, 03:47:44 PM »
Версия кликера какая? Почему начальные значения не задаются в самом FOR?

версия 4.12
начальные значения :o осознал исправляюсь
Quote
По первому вопросу.
Если всё написано так как в посте, то должно работать. Такой результат как есть вижу только в двух случаях.
1. Если в скрипте по невнимательности строка IF_PICTURE_IN была повреждена (лишний параметр, не хватает или лишняя скобка), то условие IF не будет выполнятся совсем и тело условия будет работать всегда.
Как раз получим все последние значения.
в пост копировал все с файлов полностью код файла созданного что бы проверить работоспособность этой конструкции и привязку тут не делал, она есть только в основном файле но он пока не тревожит

Quote
Ну проверь логами что находит, а что нет

Code: [Select]
GETSCREEN (12,151,530,225)//выбираем область для анализа экрана
FOR($a=0, $a < 5) //цикл на номер врага с лева на право от 1 до 5
    $p[$a]=0
    FOR($b=1, $b < 6)
        IF_PICTURE_IN (12+$a*103, 151, 12+($a+1)*103, 225, STRCONCAT("variant\",$b, ".bmp"), 16777215, 100)  // "
            print("нашли ", $b, "  в позиции ", $a)
            $p[$a]=$b
        ELSE
            print("НЕ нашли ", $b, "  в позиции ", $a)
        END_IF
    END_CYC
    print("враг №"$a," получает ", $p[$a]," мечей" )
END_CYC
halt
логи
[spoiler]
16:20:15 нашли 1  в позиции 0
16:20:15 нашли 2  в позиции 0
16:20:16 нашли 3  в позиции 0
16:20:16 нашли 4  в позиции 0
16:20:16 нашли 5  в позиции 0
16:20:16 враг №0 получает 5 мечей
16:20:17 нашли 1  в позиции 1
16:20:17 нашли 2  в позиции 1
16:20:18 нашли 3  в позиции 1
16:20:18 нашли 4  в позиции 1
16:20:18 нашли 5  в позиции 1
16:20:18 враг №1 получает 5 мечей
16:20:19 нашли 1  в позиции 2
16:20:19 нашли 2  в позиции 2
16:20:19 нашли 3  в позиции 2
16:20:20 нашли 4  в позиции 2
16:20:20 нашли 5  в позиции 2
16:20:20 враг №2 получает 5 мечей
16:20:21 нашли 1  в позиции 3
16:20:21 нашли 2  в позиции 3
16:20:21 нашли 3  в позиции 3
16:20:22 нашли 4  в позиции 3
16:20:22 нашли 5  в позиции 3
16:20:22 враг №3 получает 5 мечей
16:20:22 нашли 1  в позиции 4
16:20:22 нашли 2  в позиции 4
16:20:22 нашли 3  в позиции 4
16:20:22 нашли 4  в позиции 4
16:20:22 нашли 5  в позиции 4
16:20:22 враг №4 получает 5 мечей
[/spoiler]

Code: [Select]
GETSCREEN (12,151,530,225)//выбираем область для анализа экрана
FOR($a=0, $a < 5) //цикл на номер врага с лева на право от 1 до 5
    $p[$a]=0
    FOR($b=1, $b < 6)
        IF_PICTURE_IN (12+$a*103, 151, 12+($a+1)*103, 225, STRCONCAT("variant\",$b, ".bmp"), -1, 100)  // "
            print("нашли ", $b, "  в позиции ", $a)
            $p[$a]=$b
        ELSE
            print("НЕ нашли ", $b, "  в позиции ", $a)
        END_IF
    END_CYC
    print("враг №"$a," получает ", $p[$a]," мечей" )
END_CYC
halt
логи
[spoiler]16:21:39 НЕ нашли 1  в позиции 0
16:21:39 НЕ нашли 2  в позиции 0
16:21:39 нашли 3  в позиции 0
16:21:39 НЕ нашли 4  в позиции 0
16:21:39 НЕ нашли 5  в позиции 0
16:21:39 враг №0 получает 3 мечей
16:21:39 НЕ нашли 1  в позиции 1
16:21:39 нашли 2  в позиции 1
16:21:39 НЕ нашли 3  в позиции 1
16:21:39 НЕ нашли 4  в позиции 1
16:21:40 НЕ нашли 5  в позиции 1
16:21:40 враг №1 получает 2 мечей
16:21:40 НЕ нашли 1  в позиции 2
16:21:40 НЕ нашли 2  в позиции 2
16:21:40 НЕ нашли 3  в позиции 2
16:21:40 НЕ нашли 4  в позиции 2
16:21:40 нашли 5  в позиции 2
16:21:40 враг №2 получает 5 мечей
16:21:40 НЕ нашли 1  в позиции 3
16:21:40 нашли 2  в позиции 3
16:21:40 НЕ нашли 3  в позиции 3
16:21:40 НЕ нашли 4  в позиции 3
16:21:40 НЕ нашли 5  в позиции 3
16:21:40 враг №3 получает 2 мечей
16:21:41 НЕ нашли 1  в позиции 4
16:21:41 НЕ нашли 2  в позиции 4
16:21:41 НЕ нашли 3  в позиции 4
16:21:41 НЕ нашли 4  в позиции 4
16:21:41 НЕ нашли 5  в позиции 4
16:21:41 враг №4 получает 0 мечей
[/spoiler]

коды скопированы полностью без редактирования, логи разумеется тоже.  похоже проблема связана какраз с изображениями, но в чем именно понять не могу. после смены черного на синий цвет оба кода выдают одинаково верные логи
[spoiler]16:27:14 НЕ нашли 1  в позиции 0
16:27:15 НЕ нашли 2  в позиции 0
16:27:15 нашли 3  в позиции 0
16:27:15 НЕ нашли 4  в позиции 0
16:27:15 НЕ нашли 5  в позиции 0
16:27:15 враг №0 получает 3 мечей
16:27:16 НЕ нашли 1  в позиции 1
16:27:16 нашли 2  в позиции 1
16:27:16 НЕ нашли 3  в позиции 1
16:27:16 НЕ нашли 4  в позиции 1
16:27:17 НЕ нашли 5  в позиции 1
16:27:17 враг №1 получает 2 мечей
16:27:17 НЕ нашли 1  в позиции 2
16:27:17 НЕ нашли 2  в позиции 2
16:27:18 НЕ нашли 3  в позиции 2
16:27:18 НЕ нашли 4  в позиции 2
16:27:18 нашли 5  в позиции 2
16:27:18 враг №2 получает 5 мечей
16:27:18 НЕ нашли 1  в позиции 3
16:27:18 нашли 2  в позиции 3
16:27:19 НЕ нашли 3  в позиции 3
16:27:19 НЕ нашли 4  в позиции 3
16:27:19 НЕ нашли 5  в позиции 3
16:27:19 враг №3 получает 2 мечей
16:27:20 НЕ нашли 1  в позиции 4
16:27:20 НЕ нашли 2  в позиции 4
16:27:21 НЕ нашли 3  в позиции 4
16:27:21 НЕ нашли 4  в позиции 4
16:27:21 НЕ нашли 5  в позиции 4
16:27:21 враг №4 получает 0 мечей
[/spoiler]

Quote
...Зависит от того как рендерится.
Даже на одном типе OC может быть включен разный режим сглаживания экранных шрифтов, что влияет, например на текст в Win и FLASH.

 такого кода может хватить  для браузерной игрушки в неполноэкранном режиме при условии что диоганали разрешение и даже отношение сторон мониторов разное или я тут утопией занимаюсь и надо искать другой монитор?
Code: [Select]
#name "gneci"

#include "loka.cms"   //подгружаю файл подпрограммы, файл ф той же папке что и скрипт имя -loka для определения целевой локации



//тут я переменные всовываю

$HWnd = 0 // Дескриптор окна(указатель на окно)
DEFINE($xn , 0) // размер окна по горизонтали
DEFINE($yn , 0) //размер окна по вертикали
DEFINE($xmax , 1250) // размер окна по горизонтали
DEFINE($ymax , 920) //размер окна по вертикали
$HWnd = WNDFIND ("RPG TCG Жнецы душ") // ищем игру жнецы душь открытую в браузере  вкладка должна быть активной
wait(1)    // Ждем 1 сек.




//тут подготовка к запуску
 
if ($HWnd > 0)  // Проверяем нашлось ли окно
   WNDSTATE($HWnd, 1)  // разворачиваем окно
      WndPos ($HWnd,$xn,$yn) // Двигаем окно
   WaitMS(500)
 
   WndSize ($HWnd, $xmax, $ymax)   // Меняем его размер
WAITMS(300)
   
   
   MOVE($xmax-30,$yn+300)//ставлю курсор на пустое место
WAITMS(300)
   
   WHEELUP(10)   // колесиком прокручиваю полосу прокрутки вверх
WAITMS(300)
   
WHEELDOWN (1)// чуть прокручиваем вниз 3 строки текста)
   
         
   WaitMS(500)
   print("нашел окно") // в логах пишет если нашел нужное окно
   
   loka() // запускаю подпрограмму loka переменные в нее не передаются
   print("локация врага(осн)",$lokx,"; ",$loky)
   
ELSE
print("фигня с окном")  // не нашел окно
   WaitMS(500)
   
end_if
halt

Quote
Про 3 вопрос совсем не понятно. Что не работает? В "той" теме обсуждается не один вопрос и код не один. К тому же она очень... нет, ОЧЕНЬ старая и под старые версии.
http://crapware.aidf.org/forum/index.php?topic=33.msg708#msg708 вот точная ссылка на пост.
именно не понимаю  команды "GOSUB(UPDATE_DATE)" у меня с такой командой не работает код и даже полностью скопированый код приводимый в посте как пример у меня дает сомнительный результат(вернее отсутствие такового)
но судя по другим темам
http://crapware.aidf.org/forum/index.php?topic=2886.msg18843#msg18843
это и правда проблема версий программы
« Last Edit: December 21, 2016, 03:53:18 PM by lokipall »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: поиск по картинке с игнорированием фона
« Reply #4 on: December 21, 2016, 05:23:17 PM »
http://crapware.aidf.org/forum/index.php?topic=33.msg708#msg708 вот точная ссылка на пост.
именно не понимаю  команды "GOSUB(UPDATE_DATE)" у меня с такой командой не работает код и даже полностью скопированый код приводимый в посте как пример у меня дает сомнительный результат(вернее отсутствие такового)
но судя по другим темам
http://crapware.aidf.org/forum/index.php?topic=2886.msg18843#msg18843
это и правда проблема версий программы

Ну ты полез. Это приданье старины глубокой под версию максимум 4.5.
Это не "проблема". Вызов подпрограмм был изменён.
Quote
v4.9 (31.12.13)
+ Интерпретатор:
  + Изменения:
    + Изменен вид и вызов подпрограмм, теперь они поддерживают параметры
      ( callsub более не используется )

А с поиском... поздравляю! Ты нашёл баг. Баг проявляется на версиях 4.11 - 4.12, до этих версий всё нормально.
И только с чёрным цветом (не тестил).
Сам почти не применяю прозрачность, а если применял то с перекрашенным ядовито-зелёным аля Хромакей.
Вывод: не используй белый как цвет прозрачности или чистый чёрный как основной. Что там к чему надо тестить. Но проще исправить как было.
« Last Edit: December 21, 2016, 05:24:57 PM by Vint »


lokipall

  • Зашел в гости
  • *
  • Posts: 17
    • View Profile
Re: поиск по картинке с игнорированием фона
« Reply #5 on: December 21, 2016, 10:10:33 PM »
А с поиском... поздравляю! Ты нашёл баг. Баг проявляется на версиях 4.11 - 4.12, до этих версий всё нормально.
И только с чёрным цветом (не тестил).
Сам почти не применяю прозрачность, а если применял то с перекрашенным ядовито-зелёным аля Хромакей.
Вывод: не используй белый как цвет прозрачности или чистый чёрный как основной. Что там к чему надо тестить. Но проще исправить как было.
спасибо за подсказки и мысли к размышлению, к стати, сейчас кода и логов не сохранилось, может завтра попробую поймать снова но по-моему с чисто черным баг проявляется даже когда на цветном изображении ищешь, тоесть если область экрана содержит разнообразный ресунок но искомая картинка содержит только черный цвет и игнорируемый фон, то он будет везде показывать что результат поиска положительный. эт если я не путаю результат одного из неудачных своих циклов

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: поиск по картинке с игнорированием фона
« Reply #6 on: December 22, 2016, 06:05:27 PM »
lokipall награда нашла своего героя!

медаль "Антибаг" II степени.
« Last Edit: December 22, 2016, 06:07:25 PM by Vint »