Author Topic: Анализ текста в окне  (Read 134895 times)

0 Members and 6 Guests are viewing this topic.

Валера Л

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Анализ текста в окне
« Reply #60 on: May 14, 2016, 02:43:54 PM »
mы шуmuшь?  уберu ф5, u все будеm  нормально! нашел же проблему..
 я показал как можно нарезаmь бысmро u не вручную, дальше дело за малым  собраmь все в одно чuсло

Не! Не шучу!
Я кроме русского,белорусского и церковно-славянского, других языков не знаю.
Я так понимаю ф5-это " TFWRITE($cmd, "chcp 1251>nul") "

Кликермен

  • Активный участник
  • ***
  • Posts: 112
    • View Profile
Re: Анализ текста в окне
« Reply #61 on: May 14, 2016, 03:08:52 PM »
mы шуmuшь?  уберu ф5, u все будеm  нормально! нашел же проблему..
 я показал как можно нарезаmь бысmро u не вручную, дальше дело за малым  собраmь все в одно чuсло

Не! Не шучу!
Я кроме русского,белорусского и церковно-славянского, других языков не знаю.
Я так понимаю ф5-это " TFWRITE($cmd, "chcp 1251>nul") "
KEYPRESS(#F5)

Валера Л

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Анализ текста в окне
« Reply #62 on: May 17, 2016, 10:27:45 PM »
Не! Не шучу!
Я кроме русского,белорусского и церковно-славянского, других языков не знаю.
Я так понимаю ф5-это " TFWRITE($cmd, "chcp 1251>nul") "
[/quote]
KEYPRESS(#F5)
[/quote]

Запускал скрипт. Как-то странно он работает.
Записывает одни 1, а при следующем запуске, пишет одни 6.

Валера Л

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Анализ текста в окне
« Reply #63 on: May 17, 2016, 10:49:19 PM »
Господа, кликерманы!
Помогите, мне, правильно написать команды.
С горем-пополам составил скрипт. Но он работает не так как-бы хотелось-бы:

LCLICK(794,732)
WAITMS(200)
LCLICK(778,610)  // 4375039
WAITMS(200)
LCLICK(719,287)  // 196821
end

COLORG(52224)
LCLICK(889,105)
WAIT(0,05)
end   

Объясню, какую цель я преследую:
Первые, две, команды работают по координатам.
После того как они сработают, всплывает окно, либо в красном контуре, либо в зеленом.
Вот их,я бы хотел, что-бы скрипт распознавал по цветам и закрывал.
Я пытался изобразить, но получилась чихня.
Курсор прыгает по всем координатам.
Я так понимаю надо прописывать условия, а как?
Спасибо.


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Анализ текста в окне
« Reply #64 on: May 18, 2016, 08:52:57 AM »
end - такой команды в кликере нет, нечего писать всякий мусор.
COLORG(52224) - эта функция извлекает зеленый канал из цвета в десятеричном формате. Тебе такое не нужно.
WAIT(0,05) - здесь ошибка в запятой, нужно писать точку. Или просто WAITMS(50)

В данном случаи используется комбинированное условие из двух функций проверки цвета по координате. Укажи правильно координату рамки и цвета.
Code: (clickermann) [Select]
LCLICK(794,732)
WAITMS(200)
LCLICK(778,610)  // 4375039
WAITMS(200)
LCLICK(719,287)  // 196821
WAITMS(600)

GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF((PXL(100,100) = 255)|(PXL(100,100) = 52224)) // координата и цвет зеленого и красного
   LCLICK(889,105)
   WAITMS(500)
END_IF

Валера Л

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Анализ текста в окне
« Reply #65 on: May 18, 2016, 03:55:21 PM »
end - такой команды в кликере нет, нечего писать всякий мусор.
COLORG(52224) - эта функция извлекает зеленый канал из цвета в десятеричном формате. Тебе такое не нужно.
WAIT(0,05) - здесь ошибка в запятой, нужно писать точку. Или просто WAITMS(50)

В данном случаи используется комбинированное условие из двух функций проверки цвета по координате. Укажи правильно координату рамки и цвета.
Code: (clickermann) [Select]
LCLICK(794,732)
WAITMS(200)
LCLICK(778,610)  // 4375039
WAITMS(200)
LCLICK(719,287)  // 196821
WAITMS(600)

GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF((PXL(100,100) = 255)|(PXL(100,100) = 52224)) // координата и цвет зеленого и красного
   LCLICK(889,105)
   WAITMS(500)
END_IF


Вот, спасибо!!!!!
Все работает.
Правда я сделал некоторые изменения.
Почему?
Потому что, всплывающие окна находятся на разных уровнях.
Получилось вот так:
LCLICK(792,737)  // 7959563
WAITMS(20)
LCLICK(791,610)  // 255
WAITMS(800)

 
GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF((PXL(343,302) = 3748071) // координата и цвет красного
   LCLICK(724,320)  // 15623680
   WAITMS(500) 
END_IF

IF(PXL(168,122) = 52224)) // координата и цвет зеленого
    LCLICK(891,140)  // 15623680
    WAITMS(500)
END_IF

У меня еще есть вопрос: " Как код нарезки интегрировать в код скрипта?"
Тоже надо начинать с "IF"?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Анализ текста в окне
« Reply #66 on: May 18, 2016, 07:33:55 PM »
поправочка, лишние скобки в условии.
Code: (clickermann) [Select]
LCLICK(792,737)  // 7959563
WAITMS(20)
LCLICK(791,610)  // 255
WAITMS(800)

GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF(PXL(343,302) = 3748071) // координата и цвет красного
   LCLICK(724,320)  // 15623680
   WAITMS(500)
END_IF

IF(PXL(168,122) = 52224) // координата и цвет зеленого
   LCLICK(891,140)  // 15623680
   WAITMS(500)
END_IF

Валера Л

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Анализ текста в окне
« Reply #67 on: May 18, 2016, 10:00:35 PM »
поправочка, лишние скобки в условии.
Code: (clickermann) [Select]
LCLICK(792,737)  // 7959563
WAITMS(20)
LCLICK(791,610)  // 255
WAITMS(800)

GETSCREEN // снимок экрана в буфер кликера для последующего анализа
IF(PXL(343,302) = 3748071) // координата и цвет красного
   LCLICK(724,320)  // 15623680
   WAITMS(500)
END_IF

IF(PXL(168,122) = 52224) // координата и цвет зеленого
   LCLICK(891,140)  // 15623680
   WAITMS(500)
END_IF


Спасибо, исправлю.
А как на счет интеграции кода нарезки, в код скрипта?
Как его, правильно, интегрировать?

Валера Л

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Анализ текста в окне
« Reply #68 on: May 19, 2016, 12:48:35 PM »
что подразумевается под термином нарезка?

Я подразумеваю вот это:

 "....а образцы цифр ловят в скрины с мониторов и вырезают в паинте до нужного размера, как сало на ломтики. ;D"

пыс. Что то мне перестали приходить уведомления, с форы.
         В связи с чем не могу своевременно реагировать на ответы
« Last Edit: May 19, 2016, 06:42:32 PM by Валера Л »

Валера Л

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Анализ текста в окне
« Reply #69 on: May 20, 2016, 05:43:18 PM »
Всем привет.
"Разделка","вырезка", "нарезка вырезки". Решил я обойти эту "кулинарную" тему.
Сделаю шаблоны своими руками,в редакторе.
К примеру в "паинте".
В связи с чем пытаюсь научить скрипт обращаться в файл, в котором хранятся шаблоны, и определять нужную комбинацию.

Надеюсь на помощь крутых Кликермэнов
Может кто поможет?

Пример шаблона:




« Last Edit: May 20, 2016, 06:42:27 PM by Валера Л »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Анализ текста в окне
« Reply #70 on: May 21, 2016, 09:28:31 AM »
Вот написал более короткий скрипт распознавания любых символов. Пробелы не учитываются!
Code: (clickermann) [Select]
#name "Распознавание символов v1.0"

SUB(An, $let, $pict)
   SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, $pict, -1, 100)
   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
      ARRPUSH($ARR_OUT, $let)
   END_CYC
   UNDEFINE($ARR_SCAN)
END_SUB

// область распознавания
$x1 = 222 // верхний левый угол
$y1 = 592

$x2 = 302 // нижний правый
$y2 = 615

GETSCREEN
An("0","Letters\0.bmp")
An("1","Letters\1.bmp")
An("2","Letters\2.bmp")
An("3","Letters\3.bmp")
An("4","Letters\4.bmp")
An("5","Letters\5.bmp")
An("6","Letters\6.bmp")
An("7","Letters\7.bmp")
An("8","Letters\8.bmp")
An("9","Letters\9.bmp")

$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)
      $str = STRCONCAT($str, $ARR_OUT[$a+1])
   ELSE
      $str = $ARR_OUT[$a+1]
   END_IF   
