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

0 Members and 1 Guest are viewing this topic.

gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Анализ текста в окне
« Reply #105 on: August 11, 2017, 01:37:08 AM »
Пытаюсь настроить под себя и разобраться с алгоритмом  Распознавание чисел 1.5.cms
Строка  102: $dead_size = ARRSIZE($dead)
Но ведь переменной $dead до этого никак не вводили и значение ей не задавали. Единственное что мы делаем, это _в_конце (!) цикла применяем UNDEFINE($dead).
Откуда в таком случае получается размер массива ARRSIZE($dead) ?

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Анализ текста в окне
« Reply #106 on: August 11, 2017, 08:05:48 AM »
$dead это массив, и да вначале он равен 0 и цикл будет пропущен. Но потом идет формирование этого массива если $dead_zone = 0 и на следующем круге FOR($j=0, $j < $a_scansize, 2) $dead_size уже не будет равна 0
Code: (clickermann) [Select]
         IF($dead_zone = 0)
            ARRPUSH($dead, $X)
            ARRPUSH($dead, $Y)
            ARRPUSH($data, $X)
            ARRPUSH($data, $i)

gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Анализ текста в окне
« Reply #107 on: August 14, 2017, 12:26:31 AM »
Извините, если не в тему  :( . Программка Portable ABBYY Screenshot Reader, весит всего 25м. Можно заставить кликер "таскать" руку для выделения зоны распознавания, результат (в зависимости от настроек) попадает в буфер обмена. Очень неплохо распознает текст, даже не горизонтальный (см. примеры в прицепе)! А вот если бы научиться передавать ей параметры зоны распознавания вместо графического выделения!!! Может кто "подломит"?  ;)

