Author Topic: Поиск изображений одного типа. Переход на другое.  (Read 6224 times)

0 Members and 1 Guest are viewing this topic.

thedim

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Здравствуйте Форумчане.
У меня есть две картинки, предположим "Цветочек.bmp" и "Черепашка.bmp", Цветочков или Черепашек может и не быть на экране, схема выглядит примерно так:

1. Ищем на экране "Цветочек.bmp"
2. Кликаем на него.
3. Ищем другой на экране "Цветочек.bmp"
4. Кликаем на него.
5. Ищем другой на экране "Цветочек.bmp"
Мы кликнули на все изображения "Цветочек.bmp"....

6. Ищем "Черепашка.bmp" (все тоже самое)
7. И все по новой.

Code: (clickermann) [Select]
GETSCREEN

IF_PICTURE_IN(0,0, $_xmax,$_ymax, "Цветочек.bmp")
   LCLICK($_return1, $_return2)
   WAIT(1)
END_IF

IF_PICTURE_IN(0,0, $_xmax,$_ymax, "Черепашка.bmp")
   LCLICK($_return1, $_return2)
   WAIT(1)
END_IF

Все мои знания ограничиваются пока что только на этом... Если не затруднит, подскажите как можно это осуществить. Заранее Спасибо.
« Last Edit: September 22, 2013, 12:49:46 PM by thedim »

mjkl

  • Освоившийся
  • **
  • Posts: 38
    • View Profile
Code: (clickermann) [Select]
$pct1="1.bmp" //  нарезал 2 пикта
$pct2="2.bmp" // 25 на 25 пикселей
$pct0=$pct1 // задал название файла впеременную
$n=27 // когда будет найдено изображение начало области поиска будет сдвинуто,
$n1=27 // оносительно верхнего левого угла найденого объект вправо, а конец обласи вниз - оба на 27 пкс
BEGIN0:
$x0=0
$y0=0
BEGIN:
GETSCREEN
COLORMODE(7, $x0,$y0, $_xmax,$_ymax) // можно без цветокорреции
IF_PICTURE_IN($x0,$y0, $_xmax,$_ymax, $pct0, -1,80) // -1 цвет прозрачности, 80 - % совпадения (не обязательно)
   $pct=1 // если найдено изображение пишем переменную
   $x0=$_return1+$n // собсно +27
   $y1=$_return2+$n1 // и здеся
   LCLICK($_return1+5, $_return2+5) // +5 пкс вправо и вниз отн. левого верхнего угла объекта
   WAIT(1) //
   WHILE($pct=1) // начал цикл, т.к. $pct=1
      GETSCREEN
      COLORMODE(7, $x0,$y0, $_xmax,$y1)
      IF_PICTURE_IN($x0,$y0, $_xmax,$y1, $pct0, -1,80)
         $x0=$_return1+$n
         $y1=$_return2+$n1
         LCLICK($_return1+5, $_return2+5)
         WAIT(1)
      ELSE
         $y0=$y1-13 // шаг поиска (вниз) на 14 пкс относительно последнего найденого объекта
         $x0=0 // расширить область поиска влево до упора
         $pct=0 // сброс цикла
      END_IF
   END_CYC // закончил цикл, если $pct не равно 1
   GOTO(BEGIN) // идем к ...
ELSE
   IF($pct0=$pct1)
      $pct0=$pct2 // второе изображение для поиска
      GOTO(BEGIN0) // идем к ...
   ELSE
      HALT
   END_IF
END_IF // проверил, правда картинка типа обои, объекты были в рядах, и даже не шахматкой, но нашло все поочереди
Вот, пинайте

Code: (clickermann) [Select]
GETSCREEN
COLORMODE(7, $x0,$y0, $_xmax,$_ymax)
Лучше оставить один и вынести вначало, после указания $x0  и $y0, это сделает поиск быстрее.
« Last Edit: September 23, 2013, 07:12:40 PM by mjkl »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Все это скоро станет куда проще. Как только джонни допилит тестовую версию, там уже можно находить все картинки на экране.

thedim

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Спасибо mjkl, попробую осмыслить и применить на практике.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Спасибо mjkl, попробую осмыслить и применить на практике.
Вот ещё один вариант, которым я пользовался. Можешь осмыслить.
Ищет всё без пропусков. С колормодом и без. С процентом. Можно всё настроить.
оформлено в подпрограмму.
Code: (clickermann) [Select]
// где ищем:
$xres1=0
$yres1=0
$xres2=$_xmax
$yres2=$_ymax

$colormode=0 // colormod 0-Нет, 1-Да
$percent=100 // процент совпадения
$sizeX_image=7 // ширина картинки
$sizeY_image=7 // высота картинки

$image="Цветочек.bmp" // картинка 1
GOSUB(poisk_click)

$image="Черепашка.bmp" // картинка 2
GOSUB(poisk_click)


//HALT