END_CYC
UNDEFINE($ARR_OUT)
LOGWRITE ($str) // в $str выводятся распознанные символы

HALT
« Last Edit: May 21, 2016, 09:36:39 AM by Oraven »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Анализ текста в окне
« Reply #71 on: May 21, 2016, 03:20:39 PM »
Улучшенный скрипт для версии 4.12 кликера.

Теперь скрипт сам определяет символ по первому символу из имени картинки. Нужно лишь нарезать картинки символов и обозвать их соответствующим образом.
К сожалению пока на 4.12 функция GETFILELIST работает крайне плохо. В большинстве случаев просто не возвращает имена файлов поэтому пока от него мало толку.

Code: (clickermann) [Select]
#name "Распознавание символов v1.1"
// для версии кликера v4.12+

SUB(recognize, $x1,$y1, $x2,$y2)
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   GETSCREEN($x1,$y1, $x2,$y2)
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), -1, 100)
      FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
         ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
         $Let = STRCUT($Letters_arr[$Let_num], 1, 1)
         SWITCH($Let)
         CASE(".") // решение проблемы точки
            ARRPUSH($ARR_OUT, "..")
         DEFAULT
            ARRPUSH($ARR_OUT, $Let)
         END_SWITCH
      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 = STRREPLACE(STRCONCAT($str, $ARR_OUT[$a+1]), "..", ".")
      ELSE
         $str = STRREPLACE($ARR_OUT[$a+1], "..", ".")
      END_IF
     
   END_CYC
   UNDEFINE($ARR_OUT)
   // в $str выводятся распознанные символы