Попробовал, да весело распознает ;)
только если так приспособить:
переключаемся на окно с текстом
KEYPRESS R
выделяем область
KEYPRESS ENTER
распознанный текст в буфере
А для начинающего подробней можно, как это все запрограммировать?
...попробовал Portable ABBYY Screenshot Reader вручную - строку с буквами и цифрами распознает хорошо. А если только цифры без букв - то совсем плохо :(
« Last Edit: August 14, 2017, 12:35:24 AM by gsukhado »

gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Анализ текста в окне
« Reply #108 on: August 14, 2017, 01:19:06 PM »
Стоит подумать о другом методе. Например поделить на зоны цифр и считать в области сумму чистого цвета 10310011
Может там граница более чёткая.
Имеется в виду что-то типа такого алгоритма? https://habrahabr.ru/post/101446/


А для случаев плохого распознавания (одни и те же цифры достаточно сильно друг от друга отличаются), вот этот вариант не поможет случайно, никто не пробовал?
https://habrahabr.ru/post/158431/
"Создаём новую двумерную матрицу b(x,y). В неё будем писать результаты.
Берём четыре соседних пикселя — квадрат.
Если хотя бы один из цветов этих пикселей остался в списке основных цветов — пишем в новую матрицу b(0,0)=Х. Если ни одного нет — пишем b(0,0)=0.
Берём следующие 4 пикселя. Повторять до конца матрицы, а в случае больших изображений операцию даже можно прогнать дважды."
« Last Edit: August 14, 2017, 02:22:34 PM by gsukhado »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Анализ текста в окне
« Reply #109 on: August 14, 2017, 02:31:59 PM »
Да, на том шрифте предлагалось что-то типа такого. Но там шрифт большой.
На среднем и на мелком такой вариант не подойдёт.


gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Анализ текста в окне
« Reply #110 on: August 14, 2017, 05:16:29 PM »
Судя по картинке на хабре, там размер по высоте около 13 пикселей.
Если я могу сделать цифры такого же размера, то получается попробовать алгоритм можно? Где-то он для кликермана уже был реализован? (я как программист слабоват)
...или ты про алгоритм "по сумме чистого цвета", а не про "двумерную матрицу"?
« Last Edit: August 14, 2017, 05:18:11 PM by gsukhado »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Анализ текста в окне
« Reply #111 on: August 14, 2017, 05:50:13 PM »
Я про первый, там 20х30. Твоё изменение поста и не видел тогда.

А вторая... не понял, чем она отличается от нашего обычного сравнения с шаблоном?
"Один из сайтов" это наверно Авито. Жешев - чёртов пособник спамеров  ;D
« Last Edit: August 14, 2017, 05:57:56 PM by Vint »


gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Анализ текста в окне
« Reply #112 on: August 14, 2017, 06:17:05 PM »
А вторая... не понял, чем она отличается от нашего обычного сравнения с шаблоном?
У меня проблема в том, что цифры между собой сильно разные, не получается отловить просто по шаблону. За счет поворота BlueStacks горизонтально на экране ноутбука, получилось увеличить размер цифр до примерно 6 на 13.
Если я правильно понял описание по ссылке у Жешева - то за счет его алгоритма происходит "усреднение" фактических скринов с экрана, т.е. они как бы приближаются к однотипному шаблону. Или я не правильно понял что Жешев делает?

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Анализ текста в окне
« Reply #113 on: August 14, 2017, 06:27:08 PM »
Усреднение. Ну попробуй.
У Драмстера кажись в одном из вариантов есть сравнение с усреднённым образцом. Почти то же самое, но наоборот.

Просто все вот эти попиксельные действия не очень быстрые. И нужно перекрашивать в буфере.

Выложи хоть новые скрины с новым размером шрифта.
« Last Edit: August 14, 2017, 06:32:01 PM by Vint »


gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Анализ текста в окне
« Reply #114 on: August 14, 2017, 06:59:12 PM »
Вот еще не обработанные нарезки со скринов, плюс общий скрин экрана
(нарезки, по которым искал - не выкладываю, т.к. возможно не вполне верно и нарезал)

upd: добавил заготовки для цифр поштучно, вне архива
« Last Edit: August 14, 2017, 10:28:14 PM by gsukhado »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Анализ текста в окне
« Reply #115 on: August 14, 2017, 09:56:34 PM »
Ничего страшного, это же не самораспаковывающиеся.
Я в любом случае архив распаковываю архиватором по ПКМ без запуска.
Меня последнюю неделю, на рабочую почту, долбят направленными письмами. Всё шифровальщик хотят всучить. Как покопаешься, чего там только нет в загрузчиках и макросы к офису и шелл и баты. Зачем столько. Выше ведь вероятность что один из типов антивирь не пропустит в не зависимости от содержимого.


gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Анализ текста в окне
« Reply #116 on: August 14, 2017, 10:24:17 PM »
Какой смысл открывать архив от неизвестного человека?  А если у вас на компе вирус и вы об этом не подозреваете?
Зачем архивировать скрины, если эта программа работает с несжатыми форматами изображений?
1.По безопасности:
Не очень понимаю, в чем тут может быть вирус, если нет ни одного запускаемого файла?
2.По удобству:
Набор цифр вроде удобней брать архивом сразу, чем поштучно скачивать.
Но добавил заготовки в то же сообщение и поштучно, если архивом есть риски
3.Объективные ограничения:
Общий скрин экрана в *.bmp = 5 мб, форумом не принимается по размеру, так что только архивом
« Last Edit: August 14, 2017, 10:28:59 PM by gsukhado »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Анализ текста в окне
« Reply #117 on: August 15, 2017, 12:36:29 AM »
Усреднение. Ну попробуй.
У Драмстера кажись в одном из вариантов есть сравнение с усреднённым образцом. Почти то же самое, но наоборот.

насколько я понял, это ты про это http://crapware.aidf.org/forum/index.php?topic=2336.30
не слишком рабочая штука, насколько я помню, судя по тестам которые в том сообщении. сразу после написания - забыл про этот вариант, и далее делал упор на форму символов как вот тут http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743
при распознавании всегда пользовался именно этом вариантом. с тех пор скрипт кардинально изменился.

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


вот отфильтрованный вариант



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

вот накалякал под вышеуказанную заготовку

Code: (clickermann) [Select]
#name "text_reader"


////////////////////////////////////////////////////////////////////////////////
/////////разбивает текст на строки//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

SUB(lines,$x1_text,$y1_text,$x2_text,$y2_text)
   UNDEFINE ($x1_line_arr)
   UNDEFINE ($y1_line_arr)
   UNDEFINE ($x2_line_arr)
   UNDEFINE ($y2_line_arr)
   
   IF_PIXEL_IN($x1_text,$y1_text, $x1_text,$y2_text, $char_color)
      print("текста не влазит в границы распознавания слева")
      halt
   END_IF
   IF_PIXEL_IN($x2_text,$y1_text, $x2_text,$y2_text, $char_color)
      print("текста не влазит в границы распознавания справа")
      halt
   END_IF
   
   IF(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)
      print("первоя строка обрезана,неучитывается")
      while(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)
         inc($y1_text)
      END_CYC
   END_IF
   
   while($y1_text<$y2_text)
     
      while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)&($y1_text<$y2_text))
         inc($y1_text)
      END_CYC
     
     
      IF($y1_text<$y2_text)
         arrpush($x1_line_arr, $x1_text)
         arrpush($y1_line_arr, $y1_text)
         
         
         $h_str_temp=0
         while($h_str_temp<$h_str)
           
            while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)<$x2_text-$x1_text+1)&($y1_text<$y2_text))
               inc($y1_text)
               inc($h_str_temp)
            END_CYC
           
            IF($h_str_temp<$h_str)
               while((PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)&($y1_text<$y2_text))
                  inc($y1_text)
               END_CYC
               $h_str_temp = 0
               
               $del_arr = arrpop($x1_line_arr)
               $del_arr = arrpop($y1_line_arr)
               arrpush($x1_line_arr, $x1_text)
               arrpush($y1_line_arr, $y1_text)
            END_IF
           
         END_CYC
         
         
      END_IF
     
      IF(PXLCOUNT($x1_text,$y1_text,$x2_text,$y1_text,$back_color)=$x2_text-$x1_text+1)
         arrpush($x2_line_arr, $x2_text)
         arrpush($y2_line_arr, $y1_text-1)
      else
         print("последняя строка обрезана,неучитывается")
         $del_arr = arrpop($x1_line_arr)
         $del_arr = arrpop($y1_line_arr)
      END_IF
     
   END_CYC
   
   print("количество строк - ",arrsize($x1_line_arr))
   // координаты в лог и скрины
   //   FOR($a=0,$a<arrsize($x1_line_arr))
   //      print($x1_line_arr[$a]," ",$y1_line_arr[$a]," ",$x2_line_arr[$a]," ",$y2_line_arr[$a])
   //      SCREENSHOTEX($x1_line_arr[$a],$y1_line_arr[$a],$x2_line_arr[$a],$y2_line_arr[$a])
   //   END_CYC
   
   IF(arrsize($x1_line_arr)=0)
      print("текста не найденно")
      halt
   END_IF
   
