Author Topic: Распознавание цифр в небольшой области с условием.  (Read 2575 times)

0 Members and 2 Guests are viewing this topic.

HuanMatus

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
В общем, нужен кликер, суть которого сводится к следующему:

1. Распознавание числа в небольшой области (числа с точкой).
2. Если число < N, то *это я уже сделаю сам*.

Устал работать с поиском по картинке, это долго, трудно и негибко. Подскажите, с чего начать?

Oraven

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

HuanMatus

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
http://crapware.aidf.org/forum/index.php?topic=88.msg16221#msg16221

Решил использовать это:
Code: [Select]
SUB(recognize, $x1,$y1, $x2,$y2, $c_ignor, $prc)
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), $c_ignor, $prc)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         ARRPUSH($ARR_OUT, STRCUT($Letters_arr[$Let_num], 1, 1))
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
      IF(STRLEN($str) > 0)
         IF($ARR_OUT[$a]-$ARR_OUT[$a-2] > 10) // обпределение пробела
            $str = STRCONCAT($str, " ")
         END_IF
         $str = STRCONCAT($str, $ARR_OUT[$a+1])
      ELSE
         $str = $ARR_OUT[$a+1]
      END_IF
   END_CYC
   UNDEFINE($ARR_OUT)
END_SUB
 
 
GETSCREEN
recognize(147,783, 219,809, -1, 100) // область распознавания, цвет прозрачности, процент совпадения
LOGWRITE ($str) // в переменную $str выводятся распознанные символы
 
HALT

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

HuanMatus

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
http://crapware.aidf.org/forum/index.php?topic=88.msg16221#msg16221


Разобрался. Проблема теперь с тем, что скрипт не определяет цифры после точки.
Например, «3.2» он отображает как «3.», аналогично и с другими. Что делать?

HuanMatus

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
http://crapware.aidf.org/forum/index.php?topic=88.msg16221#msg16221


Разобрался. Проблема теперь с тем, что скрипт не определяет цифры после точки.
Например, «3.2» он отображает как «3.», аналогично и с другими. Что делать?


Разобрался с этим. Ок, как теперь работать с $str?
«IF $str < 28» как-то не хочет работать. С этим я уже не разберусь, помогите пожалуйста.

HuanMatus

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Код:

Code: [Select]
GETSCREEN
WAITMS(28)
IF_PICTURE_IN (272,623, 373,660, "search.bmp", -1, 100)
   MOVE(390,641)
   LCLICK(345,640)
   WAITMS(13)
   MOVE(427,634)
   WAITMS(12)
END_IF

SUB(recognize, $x1,$y1, $x2,$y2, $c_ignor, $prc)
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), $c_ignor, $prc)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         ARRPUSH($ARR_OUT, STRCUT($Letters_arr[$Let_num], 1, 1))
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
      IF(STRLEN($str) > 0)
         IF($ARR_OUT[$a]-$ARR_OUT[$a-2] > 10) // обпределение пробела
            $str = STRCONCAT($str, " ")
         END_IF
         $str = STRCONCAT($str, $ARR_OUT[$a+1])
      ELSE
         $str = $ARR_OUT[$a+1]
      END_IF
   END_CYC
   UNDEFINE($ARR_OUT)
END_SUB
 
 
GETSCREEN
recognize(621,340, 667,360, -1, 50) // область распознавания, цвет прозрачности, процент совпадения
LOGWRITE ($str) // в переменную $str выводятся распознанные символы

IF $str < 2.8
MOVE(617,331)
   WAITMS(59)
   MOVE(624,329)
   WAITMS(48)
   LCLICK(625,328)
   WAITMS(551)
   MOVE(583,404)
   WAITMS(64)
   MOVE(626,404)
   WAITMS(72)
   LCLICK(626,404)
   WAITMS(421)
END_IF
WAITMS(75)

IF($time < $_time_t)
   $time = $_time_t + 60