END_SUB


recognize(673,437, 738,454) // область распознавания
LOGWRITE ($str)
recognize(24,192, 165,222) // область распознавания
LOGWRITE ($str)

HALT

Скрипт для 4.13 версии
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
recognize(147,783, 219,809, -1, 100) // область распознавания, цвет прозрачности, процент совпадения
LOGWRITE ($str) // в переменную $str выводятся распознанные символы

HALT

В данном примере реализован независимый процент совпадения для каждого символа.
Параметры пишутся непосредственно в имени файла.
Например "0_84.bmp" означает что символ для поиска "0" а процент совпадения "84"
Code: (clickermann) [Select]
// требуемая версия 4.13 и выше

SUB(recognize, $x1,$y1, $x2,$y2) // описание подпрограммы пишем вначале скрипта
   GETFILELIST($Letters_arr, "Letters\*.bmp")
   FOR($Let_num=0,$Let_num<ARRSIZE($Letters_arr))
      STRSEPARATE($Letters_arr[$Let_num], "_", $a_l)
      SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, STRCONCAT("Letters\", $Letters_arr[$Let_num]), -1, STRREPLACE($a_l[ARRSIZE($a_l)-1],".bmp",""))
      UNDEFINE($a_l)
      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] > 50) // определение пробела (сколько пикселов между символами считать за пробел)
            $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)
   UNDEFINE($ARR_SCAN)
END_SUB

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


// вызов подпрограммы распознавания
GETSCREEN
COLORMODE(6)
recognize(100,100, 400,400) // область распознавания
LOGWRITE($str) // переменная с результатом (смотрим лог)

HALT
« Last Edit: September 08, 2019, 10:15:31 AM by Oraven »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Анализ текста в окне
« Reply #72 on: May 21, 2016, 05:47:13 PM »
вот тебе еще вариант, взял отсюда http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743 , на представленных тобой двух картинках работает отлично.
код немного подредактировал, вынес переменные уровня цветокоррекции и цвета цифр.
Code: (clickermann) [Select]
#name "ReCapcha"