END_SUB
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
/////////размер и количество символов в строке//////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(pos_size,$x1_line,$y1_line,$x2_line,$y2_line)
   
   UNDEFINE ($x1_char_arr)
   UNDEFINE ($y1_char_arr)
   UNDEFINE ($x2_char_arr)
   UNDEFINE ($y2_char_arr)
   
   
   FOR($x1_line_temp=$x1_line,$x1_line_temp<$x2_line+1)
      FOR($y1_line_temp=$y1_line,$y1_line_temp<$y2_line+1)
         IF(pxl($x1_line_temp,$y1_line_temp)=$char_color)
            arrpush($x1_char_arr,$x1_line_temp)
            while(PXLCOUNT($x1_line_temp,$y1_line,$x1_line_temp,$y2_line,$back_color)<$y2_line-$y1_line+1)
               inc($x1_line_temp)
            END_CYC
            arrpush($x2_char_arr,$x1_line_temp-1)
         END_IF
      END_CYC
   END_CYC
   
   FOR($i_char=0,$i_char<arrsize($x1_char_arr))
      SCANPXL ($pix_temp,$x1_char_arr[$i_char],$y1_line,$x2_char_arr[$i_char],$y2_line,$char_color)
      arrpush($y1_char_arr,$pix_temp[1])
      arrpush($y2_char_arr,$pix_temp[arrsize($pix_temp)-1])
      UNDEFINE ($pix_temp)
   END_CYC
   
   
   print("количество символов в строке - ",arrsize($x1_char_arr))
   
   //скрины каждого символа
   //   FOR($a=0,$a<arrsize($x1_char_arr))
   //      SCREENSHOTEX($x1_char_arr[$a],$y1_char_arr[$a],$x2_char_arr[$a],$y2_char_arr[$a])
   //   END_CYC
   
