Author Topic: Сравнение картинок в определенной области окна  (Read 6467 times)

0 Members and 1 Guest are viewing this topic.

Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
Столкнулся с проблемой не могу сделать простое сравнение картинок.
Выполняются определенные действия и после сканируется область
и при совпадении области выдает определенное сообщение в трее

*Ранее задумка была на сравнение картинок и выдачи определенного действия
*стравнение с 2я катинками со воими действиями  (если не совпадают)
*сравнение с  другими картинками +-15 штук (если не совпадают)
*сделать скриншот и сообщить о  появлении новой картинки
*BEEP(*,*) просто не  работает,  хотя  динамик отменно пищит при рестарте  компьютера ???

Но так как просто тестовый код не получается сделать рабочим и  обратился к вам за помошью 
Code: [Select]

WAIT(2)
//=============================================
GETSCREEN
COLORMODE(8, 692, 428, 709, 435) //для точного отображения эмблемы (черный фон белые эмблемы)

IF_PICTURE_IN (692, 428, 709, 435, "[pref]0000.bmp", 0, 0) {
 HINTPOPUP ("   -   ")
 halt
 }
IF_PICTURE_IN (692, 428, 709, 435, "[pref]0001.bmp", 0, 0) {
 HINTPOPUP ("   1   ")
 halt
 }
IF_PICTURE_IN (692, 428, 709, 435, "[pref]0002.bmp", 0, 0) {
 HINTPOPUP ("   2   ")
 halt
 }
IF_PICTURE_IN (692, 428, 709, 435, "[pref]0003.bmp", 0, 0) {
 HINTPOPUP ("   3   ")
 halt
 }
IF_PICTURE_IN (692, 428, 709, 435, "[pref]0004.bmp", 0, 0) {
 HINTPOPUP ("  4   ")
 halt
 }
else
 screenshotex(692, 428, 709, 435, ["pref"])
 HINTPOPUP ("   Новый скрин!!!   ")
 halt
 BEEP(800,200) 
END_IF
В этом коде выполняется первое условие, даже  если картинка не совпадает.


Эмблемы скринил так
Code: [Select]
$hwnd = 1313920

getscreen
COLORMODE(8, 692, 428, 708, 435)        //цветокоррекциядо 2х цветов
screenshotex(692, 428, 708, 435, ["pref"])

halt           // for single run

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Код совершенно неверен.

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

Code: (clickermann) [Select]
GETSCREEN
$hash1 = PXLCRC(692,428, 709,435) // снимаем хеш с области
WAIT(1)
// действия


GETSCREEN
$hash2 = PXLCRC(692,428, 709,435) // снимаем хеш с области
IF($hash1 = $hash2) // сравниваем
   HALT
END_IF


В чем твои ошибки, в справке квадратные скобки указывают на необязательные параметры. Сами скобки конечно не пишут.
{} - вот это вообще не из этой оперы :o
Твой код правильно пишется так:
Code: (clickermann) [Select]
WAIT(2)
//=============================================
GETSCREEN
COLORMODE(8, 692, 428, 709, 435) //для точного отображения эмблемы (черный фон белые эмблемы)

IF_PICTURE_IN (692, 428, 709, 435, "screens\Image_0000.bmp", -1, 100)
   HINTPOPUP ("   -   ")
   halt
END_IF

IF_PICTURE_IN (692, 428, 709, 435, "screens\Image_0001.bmp", -1, 100)
   HINTPOPUP ("   1   ")
   halt
END_IF

IF_PICTURE_IN (692, 428, 709, 435, "screens\Image_0002.bmp", -1, 100)
   HINTPOPUP ("   2   ")
   halt
END_IF

IF_PICTURE_IN (692, 428, 709, 435, "screens\Image_0003.bmp", -1, 100)
   HINTPOPUP ("   3   ")
   halt
END_IF

IF_PICTURE_IN (692, 428, 709, 435, "screens\Image_0004.bmp", -1, 100)
   HINTPOPUP ("  4   ")
   halt
else
   screenshotex(692, 428, 709, 435, "Image_", 0)
   HINTPOPUP ("   Новый скрин!!!   ")
   BEEP(800,200)
   halt
END_IF