SUB(pos_size)
   UNDEFINE($num_line_start)
   UNDEFINE($num_line_end)
   UNDEFINE($num_real)
   UNDEFINE($num_y1)
   UNDEFINE($num_y2)
   
   GETSCREEN($x1_fr,$y1_fr,$x2_fr,$y2_fr)
   COLORMODE($clmod,$x1_fr,$y1_fr,$x2_fr,$y2_fr)
   
   
   scanpxl($cap_arr,$x1_fr,$y1_fr,$x2_fr,$y2_fr, $num_color)
   IF(ARRSIZE ($cap_arr) = 0)
      print("капчи в этом поле нету")
      halt
   END_IF
   $y1_cap=$cap_arr[1]
   $y2_cap=ARRPOP($cap_arr)
   
   
   FOR($x=$x1_fr,$x<$x2_fr)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         
         IF(pxl($x,$y) = $num_color)
            $x1_cap= $x

            $y=$y2_cap+1
            $x=$x2_fr
         END_IF
      END_CYC
   END_CYC
   
   FOR($x=$x2_fr,$x>$x1_fr,-1)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         IF(pxl($x,$y) = $num_color)
            $x2_cap= $x
            $y=$y2_cap+1
            $x=$x1_fr
         END_IF
      END_CYC
   END_CYC
   
   //print($x1_cap," ",$y1_cap," ",$x2_cap," ",$y2_cap)
   //=======================================
   
   ARRPUSH ($num_line_start, $x1_cap)
   FOR($x=$x1_cap,$x<$x2_cap)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         IF(pxl($x,$y)  = $num_color)
            IF((pxl($x+1,$y)  = $num_color)|(pxl($x+1,$y-1) =$num_color)|(pxl($x+1,$y+1) = $num_color))
               $y=999999
            END_IF
         END_IF
         
      END_CYC
      IF($y=$y2_cap+1)
         ARRPUSH ($num_line_end, $x)
         FOR($x_check=$x+1,$x_check<$x2_cap)
            FOR($y_check=$y1_cap,$y_check<$y2_cap+1)
               IF(pxl($x_check,$y_check)  = $num_color)
                  $x= $x_check
                  ARRPUSH ($num_line_start, $x)
                  $y_check=$y2_cap+1
                  $x_check=$x2_cap
               END_IF
            END_CYC
         END_CYC
      END_IF
   END_CYC
   ARRPUSH ($num_line_end, $x2_cap)
   
   //===================================
   
   FOR($num=0,$num<arrsize($num_line_start))
      FOR($y=$y1_cap,$y<$y2_cap)
         FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
            IF(pxl($x,$y)  = $num_color)
               ARRPUSH($num_y1,$y)
               $y=99999
               $x=$num_line_end[$num]+1
            END_IF
         END_CYC
      END_CYC
   END_CYC
   
   FOR($num=0,$num<arrsize($num_line_start))
      FOR($y=int($y2_cap),$y>$y1_cap,-1)
         FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
            IF(pxl($x,$y)  = $num_color)
               ARRPUSH($num_y2,$y)
               $y=$y1_cap
               $x=$num_line_end[$num]+1
            END_IF
         END_CYC
      END_CYC
   END_CYC
   print("=====================")
   print("найдено цифр в поле - ",arrsize($num_line_start))
   
   
   //   FOR($a=0,$a<arrsize($num_line_start))
   //      print($num_line_start[$a],",",$num_y1[$a],",",$num_line_end[$a],",",$num_y2[$a])
   //   END_CYC
END_SUB