END_SUB
////////////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////////////////////////////
////////////////очертание символов//////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(shape,$x1_char,$y1_char,$x2_char,$y2_char)
   
   UNDEFINE($left_1)
   UNDEFINE($left_2)
   UNDEFINE($left_3)
   UNDEFINE($left_4)
   UNDEFINE($left_5)
   UNDEFINE($right_1)
   UNDEFINE($right_2)
   UNDEFINE($right_3)
   UNDEFINE($right_4)
   UNDEFINE($right_5)
   UNDEFINE($up_1)
   UNDEFINE($up_2)
   UNDEFINE($up_3)
   UNDEFINE($up_4)
   UNDEFINE($up_5)
   UNDEFINE($down_1)
   UNDEFINE($down_2)
   UNDEFINE($down_3)
   UNDEFINE($down_4)
   UNDEFINE($down_5)
   int(($y2_char-$y1_char+1)/2)
   
   //лево
   FOR($temp=$x1_char,(pxl($temp,$y2_char)!$char_color)&($temp<$x2_char))
      inc($left_1)
   END_CYC
   $left_1 = ROUND($left_1/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_1 > 9)
      $left_1 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp<$x2_char))
      inc($left_2)
   END_CYC
   $left_2 = ROUND($left_2/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_2 > 9)
      $left_2 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/2,0))!$char_color)&($temp<$x2_char))
      inc($left_3)
   END_CYC
   $left_3 = ROUND($left_3/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_3 > 9)
      $left_3 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y1_char+ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp<$x2_char))
      inc($left_4)
   END_CYC
   $left_4 = ROUND($left_4/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_4 > 9)
      $left_4 = 9
   END_IF
   FOR($temp=$x1_char,(pxl($temp,$y1_char)!$char_color)&($temp<$x2_char))
      inc($left_5)
   END_CYC
   $left_5 = ROUND($left_5/($x2_char-$x1_char+1)/$accur,-1)*10
   IF($left_5 > 9)
      $left_5 = 9
   END_IF
   
   //право
   FOR($temp=$x2_char,(pxl($temp,$y2_char)!$char_color)&($temp>$x1_char),-1)
      inc($right_1)
   END_CYC
   $right_1 = $right_1 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_1 = ROUND($right_1/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_1 > 9)
      $right_1 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp>$x1_char),-1)
      inc($right_2)
   END_CYC
   $right_2 = $right_2 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_2 = ROUND($right_2/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_2 > 9)
      $right_2 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y2_char-ROUND(($y2_char-$y1_char)/2,0))!$char_color)&($temp>$x1_char),-1)
      inc($right_3)
   END_CYC
   $right_3 = $right_3 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_3 = ROUND($right_3/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_3 > 9)
      $right_3 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y1_char+ROUND(($y2_char-$y1_char)/4,0))!$char_color)&($temp>$x1_char),-1)
      inc($right_4)
   END_CYC
   $right_4 = $right_4 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_4 = ROUND($right_4/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_4 > 9)
      $right_4 = 9
   END_IF
   FOR($temp=$x2_char,(pxl($temp,$y1_char)!$char_color)&($temp>$x1_char),-1)
      inc($right_5)
   END_CYC
   $right_5 = $right_5 + (int(($y2_char-$y1_char+1)/2)-($x2_char-$x1_char))
   $right_5 = ROUND($right_5/(int(($y2_char-$y1_char+1)/2))/$accur,-1)*10
   IF($right_5 > 9)
      $right_5 = 9
   END_IF
   
   //верх
   FOR($temp=$y1_char,(pxl($x1_char,$temp)!$char_color)&($temp<$y2_char))
      inc($up_1)
   END_CYC
   $up_1 = ROUND($up_1/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_1 > 9)
      $up_1 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp<$y2_char))
      inc($up_2)
   END_CYC
   $up_2 = ROUND($up_2/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_2 > 9)
      $up_2 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/2,0),$temp)!$char_color)&($temp<$y2_char))
      inc($up_3)
   END_CYC
   $up_3 = ROUND($up_3/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_3 > 9)
      $up_3 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x2_char-ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp<$y2_char))
      inc($up_4)
   END_CYC
   $up_4 = ROUND($up_4/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_4 > 9)
      $up_4 = 9
   END_IF
   FOR($temp=$y1_char,(pxl($x2_char,$temp)!$char_color)&($temp<$y2_char))
      inc($up_5)
   END_CYC
   $up_5 = ROUND($up_5/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($up_5 > 9)
      $up_5 = 9
   END_IF
   
   //низ
   FOR($temp=$y2_char,(pxl($x1_char,$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_1)
   END_CYC
   $down_1 = ROUND($down_1/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_1 > 9)
      $down_1 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_2)
   END_CYC
   $down_2 = ROUND($down_2/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_2 > 9)
      $down_2 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x1_char+ROUND(($x2_char-$x1_char)/2,0),$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_3)
   END_CYC
   $down_3 = ROUND($down_3/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_3 > 9)
      $down_3 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x2_char-ROUND(($x2_char-$x1_char)/4,0),$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_4)
   END_CYC
   $down_4 = ROUND($down_4/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_4 > 9)
      $down_4 = 9
   END_IF
   FOR($temp=$y2_char,(pxl($x2_char,$temp)!$char_color)&($temp>$y1_char),-1)
      inc($down_5)
   END_CYC
   $down_5 = ROUND($down_5/($y2_char-$y1_char+1)/$accur,-1)*10
   IF($down_5 > 9)
      $down_5 = 9
   END_IF
   
   
   //   print($left_1," ",$left_2," ",$left_3," ",$left_4," ",$left_5)
   //   print($right_1," ",$right_2," ",$right_3," ",$right_4," ",$right_5)
   //   print($up_1," ",$up_2," ",$up_3," ",$up_4," ",$up_5)
   //   print($down_1," ",$down_2," ",$down_3," ",$down_4," ",$down_5)
   
   $shape_str=STRCONCAT($left_1,$left_2,$left_3,$left_4,$left_5,$right_1,$right_2,$right_3,$right_4,$right_5,$up_1,$up_2,$up_3,$up_4,$up_5,$down_1,$down_2,$down_3,$down_4,$down_5,"~")
   
   //print($shape_str)
   