А это что?
Code: (clickermann) [Select]
$hwnd = 1313920тупо записал число 1313920 в переменную $hwnd ??? а зачем?

quant13

  • Активный участник
  • ***
  • Posts: 174
    • View Profile
разумеется выполняется условие
у тебя IF_PICTURE_IN (692, 428, 709, 435, "[pref]0004.bmp", 0, 0)

IF_PICTURE_IN (x, y, x2, y2, "file", [bgcolor], [currency]) - производит поиск изображения в прямоугольной области буфера анализа
currency - необязательный параметр; точность поиска в процентах (1..99)

задал 0% точность, оно и совпадает с чем угодно если точность не нужна, потому и выполняется условие

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Вот тот скрипт который ты хотел.
Полный автомат, сам сравнивает, сам скриншотит.
Чтобы кликер знал с каким количеством картинок работать, счетчик записывает значение в файл "config.ini"

Code: (clickermann) [Select]
IF(TFCOUNT("config.ini")>0)
   $Image_count_s = INT(INIREAD("config.ini", "Image_count_s"))
ELSE
   $Image_count_s = 0
   INIWRITE("config.ini", "Image_count_s", "0")
END_IF

$check = 0
GETSCREEN
COLORMODE(8, 692, 428, 709, 435)
WHILE($check = 0)
   $len = STRLEN($gen)
   IF($len < 1)
      $gen2 = STRCONCAT ("0000", $gen)
   Else
      IF($len < 2)
         $gen2 = STRCONCAT ("000", $gen)
      Else
         IF($len < 3)
            $gen2 = STRCONCAT ("00", $gen)
         Else
            IF($len < 4)
               $gen2 = STRCONCAT ("0", $gen)
            Else
               $gen2 = $gen
            END_IF
         END_IF
      END_IF
   END_IF
   INC($gen,1)
   $num = $gen2
   
   INC($Image_count,1)
   IF($Image_count > $Image_count_s)
      $check = 1
   ELSE
      IF_PICTURE_IN (692, 428, 709, 435, STRCONCAT("screens\Image_", $num,".bmp"), -1, 100)
         HINTPOPUP ("   -   ")
         halt
      END_IF
   END_IF
   
END_CYC

IF($check = 1)
   INIWRITE("config.ini", "Image_count_s", $Image_count)
   screenshotex(692, 428, 709, 435, "Image_", 0)
   HINTPOPUP ("   Новый скрин!!!   ")
   BEEP(800,200)
   WAIT(1)
   halt
END_IF
« Last Edit: November 08, 2014, 07:01:11 PM by Oraven »

Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
Код совершенно неверен.

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

Хеш конечно хорошо, но я до работы с ним еще не добрался, не знаю как его сохранить на  определенные переменные.

В чем твои ошибки, в справке квадратные скобки указывают на необязательные параметры. Сами скобки конечно не пишут.
{} - вот это вообще не из этой оперы :o

Каюсь грешон приплел скобочки неподумавши а 2ые  с С++ и подумал авось поможет.

А это что?
Code: (clickermann) [Select]
$hwnd = 1313920тупо записал число 1313920 в переменную $hwnd ??? а зачем?
$hwnd привязка к окну, на  момент тестов hwnd в коде был равен $hwnd окну.

Спасибо что тыкнули носом!
Передумал код в корне почитал функции и решил перекидать тест код