//=============================================
SUB(side)
   FOR($num=0,$num<arrsize($num_line_start))
      $step =($num_y2[$num]-$num_y1[$num])/4
     
      FOR($a=0,$a<4)
         IF_PIXEL_IN($num_line_start[$num],$num_y1[$num]+ROUND(($step*$a),0),$num_line_end[$num],$num_y1[$num]+ROUND(($step*$a),0),$num_color)
            $x=$_return1
         END_IF
         
         IF_PIXEL_IN($num_line_start[$num],$num_y1[$num]+ROUND(($step*($a+1)),0),$num_line_end[$num],$num_y1[$num]+ROUND(($step*($a+1)),0),$num_color)
            IF($x-$_return1=0)
               ARRPUSH ($side, 0)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)>2)
                  ARRPUSH ($side, -1)
               else
                  IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)>0)
                     ARRPUSH ($side, -2)
                  END_IF
               END_IF
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)<-2)
                  ARRPUSH ($side, 1)
               else
                  IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)<0)
                     ARRPUSH ($side, 2)
                  END_IF
               END_IF
            END_IF
         else
            ARRPUSH ($side, 0)
         END_IF
         
         FOR($e=$num_line_end[$num],$e>$num_line_start[$num],-1)
            IF(pxl($e,$num_y1[$num]+ROUND(($step*$a),0)) = $num_color)
               $x=$e
               $e=$num_line_start[$num]
            END_IF
         END_CYC
         FOR($e=$num_line_end[$num],$e>$num_line_start[$num],-1)
            IF(pxl($e,$num_y1[$num]+ROUND(($step*($a+1)),0)) = $num_color)
               $xs=$e
               $e=$num_line_start[$num]
            END_IF
         END_CYC
         
         IF($x-$xs=0)
            ARRPUSH ($side, 0)
         else
            IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)>2)
               ARRPUSH ($side, -1)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)>0)
                  ARRPUSH ($side, -2)
               END_IF
            END_IF
            IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)<-2)
               ARRPUSH ($side, 1)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)<0)
                  ARRPUSH ($side, 2)
               END_IF
            END_IF
         END_IF
         
      END_CYC
     
      print("-------------")
     
      $side_str = $side[0]
      FOR($b=1,$b<arrsize($side))
         $side_str = STRCONCAT ($side_str,":",$side[$b])
      END_CYC
      //  print($side_str)
     
      FOR($c=0,$c<10)
         
         FOR($n=1,$n<TFCOUNT(STRCONCAT("num_",$c))+1)
            STRSEPARATE (TFREAD (STRCONCAT("num_",$c),$n), ":", $temp_arr)
           
            FOR($i=0,$i<8)
               IF(int($temp_arr[$i]) ! int($side[$i]))
                  $i=999
               END_IF
            END_CYC
            IF($i < 999)
               print("цифра ", $num+1," это ",$c)
               ARRPUSH ($num_fin,$c)
               ARRPUSH ($cap_all_arr,$c)
               $n=TFCOUNT(STRCONCAT("num_",$c))+1
               $c=10
            END_IF
            UNDEFINE($temp_arr)
         END_CYC
      END_CYC
     
      IF(arrsize($num_fin)<1)
         print("цифра ",$num+1," не распознана")
         $n_file = INPUTBOX(STRCONCAT("введи цифру которая в капче под номером ",$num+1), 0, 120)
         IF($n_file = "")
            halt
         END_IF
         ARRPUSH ($cap_all_arr,$n_file)
         TFWRITE (STRCONCAT("num_",$n_file), $side_str)
      END_IF
     
      UNDEFINE($side)
      UNDEFINE($num_fin)
   END_CYC
   
   $cap_all_str = $cap_all_arr[0]
   FOR($a=1,$a<arrsize($cap_all_arr))
      $cap_all_str = STRCONCAT ($cap_all_str,$cap_all_arr[$a])
   END_CYC
   print("-------------")
   print($cap_all_str)
   print(" ")
   
END_SUB
//=============================================
//=============================================
//=============================================
$clmod = 7  //уровень коррекции цвета
$num_color = 8388607     //цвет цифр при указанном выше уровне цветокоррекции.


$x1_fr=325     // координаты поля с капчей (целиком, то что белое)
$y1_fr=395
$x2_fr=369
$y2_fr=419


pos_size()      // определение границ цифр в капче

side()     //распознаватель

//в этоге мы имеем массив с цифрами  $cap_all_arr
//и строку  $cap_all_str


halt

обучение не сложное. всегото нужно прописать координаты твоей картинки с числом, без знака "%". точку данный код определит как цифру, это не проблема. обучаеш точку под цифру 1 например (я так и сделал)
первая твоя картинка к примеру будет выглядеть так
Code: [Select]
17:34:31 найдено цифр в поле - 4
17:34:31 -------------
17:34:31 цифра 1 это 6
17:34:31 -------------
17:34:31 цифра 2 это 1
17:34:31 -------------
17:34:31 цифра 3 это 1
17:34:31 -------------
17:34:31 цифра 4 это 5
17:34:31 -------------
17:34:31 6115
дальше уже понятно что предпоследняя цифра "1" это точка, с помощью функций работы со строками заменишь уже сам. или если тебе не важно что после точки, то пропишешь границы твоего числа до точки, 2 знака.


если же тебе это всеравно покажется сложным, предоставь на форуме картинки всех цифр, можно в разнобой, я обучу и дам тебе нужные файлы.
« Last Edit: May 21, 2016, 05:56:57 PM by dramster »