END_SUB
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
////////////////контраст////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
SUB(kontrast,$x1_contr,$y1_contr,$x2_contr,$y2_contr,$mid,$k)
   
   FOR($y_temp=$y1_contr,$y_temp<$y2_contr+1)
      FOR($x_temp=$x1_contr,$x_temp<$x2_contr+1)
         $col1= pxl($x_temp,$y_temp)
         IF(((colorr($col1)+colorg($col1)+colorb($col1))/3) > $mid)
            $outr=colorr($col1)+$k
            $outg=colorg($col1)+$k
            $outb=colorb($col1)+$k
            IF($outr < $mid)
               $outr=$mid
            END_IF
            IF($outg < $mid)
               $outg=$mid
            END_IF
            IF($outb < $mid)
               $outb=$mid
            END_IF
         else
            $outr=colorr($col1)-$k
            $outg=colorg($col1)-$k
            $outb=colorb($col1)-$k
            IF($outr > $mid)
               $outr=$mid
            END_IF
            IF($outg > $mid)
               $outg=$mid
            END_IF
            IF($outb > $mid)
               $outb=$mid
            END_IF
         END_IF
         IF($outr < 0)
            $outr=0
         END_IF
         IF($outg < 0)
            $outg=0
         END_IF
         IF($outb < 0)
            $outb=0
         END_IF
         IF($outr > 255)
            $outr=255
         END_IF
         IF($outg > 255)
            $outg=255
         END_IF
         IF($outb > 255)
            $outb=255
         END_IF
         PXLREPLACE($x_temp,$y_temp,$x_temp,$y_temp,$col1,COLORGEN($outr,$outg,$outb))
      END_CYC
   END_CYC
   SCREENSHOTEX($x1_contr,$y1_contr,$x2_contr,$y2_contr)
   