Для точности написал вот этот код и  использовал перед созданием скринов, и проверкой кода работает отменно
[spoiler]
Code: [Select]
$hwnd = 270424
$W = 1440
$h = 900
hsettext($hwnd, "Hammp") //Çàãîëîâîê îêíà
WNDSIZE ($hwnd, $w, $h) //Ðàçìåð îêíà
WNDPOS ($hwnd, 0, 0)        //Ðàñïîëîæåíèå îêíà
WAIT(3)                      //Çàäåðæêà
WNDBUMP($hwnd) //Îêíî íà ïåðåäíèé ïëàí
hset($hwnd, 1) //Îêîííûé ðåæèì
WAIT(1)                      //Çàäåðæêà
#ps2_keyboard //ïåðâîä ñèñòåìíûõ ñèãíàëîâ ìûøè â ïñ2(ÍÅ ÈÇÌÅÍßÒÜ ÇÍÀ×ÅÍÈÅ)
KEYDOWN (#ALT)                //Ñáðîñ íàñòðîåê îêîí
KEYPRESS (#L)                //Ðàáîòàåò
KEYUP (#ALT)
WAIT(2)                       //Çàäåðæêà

halt
[/spoiler]

сам код с  которым  ну никак разобраться не могу
картинки уже все от скринены в папочке лежат но не хотят проверяться
[spoiler]
Code: [Select]
$hwnd = 270424
$pref="textures\pref" //настройка пути к скинам

//$x1 = 699          //эталонные значения положения скринов
//$y1 = 429
//$x2 = 705
//$y2 = 438

$a = 4

$x1 = 681                       //значения области в  которой  искать совпадения
$y1 = 416
$x2 = 719
$y2 = 454

GETSCREEN
COLORMODE(8, 680, 415, 720, 455)   // область которую перевести в черно белый
WAIT(1)

FOR ($i=0, $i < $a)
IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"), -1, 100)      //поиск картинки в прямоугольной области (фон задаю как черный тоже не помогает)
HINTPOPUP ("   ----------- +"$i   )               //не выводится

if($i > 0 & $i < $a)
WAIT(3)
HINTPOPUP ("   èè "$i   )
end_if

if($i = 0)
HINTPOPUP (" 000000000000 ")
WAITMS(300)
end_if
end_if
        INC($i, 1)
END_CYC
[/spoiler]

А самое веселое что вот этот код работал вчера вечером как задуманно выше хъотя
 не должно было рабочее состояние кода забыл засейвить
[spoiler]
Code: [Select]
$pref="textures\pref" // ??????? ???? ?????? ? ???????

$x1 = 699         
$y1 = 429
$x2 = 705
$y2 = 438

GETSCREEN
COLORMODE(8, 699, 429, 705, 438)

FOR ($i=0, $i=6, 1)
IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"))
if($_return1 = $x1)
HINTPOPUP ("   ??????? ?? $i   ")
else
HINTPOPUP ("   $i   ")
end_if


END_CYC
[/spoiler]

Еще один тест и ноль эмоций, ну что то вообще не хочет оно находить картинки хоть убей
[spoiler]
Code: [Select]
$hwnd = 270424
$pref="textures\pref" // ??????? ???? ?????? ? ???????

//$x1 = 699          //эталонные значения положения скринов
//$y1 = 429
//$x2 = 705
//$y2 = 438

$x1 = 690       //область поиска сходств
$y1 = 420
$x2 = 710
$y2 = 440

//$zatochka

GETSCREEN
COLORMODE(8, 695, 415, 715, 445)
//screenshotex(699, 429, 705, 438, "pref") //повторно перескринил и добавил в текстуры

WAIT(1)

FOR ($i=0, $i>6) //функция
IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"))   //поиск в прямоуголнике (пробовал и , -1, 90  и , 0, 90)
if($i > 0)
HINTPOPUP ("   ??????? ?? $i   ")
//goto(delay) //отправка на   действия
else
HINTPOPUP ("   $i   ")
//HALT
end_if
INC($i, 1)
    WAIT(1)
END_IF
END_CYC
//=========
HALT
[/spoiler]

По поводу вашего автоматического кода  самого скринящего и проверяющего
Я пока с кодом не  разобрался, в  начеле  застопорился на понимании логики
Пока не пойму я  его и  использовать не  смогу*(
А вот вашь код с перебором  цыфр в играх мне помог.
« Last Edit: November 09, 2014, 01:12:08 PM by mrGod »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Хеш суммы можно записывать в файл. и потом в цикле читать строки и сравнивать значение. Так куда проще. Я не знаю ведь что ты там делаешь. Зачем например COLORMODE(8) ?

Теперь про ошибки:
Неверный код
Code: (clickermann) [Select]
HINTPOPUP ("   ----------- +"$i   )
HINTPOPUP ("   èè "$i   )
 
Правильно так
Code: (clickermann) [Select]
HINTPOPUP (STRCONCAT("   ----------- +", $i))
Еща ошибка
Code: (clickermann) [Select]
if($i > 0 & $i < $a)Верный код
Code: (clickermann) [Select]
if(($i > 0) & ($i < $a))
« Last Edit: November 09, 2014, 01:32:24 PM by Oraven »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Исправленный код.
Кстати к сведению, цикл FOR сам наращивает переменную $i
и надеюсь картинки у тебя называются "pref0.bmp" "pref1.bmp" "pref2.bmp" и тд.

Code: (clickermann) [Select]
$hwnd = 270424
$pref="textures\pref" //настройка пути к скинам

//$x1 = 699          //эталонные значения положения скринов
//$y1 = 429
//$x2 = 705
//$y2 = 438

$a = 4

$x1 = 681                       //значения области в  которой  искать совпадения
$y1 = 416
$x2 = 719
$y2 = 454

GETSCREEN
COLORMODE(8, $x1, $y1, $x2, $y2)   // область которую перевести в черно белый
WAIT(1)

FOR($i=0, $i < $a)
   IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"), -1, 100)      //поиск картинки в прямоугольной области (фон задаю как черный тоже не помогает)
      HINTPOPUP (STRCONCAT("   ----------- +", $i))               //не выводится
     
      if(($i > 0) & ($i < $a))
         WAIT(3)
         HINTPOPUP (STRCONCAT("   ии ", $i))
      end_if
     
      if($i = 0)
         HINTPOPUP (" 000000000000 ")
         WAITMS(300)
      end_if
   end_if
END_CYC
« Last Edit: November 09, 2014, 01:42:48 PM by Oraven »

Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
Не ошибки а функции вывода в трее сообщения, работаю в  нескольких редакторах.

Еща ошибка
Code: (clickermann) [Select]
if($i > 0 & $i < $a)Верный код
Code: (clickermann) [Select]
if(($i > 0) & ($i < $a))
Вот спасибо напомнил за скобки, давно я не писал код  по забывал основы.
И методом проб и ошибок я все таки нашел в чем ошибки.
До
Code: (clickermann) [Select]
//FOR ($i=0, $i>6) //ôóíêöèÿ
// IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"))   //ïîèñê â ïðÿìîóãîëíèêå (ïðîáîâàë è , -1, 90  è , 0, 90)
// if($i > 0)
// HINTPOPUP ("   ??????? ?? $i   ")
// //goto(delay) //îòïðàâêà íà   äåéñòâèÿ
// else
// HINTPOPUP ("   $i   ")
// //HALT
// end_if
// INC($i, 1)
//    WAIT(1)
// END_IF
//END_CYC

После
Code: (clickermann) [Select]
FOR ($i=0, $i < 5, 1)
  HINTPOPUP ("   Proverka № +"$i   )
WAIT(3)
IF_PICTURE_IN ($x1,$y1,$x2,$y2, STRCONCAT($pref,$i,".bmp"))
HINTPOPUP (" Функции поиска работает "$i   )             
if($i > 0 & $i < 6)
WAIT(3)
HINTPOPUP (" Пойман №"$i   )
                                goto(lasso)
end_if

if($i = 0)
HINTPOPUP (" Искать следующего ")
WAIT(3)
                                HALT
end_if
end_if
END_CYC
Както не  важно тут спойлеры  работают
« Last Edit: November 09, 2014, 01:51:57 PM by mrGod »

Srsk

  • Зашел в гости
  • *
  • Posts: 17
  • Да дурак, а кто спорит?
    • View Profile
STRCONCAT
Нужно ведь использовать в том  случае если идет текс переменная текст и.т.п, и нужно объединение ибо кликермэн не понимает.
А в моем случает идет текст и переменная кликермэн понимает, но  думаю  да  все таки с моей стороны это помарка(Пример не очень правильного кода).
Тоже возьму на вооружение спасибо.
Всем спасибо большое за участие и помошь в расстолковании моих ошибок.
Отдельное спасибо Oraven.
Тему закрываю.
« Last Edit: November 09, 2014, 01:54:42 PM by mrGod »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Да скажи спасибо такому умному интерпретатору который вместо ругани проглатывает текст+переменная  ;D
Но разбор такого неправильного кода замедляет работу и может приводить к ошибкам.