Валера Л

  • Зашел в гости
  • *
  • Posts: 14
    • View Profile
Re: Анализ текста в окне
« Reply #73 on: May 23, 2016, 11:49:47 AM »
вот тебе еще вариант, взял отсюда http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743 , на представленных тобой двух картинках работает отлично.
код немного подредактировал, вынес переменные уровня цветокоррекции и цвета цифр.
Code: (clickermann) [Select]
#name "ReCapcha"

SUB(pos_size)
   UNDEFINE($num_line_start)
   UNDEFINE($num_line_end)
   UNDEFINE($num_real)
   UNDEFINE($num_y1)
   UNDEFINE($num_y2)
   
   GETSCREEN($x1_fr,$y1_fr,$x2_fr,$y2_fr)
   COLORMODE($clmod,$x1_fr,$y1_fr,$x2_fr,$y2_fr)
   
   
   scanpxl($cap_arr,$x1_fr,$y1_fr,$x2_fr,$y2_fr, $num_color)
   IF(ARRSIZE ($cap_arr) = 0)
      print("капчи в этом поле нету")
      halt
   END_IF
   $y1_cap=$cap_arr[1]
   $y2_cap=ARRPOP($cap_arr)
   
   
   FOR($x=$x1_fr,$x<$x2_fr)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         
         IF(pxl($x,$y) = $num_color)
            $x1_cap= $x

            $y=$y2_cap+1
            $x=$x2_fr
         END_IF
      END_CYC
   END_CYC
   
   FOR($x=$x2_fr,$x>$x1_fr,-1)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         IF(pxl($x,$y) = $num_color)
            $x2_cap= $x
            $y=$y2_cap+1
            $x=$x1_fr
         END_IF
      END_CYC
   END_CYC
   
   //print($x1_cap," ",$y1_cap," ",$x2_cap," ",$y2_cap)
   //=======================================
   
   ARRPUSH ($num_line_start, $x1_cap)
   FOR($x=$x1_cap,$x<$x2_cap)
      FOR($y=$y1_cap,$y<$y2_cap+1)
         IF(pxl($x,$y)  = $num_color)
            IF((pxl($x+1,$y)  = $num_color)|(pxl($x+1,$y-1) =$num_color)|(pxl($x+1,$y+1) = $num_color))
               $y=999999
            END_IF
         END_IF
         
      END_CYC
      IF($y=$y2_cap+1)
         ARRPUSH ($num_line_end, $x)
         FOR($x_check=$x+1,$x_check<$x2_cap)
            FOR($y_check=$y1_cap,$y_check<$y2_cap+1)
               IF(pxl($x_check,$y_check)  = $num_color)
                  $x= $x_check
                  ARRPUSH ($num_line_start, $x)
                  $y_check=$y2_cap+1
                  $x_check=$x2_cap
               END_IF
            END_CYC
         END_CYC
      END_IF
   END_CYC
   ARRPUSH ($num_line_end, $x2_cap)
   
   //===================================
   
   FOR($num=0,$num<arrsize($num_line_start))
      FOR($y=$y1_cap,$y<$y2_cap)
         FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
            IF(pxl($x,$y)  = $num_color)
               ARRPUSH($num_y1,$y)
               $y=99999
               $x=$num_line_end[$num]+1
            END_IF
         END_CYC
      END_CYC
   END_CYC
   
   FOR($num=0,$num<arrsize($num_line_start))
      FOR($y=int($y2_cap),$y>$y1_cap,-1)
         FOR($x=$num_line_start[$num],$x<$num_line_end[$num]+1)
            IF(pxl($x,$y)  = $num_color)
               ARRPUSH($num_y2,$y)
               $y=$y1_cap
               $x=$num_line_end[$num]+1
            END_IF
         END_CYC
      END_CYC
   END_CYC
   print("=====================")
   print("найдено цифр в поле - ",arrsize($num_line_start))
   
   
   //   FOR($a=0,$a<arrsize($num_line_start))
   //      print($num_line_start[$a],",",$num_y1[$a],",",$num_line_end[$a],",",$num_y2[$a])
   //   END_CYC
END_SUB