END_SUB
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
////////////////распознавание и обучение////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
IF(TFCOUNT("data.txt") = 0)
   TFWRITE ("data.txt"," ")
END_IF
$all_str = ""
SUB(reader,$shape,$n_char)
   
   
   
   FOR($n_str=1,$n_str<TFCOUNT("data.txt")+1)
      IF(STRPOS (TFREAD ("data.txt",$n_str), $shape) > 0)
         $t_char = STRCUT(TFREAD ("data.txt",$n_str), 1, STRPOS(TFREAD("data.txt",$n_str),":~")-1)
         //print($t_char)
         strfilter($t_char, "*", 0 )
         $all_str = STRCONCAT ($all_str,$t_char)
         $n_str=TFCOUNT("data.txt")+1
         $check=0
      else
         $check=1
      END_IF
   END_CYC
   
   IF($check=1)
      move(int(($x2_char_arr[$n_char]-$x1_char_arr[$n_char])/2)+$x1_char_arr[$n_char],$y2_char_arr[$n_char])
      $char_write = INPUTBOX(STRCONCAT("введи цифру под номером ",$n_char+1), "", 120)
      IF($char_write = "")
         print("cancel")
         halt
      END_IF
      $all_str = STRCONCAT ($all_str,$char_write)
      $check=0    //////////////////
     
      FOR($n_str=1,$n_str<TFCOUNT("data.txt")+1)
         IF(STRPOS (TFREAD ("data.txt",$n_str), STRCONCAT($char_write,":~")) =1)
            TFWRITE ("data.txt",STRCONCAT(TFREAD("data.txt",$n_str),$shape))
            TFDELETE ("data.txt",$n_str)
            $n_str=TFCOUNT("data.txt")+1
            $check=0
         else
            $check=1
         END_IF
      END_CYC
      IF($check=1)
         TFWRITE ("data.txt",STRCONCAT($char_write,":~",$shape))
      END_IF
   END_IF
   
END_SUB
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////

//lines($x1_text,$y1_text,$x2_text,$y2_text) // определяет координаты строк
//ответ - массивы   $x1_line_arr,$y1_line_arr,$x2_line_arr,$y2_line_arr

//pos_size($x1_line,$y1_line,$x2_line,$y2_line) // координаты и количество символов
//ответ - массивы   $x1_char_arr,$y1_char_arr,$x2_char_arr,$y2_char_arr

//shape($x1_char,$y1_char,$x2_char,$y2_char)  //очертание каждого символа
//ответ - строка очертания вида  01110311112042200240~

//reader($shape)  //обучение и распознавание
//если цифра не распознана, то вылезет окно ввода, где нужно вписать нужную цифру, на эту цифру указывает курсор.
//ответ - строка $all_str


///////основной код/////////////////////////////////////////////////////////////




$char_color = 16777215   // цвет символов
$back_color = 8355711  //  цвет фона
$accur = 5       //точность  (1 - макс точность)
$h_str = 5     //минимальная высота строки, уменьшить, если определит лишние строки (типа точки в "Ё" или закарючка в "Й" )

$x1 = 558
$y1 = 1347
$x2 = 867
$y2 = 1386