KEYPRESS(#U)
WAITMS(150)
KEYPRESS(#U)
WAITMS(150)   
END_IF


1. Скрипт делает снимок экрана, ищет кнопку и нажимает её.
2. Определение числа в области.
3. Если число меньше N, то всякие махинации мышью.
4. Каждые 60 секунд окно открывается-закрывается.

В таком виде код выбивает ошибку "количество открывающих операторов не совпадает с количеством закрывающих". Буду признателен за помощь в исправлении.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Разобрался с этим. Ок, как теперь работать с $str?
«IF $str < 28» как-то не хочет работать. С этим я уже не разберусь, помогите пожалуйста.

Синтаксис описан в справке. Не говоря уже что в скрипте выше есть примеры условий.
Code: (clickermann) [Select]
IF($str < 28)
LOGWRITE ("Меньше 28")
END_IF

HuanMatus

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Разобрался с этим. Ок, как теперь работать с $str?
«IF $str < 28» как-то не хочет работать. С этим я уже не разберусь, помогите пожалуйста.

Синтаксис описан в справке. Не говоря уже что в скрипте выше есть примеры условий.
Code: (clickermann) [Select]
IF($str < 28)
LOGWRITE ("Меньше 28")
END_IF


Code: [Select]
MOVE(617,331)
   WAITMS(59)
   MOVE(624,329)
   WAITMS(48)
   LCLICK(625,328)
   WAITMS(551)
   MOVE(583,404)
   WAITMS(64)
   MOVE(626,404)
   WAITMS(72)
   LCLICK(626,404)
   WAITMS(421)

Эти действия не выполняются после условия, даже если $str действительно меньше 28. Как правильно задать условие?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Code: (clickermann) [Select]
SUB(recognize, $x1,$y1, $x2,$y2, $c_ignor, $prc)
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), $c_ignor, $prc)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         ARRPUSH($ARR_OUT, STRCUT($Letters_arr[$Let_num], 1, 1))
      END_CYC
      UNDEFINE($ARR_SCAN)
   END_CYC
   $siz = ARRSIZE($ARR_OUT)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-2,($a>0)&($srt=0),-2)
      FOR($b=0,$b<$a,2)
         IF($ARR_OUT[$b] > $ARR_OUT[$b+2])
            $srtcheck = 1
            $tmp = $ARR_OUT[$b]
            $tmp2 = $ARR_OUT[$b+1]
            $ARR_OUT[$b] = $ARR_OUT[$b+2]
            $ARR_OUT[$b+1] = $ARR_OUT[$b+3]
            $ARR_OUT[$b+2] = $tmp
            $ARR_OUT[$b+3] = $tmp2
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC
   $str = ""
   FOR($a=0,$a<ARRSIZE($ARR_OUT),2)
      IF(STRLEN($str) > 0)
         IF($ARR_OUT[$a]-$ARR_OUT[$a-2] > 10) // обпределение пробела
            $str = STRCONCAT($str, " ")
         END_IF
         $str = STRCONCAT($str, $ARR_OUT[$a+1])
      ELSE
         $str = $ARR_OUT[$a+1]
      END_IF
   END_CYC
   UNDEFINE($ARR_OUT)
END_SUB

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

GETSCREEN
IF_PICTURE_IN (272,623, 373,660, "search.bmp", -1, 100)
   MOVE(390,641)
   LCLICK(345,640)
   WAITMS(13)
   MOVE(427,634)
   WAITMS(12)
END_IF

GETSCREEN
recognize(621,340, 667,360, -1, 50) // область распознавания, цвет прозрачности, процент совпадения
LOGWRITE ($str) // в переменную $str выводятся распознанные символы

IF ($str < 2.8)
   MOVE(617,331)
   WAITMS(59)
   MOVE(624,329)
   WAITMS(48)
   LCLICK(625,328)
   WAITMS(551)
   MOVE(583,404)
   WAITMS(64)
   MOVE(626,404)
   WAITMS(72)
   LCLICK(626,404)
   WAITMS(421)
END_IF
WAITMS(75)

IF($time < $_time_t)
   $time = $_time_t + 60
   KEYPRESS(#U)
   WAITMS(150)
   KEYPRESS(#U)
   WAITMS(150)
END_IF