//=============================================
SUB(side)
   FOR($num=0,$num<arrsize($num_line_start))
      $step =($num_y2[$num]-$num_y1[$num])/4
     
      FOR($a=0,$a<4)
         IF_PIXEL_IN($num_line_start[$num],$num_y1[$num]+ROUND(($step*$a),0),$num_line_end[$num],$num_y1[$num]+ROUND(($step*$a),0),$num_color)
            $x=$_return1
         END_IF
         
         IF_PIXEL_IN($num_line_start[$num],$num_y1[$num]+ROUND(($step*($a+1)),0),$num_line_end[$num],$num_y1[$num]+ROUND(($step*($a+1)),0),$num_color)
            IF($x-$_return1=0)
               ARRPUSH ($side, 0)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)>2)
                  ARRPUSH ($side, -1)
               else
                  IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)>0)
                     ARRPUSH ($side, -2)
                  END_IF
               END_IF
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)<-2)
                  ARRPUSH ($side, 1)
               else
                  IF(($num_line_end[$num]-$num_line_start[$num])/($x-$_return1)<0)
                     ARRPUSH ($side, 2)
                  END_IF
               END_IF
            END_IF
         else
            ARRPUSH ($side, 0)
         END_IF
         
         FOR($e=$num_line_end[$num],$e>$num_line_start[$num],-1)
            IF(pxl($e,$num_y1[$num]+ROUND(($step*$a),0)) = $num_color)
               $x=$e
               $e=$num_line_start[$num]
            END_IF
         END_CYC
         FOR($e=$num_line_end[$num],$e>$num_line_start[$num],-1)
            IF(pxl($e,$num_y1[$num]+ROUND(($step*($a+1)),0)) = $num_color)
               $xs=$e
               $e=$num_line_start[$num]
            END_IF
         END_CYC
         
         IF($x-$xs=0)
            ARRPUSH ($side, 0)
         else
            IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)>2)
               ARRPUSH ($side, -1)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)>0)
                  ARRPUSH ($side, -2)
               END_IF
            END_IF
            IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)<-2)
               ARRPUSH ($side, 1)
            else
               IF(($num_line_end[$num]-$num_line_start[$num])/($x-$xs)<0)
                  ARRPUSH ($side, 2)
               END_IF
            END_IF
         END_IF
         
      END_CYC
     
      print("-------------")
     
      $side_str = $side[0]
      FOR($b=1,$b<arrsize($side))
         $side_str = STRCONCAT ($side_str,":",$side[$b])
      END_CYC
      //  print($side_str)
     
      FOR($c=0,$c<10)
         
         FOR($n=1,$n<TFCOUNT(STRCONCAT("num_",$c))+1)
            STRSEPARATE (TFREAD (STRCONCAT("num_",$c),$n), ":", $temp_arr)
           
            FOR($i=0,$i<8)
               IF(int($temp_arr[$i]) ! int($side[$i]))
                  $i=999
               END_IF
            END_CYC
            IF($i < 999)
               print("цифра ", $num+1," это ",$c)
               ARRPUSH ($num_fin,$c)
               ARRPUSH ($cap_all_arr,$c)
               $n=TFCOUNT(STRCONCAT("num_",$c))+1
               $c=10
            END_IF
            UNDEFINE($temp_arr)
         END_CYC
      END_CYC
     
      IF(arrsize($num_fin)<1)
         print("цифра ",$num+1," не распознана")
         $n_file = INPUTBOX(STRCONCAT("введи цифру которая в капче под номером ",$num+1), 0, 120)
         IF($n_file = "")
            halt
         END_IF
         ARRPUSH ($cap_all_arr,$n_file)
         TFWRITE (STRCONCAT("num_",$n_file), $side_str)
      END_IF
     
      UNDEFINE($side)
      UNDEFINE($num_fin)
   END_CYC
   
   $cap_all_str = $cap_all_arr[0]
   FOR($a=1,$a<arrsize($cap_all_arr))
      $cap_all_str = STRCONCAT ($cap_all_str,$cap_all_arr[$a])
   END_CYC
   print("-------------")
   print($cap_all_str)
   print(" ")
   
END_SUB
//=============================================
//=============================================
//=============================================
$clmod = 7  //уровень коррекции цвета
$num_color = 8388607     //цвет цифр при указанном выше уровне цветокоррекции.


$x1_fr=325     // координаты поля с капчей (целиком, то что белое)
$y1_fr=395
$x2_fr=369
$y2_fr=419


pos_size()      // определение границ цифр в капче