//обязательная обработка изображения до двух цветов
GETSCREEN($x1,$y1,$x2,$y2)
COLORMODE(7, $x1,$y1,$x2,$y2)

PXLREPLACE ($x1,$y1,$x2,$y2, 8355839, 8355711)
PXLREPLACE ($x1,$y1,$x2,$y2, 8388607, 8355711)
PXLREPLACE ($x1,$y1,$x2,$y2, 8388479, 8355711)

//SCREENSHOTEX($x1,$y1,$x2,$y2)



lines($x1,$y1,$x2,$y2)

FOR($line=0,$line<arrsize($x1_line_arr))
   pos_size($x1_line_arr[$line],$y1_line_arr[$line],$x2_line_arr[$line],$y2_line_arr[$line])
   
   FOR($char=0,$char<arrsize($x1_char_arr))
      shape($x1_char_arr[$char],$y1_char_arr[$char],$x2_char_arr[$char],$y2_char_arr[$char])
      reader($shape_str,$char)
     
     
   END_CYC
END_CYC


print($all_str)




halt

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

скрип очень сложный. не используя его пару месяцев, пришлось немного попотеть пока настроил , при этом нашел пару ошибок в алгоритме  :D .


« Last Edit: August 15, 2017, 01:05:31 AM by dramster »

gsukhado

  • Активный участник
  • ***
  • Posts: 104
    • View Profile
Re: Анализ текста в окне
« Reply #118 on: August 15, 2017, 05:57:53 PM »
dramster, спасибо, буду разбираться!
Пока на вскидку два вопроса:
а)Не увидел обращения к подпрограмме kontrast (строка 332). Она нужна?
б)Строки 393-396 по сути можно вынести в самое начало основной части программы?

Автоматизатор

  • Зашел в гости
  • *
  • Posts: 12
    • View Profile
Re: Анализ текста в окне
« Reply #119 on: August 15, 2017, 07:07:08 PM »

насколько я понял, это ты про это http://crapware.aidf.org/forum/index.php?topic=2336.30
не слишком рабочая штука, насколько я помню, судя по тестам которые в том сообщении. сразу после написания - забыл про этот вариант, и далее делал упор на форму символов как вот тут http://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743
при распознавании всегда пользовался именно этом вариантом. с тех пор скрипт кардинально изменился.




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

1.Алгоритм: качаю капчу, вот такого типа(во вложении).
2. все пиксели, ргб которых менее 700,000  превращаю в белый
3. около цифр присутствует фон сильный, из менее насыщенного цвета самой цифры(например цифра красная, а обводка розовая) - я это убираю так: все пиксели с ргб выше 13,000,000 превращаю в белый, затем превращаю все в ч/б и убираю точки, рядом с которыми менее двух закрашенных пикселей
4. затем определяю границы каждой цифры, заношу в массивы(тут тоже косяк с цифрами которые наезжают друг на друга, я без понятия как можно отделять программно.)
5. затем создал матрицу как здесь драмстерhttp://crapware.aidf.org/forum/index.php?topic=2336.msg14743#msg14743, но он использовал 4 координат по вертикали, а я пять взял.
6. потом проверка - если находим комбинацию нужную, то знаем что это за цифра, если нет то ввод вручную.
Недостатки моего способа:1. не знаю как отделить две цифры.
2. из-за коррекции шума, порой режется цифра до неузнаваемости(единичка страдает, бывает отрезается наполовину) или 4, короче некоторые числа сильно обрезаются.
Во вложении прикрепил пикселизацию(ч/б) видно, что порой нормально цифры видно как тут, весь мусор убран, а порой отсекает лишнее,  с цифр(0184) - четверка сильно потрепана. Подскажите куда копать, друзья. могу скинуть исходник на делфи

Update
Попробую сейчас посчитать преобладающие цвета. также цифры фиксированной высоты, это тоже может сыграть на руку в алгоритме
« Last Edit: August 15, 2017, 08:31:24 PM by Автоматизатор »