//==============================================================================
SUB(poisk_click) //========== poisk_click ======================================
   
   $temp=""
   $amount_resurs=0
   $start_time=$_ms
   $sres = 0
   MOVE($_xmax,$_ymax)
   WAITMS(50)
   GETSCREEN
   IF($colormode=1)
      COLORMODE(7,$xres1,$yres1,$xres2,$yres2)
   END_IF
   
   IF_PICTURE_IN($xres1,$yres1,$xres2,$yres2,$image,-1,$percent)
      $clresx = $_return1
      $clresy = $_return2
      //LOGWRITE ("clresx = ",$clresx,", clresy = ",$clresy)
      $temp=STRCONCAT($clresx,":",$clresy)
      INC($amount_resurs)
     
      WHILE($sres = 0)
         $sres2 = 0
         
         WHILE($sres2 = 0)
            $clresx=$clresx+$sizeX_image // следующая точка за найденной
            IF($clresx<$xres2+1) // контроль последнего столбца
               IF_PICTURE_IN($clresx,$clresy,$xres2,$clresy+$sizeY_image,$image,-1,$percent)
                  IF($_return2 = $clresy)
                     $clresx = $_return1
                     $clresy = $_return2
                     //LOGWRITE ("clresx = ",$clresx,", clresy = ",$clresy)
                     
                     GOSUB(проверка_уникальности)
                     IF($nelzya=0)
                        $temp=STRCONCAT($clresx,":",$clresy,":",$temp)
                        INC($amount_resurs)
                     END_IF
                     
                     IF($clresx+1>$xres2) // контроль последнего столбца
                        $sres2 = 1
                     END_IF
                  ELSE
                     $clresx = $_return1
                  END_IF
               ELSE
                  $sres2 = 1
               END_IF
            ELSE
               $sres2 = 1
            END_IF
         END_CYC

         $clresy=$clresy+1       // следующая линия
         IF($clresy<$yres2+1) // контроль последней линии
            IF_PICTURE_IN($xres1,$clresy,$xres2,$yres2,$image,-1,$percent)
               $clresx = $_return1
               $clresy = $_return2
               //LOGWRITE ("clresx = ",$clresx,", clresy = ",$clresy)
               
               GOSUB(проверка_уникальности)
               IF($nelzya=0)
                  $temp=STRCONCAT($clresx,":",$clresy,":",$temp)
                  INC($amount_resurs)
               END_IF
            ELSE
               $sres = 1
            END_IF
         ELSE
            $sres = 1
         END_IF
      END_CYC
   END_IF
   
   LOGWRITE ("temp = ",$temp)
   LOGWRITE ("Найдено изображений = ",$amount_resurs)
   LOGWRITE("Время поиска: ",$_ms-$start_time," мс.")
   LOGWRITE (" ")
   HINTPOPUP("Найдено изображений = ",$amount_resurs)
   $amount_resurs=0
   WAIT(1)
   
   GOSUB(собираем)
   MOVE($_xmax,$_ymax)
   WAITMS(50)
END_SUB

//==============================================================================
SUB(проверка_уникальности) //========  проверка уникальности  ==================
   $nelzya=0
   $cut=$temp
   WHILE(STRLEN($cut)!0)
      $x1=INT(STRCUT2($cut,1,STRPOS($cut,":")-1))
      $cut=STRCUT2($cut,STRPOS($cut,":")+1,99999)
     
      IF(INT(STRPOS($cut,":"))!0)
         $y1=INT(STRCUT2($cut,1, STRPOS ($cut,":")-1))
         $cut=STRCUT2($cut,STRPOS($cut,":")+1,99999)
      ELSE
         $y1=INT($cut)
         $cut=""
      END_IF
     
      IF($clresy>$y1+$sizeY_image) // если ниже последней найденной + размер
         $cut="" // прерываем поиск
      ELSE
         IF(($clresx>$x1-1) & ($clresx<$x1+$sizeX_image+1) & ($clresy>$y1-1) & ($clresy<$y1+$sizeY_image+1))
            $cut="" // прерываем поиск
            $nelzya=1
         END_IF
      END_IF
     
   END_CYC
END_SUB

//==============================================================================
SUB(собираем) //========== собираем ============================================
   $cut=$temp
   WHILE(STRLEN($cut)!0)
      $x1=INT(STRCUT2($cut,1,STRPOS($cut,":")-1))
      $cut=STRCUT2($cut,STRPOS($cut,":")+1,99999)
     
      IF(INT(STRPOS($cut,":"))!0)
         $y1=INT(STRCUT2($cut,1, STRPOS ($cut,":")-1))
         $cut=STRCUT2($cut,STRPOS($cut,":")+1,99999)
      ELSE
         $y1=INT($cut)
         $cut=""
      END_IF
      WAITMS(50)
     
      MOVE($x1,$y1)
      WAITMS(50)
      LDOWN($x1,$y1)
      WAITMS(50)
      LUP($x1,$y1)
      WAITMS(50)
   END_CYC
END_SUB

//==============================================================================

Это для общего развития. Новая версия работает почти в 3 раза быстрее и займёт десяток строк.


thedim

  • Зашел в гости
  • *
  • Posts: 9
    • View Profile
Спасибо Vint за помощь, обязательно тоже твой скрипт попробую! С тем скриптом все что нужно было тоже получилось. Спасибо Вам еще раз за помощь парни!  ;)