side()     //распознаватель

//в этоге мы имеем массив с цифрами  $cap_all_arr
//и строку  $cap_all_str


halt

обучение не сложное. всегото нужно прописать координаты твоей картинки с числом, без знака "%". точку данный код определит как цифру, это не проблема. обучаеш точку под цифру 1 например (я так и сделал)
первая твоя картинка к примеру будет выглядеть так
Code: [Select]
17:34:31 найдено цифр в поле - 4
17:34:31 -------------
17:34:31 цифра 1 это 6
17:34:31 -------------
17:34:31 цифра 2 это 1
17:34:31 -------------
17:34:31 цифра 3 это 1
17:34:31 -------------
17:34:31 цифра 4 это 5
17:34:31 -------------
17:34:31 6115
дальше уже понятно что предпоследняя цифра "1" это точка, с помощью функций работы со строками заменишь уже сам. или если тебе не важно что после точки, то пропишешь границы твоего числа до точки, 2 знака.


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

Спасибо!
Наконец-то у меня выходные.
Пытаюсь разобраться.
Что-то мой W10 не распознает язык
Пишет вот такое:

 =====================
11:24:18 ??????? ???? ? ???? - 1
11:24:18 -------------
11:26:56 =====================
11:26:56 ??????? ???? ? ???? - 1
11:26:56 -------------
11:27:07 ????? 1 ?? ??????????
11:27:15 -------------
11:27:15 0
11:27:15 
11:27:42 =====================
11:27:42 ??????? ???? ? ???? - 1
11:27:42 -------------
11:28:04 =====================
11:28:04 ??????? ???? ? ???? - 1
11:28:05 -------------
11:38:58 =====================
11:38:58 ??????? ???? ? ???? - 1
11:38:58 -------------
11:41:03 =====================
11:41:03 ??????? ???? ? ???? - 1
11:41:03 -------------
11:41:10 ????? 1 ??? 0
11:41:10 -------------
11:41:10 0
11:41:10 
11:41:12 =====================
11:41:12 ??????? ???? ? ???? - 1
11:41:12 -------------
11:42:55 ????? ? ???? ???? ????
11:45:12 =====================
11:45:12 ??????? ???? ? ???? - 1
11:45:12 -------------
11:46:03 =====================
11:46:03 ??????? ???? ? ???? - 1
11:46:03 -------------
« Last Edit: May 23, 2016, 12:14:00 PM by Валера Л »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Анализ текста в окне
« Reply #74 on: May 23, 2016, 02:18:34 PM »
Ну и в чем проблема то, сделай 10 картинок цифр и точку и вперед.

Вот для 4.11 версии с учетом точки
Code: (clickermann) [Select]
#name "Распознавание символов v1.0.1"
// для версии кликера v4.11

SUB(An, $let, $pict)
   SCANPICTURE($ARR_SCAN, $x1,$y1, $x2,$y2, $pict, -1, 100)
   FOR($arr_num=0,$arr_num<ARRSIZE($ARR_SCAN),2)
      ARRPUSH($ARR_OUT, $ARR_SCAN[$arr_num])
      SWITCH($Let)
      CASE(".") // решение проблемы точки
         ARRPUSH($ARR_OUT, "..")
      DEFAULT
         ARRPUSH($ARR_OUT, $Let)
      END_SWITCH
   END_CYC
   UNDEFINE($ARR_SCAN)
END_SUB

// область распознавания
$x1 = 292 // верхний левый угол
$y1 = 586

$x2 = 442 // нижний правый
$y2 = 631

GETSCREEN
An("0","Letters\0.bmp")
An("1","Letters\1.bmp")
An("2","Letters\2.bmp")
An("3","Letters\3.bmp")
An("4","Letters\4.bmp")
An("5","Letters\5.bmp")
An("6","Letters\6.bmp")
An("7","Letters\7.bmp")
An("8","Letters\8.bmp")
An("9","Letters\9.bmp")
An(".","Letters\.0.bmp")

$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)
      $str = STRREPLACE(STRCONCAT($str, $ARR_OUT[$a+1]), "..", ".")
   ELSE
      $str = STRREPLACE($ARR_OUT[$a+1], "..", ".")
   END_IF
END_CYC
UNDEFINE($ARR_OUT)
LOGWRITE ($str) // в $str выводятся распознанные символы

HALT