Author Topic: Распознавалка симпл капчи  (Read 23995 times)

0 Members and 1 Guest are viewing this topic.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Распознавалка симпл капчи
« Reply #30 on: January 24, 2016, 11:45:14 AM »
попробовал я всетаки реализовать свой вариант http://crapware.aidf.org/forum/index.php?topic=2336.msg14454#msg14454
вроде всё ничего, но упор вот в чем, как лучше всего определить, с каким шаблоном больше всего совпадает найденая картинка? чтото никак не могу сообразить. остановился на таком варианте (сам непонимаю что именно он определяет, но результат лучший из всех что и перебирал) - ((($num_n*100)/($num_cap_temp-$num_n))*100)/(($num_cap_n*100)/$num_cap_temp)
$num_n - пиксели которые совпали с шаблоном
$num_cap_n - количество пикселей найденных на капче
$num_cap_temp - количество пикселей которые записаны в шаблоне.
наглядно

черные пиксели - шаблон
красные пиксели - искомая картинка

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

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

"Следующие ошибки возникли при попытке отправки сообщения:
Сообщение превышает максимально допустимую длину (20000 знаков)."

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

во вложении шаблоны вот такого вида


ну и пару тестов покажу, три определения подряд

11:26:39 найдено цифр в поле 6
11:26:39 589 597 start y - 320
11:26:39 599 607 start y - 320
11:26:39 608 614 start y - 319
11:26:39 615 621 start y - 319
11:26:39 624 628 start y - 319
11:26:39 631 639 start y - 319
11:26:46 цифра 1 это 7
11:26:53 цифра 2 это 0
11:27:00 цифра 3 это 2
11:27:07 цифра 4 это 6
11:27:13 цифра 5 это 1
11:27:20 цифра 6 это 4
11:27:20 702614
11:27:41 найдено цифр в поле 6
11:27:41 588 596 start y - 320
11:27:41 598 605 start y - 320
11:27:41 609 611 start y - 320
11:27:41 614 620 start y - 319
11:27:41 621 629 start y - 319
11:27:41 632 640 start y - 319
11:27:48 цифра 1 это 0
11:27:55 цифра 2 это 4
11:28:02 цифра 3 это 1
11:28:09 цифра 4 это 3
11:28:15 цифра 5 это 0
11:28:22 цифра 6 это 8
11:28:22 041308
11:28:36 найдено цифр в поле 6
11:28:36 586 594 start y - 319
11:28:36 597 605 start y - 319
11:28:36 609 611 start y - 320
11:28:36 614 620 start y - 319
11:28:36 622 631 start y - 319
11:28:36 632 642 start y - 319
11:28:43 цифра 1 это 4
11:28:50 цифра 2 это 6
11:28:57 цифра 3 это 1
11:29:04 цифра 4 это 7
11:29:11 цифра 5 это 3
11:29:18 цифра 6 это 6
11:29:18 461736

как видите, в первом случяе 1 ошибка, во втором две, в третьем без ошибок.

изредка, примерно 1 из 20, находит 5 цифр вместо шести, можно будет доработать, но пока это не мешает.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Распознавалка симпл капчи
« Reply #31 on: January 24, 2016, 12:27:36 PM »
никакого, это просто текстовый файл, без расширения. там записан массив - построчно двоечки и единички.

Doda

  • Guest
Re: Распознавалка симпл капчи
« Reply #32 on: January 24, 2016, 01:11:51 PM »
разбираю код твой) ты нестандартно мыслишь, парень!  вот,    переделал слегка,  теперь код на  начало-конец капчи (по ширине)на 6 строк меньше
Твой вариант
Code: (clickermann) [Select]
FOR($x=$x1_fr,$x<$x2_fr)   //по ширине
      FOR($y=$y1_cap,$y<$y2_cap+1)  //наши новые коорды по высоте цифр УУ
         
         IF(pxl($x,$y) = 0) //нашли пиксель
            $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) = 0) //черный нашли
            $x2_cap= $x     //запоминаем  конец по ширине х
            $y=$y2_cap+1  //ломаем
            $x=$x1_fr
         END_IF
      END_CYC
   END_CYC

Мой вариант
Code: (clickermann) [Select]
FOR($x=$cap_arr[0],$x<arrsize($cap_arr)-1,2)
      if($memoryx=0) //берем  макс, мин как первое знач, сравниваем, ищем наименьшее-большее
         $x1_cap=$x
         $x2_cap=$x
         $memoryx=1
      end_if
      if ($x>$x2_cap) // все просто
         $x2_cap=$x
      end_if
      if ($x<$x1_cap)
         $x1_cap=$x
      end_if
  END_CYC
         $memoryx=0
Быстрее оперировать с массивом, нежели  к буферу обращатся. И  аррпоп игрека - нужно разместить после  проверки икса.

насчет 5 цифр. порой   проходит вот такая штука(одна цифра наезжает на другую)
« Last Edit: January 24, 2016, 05:26:46 PM by Браm комара »

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Распознавалка симпл капчи
« Reply #33 on: January 24, 2016, 08:19:44 PM »
Мой вариант
Code: (clickermann) [Select]
FOR($x=$cap_arr[0],$x<arrsize($cap_arr)-1,2)
      if($memoryx=0) //берем  макс, мин как первое знач, сравниваем, ищем наименьшее-большее
         $x1_cap=$x
         $x2_cap=$x
         $memoryx=1
      end_if
      if ($x>$x2_cap) // все просто
         $x2_cap=$x
      end_if
      if ($x<$x1_cap)
         $x1_cap=$x
      end_if
  END_CYC
         $memoryx=0
Быстрее оперировать с массивом, нежели  к буферу обращатся. И  аррпоп игрека - нужно разместить после  проверки икса.
не правильный вариант. вернее вариант правильный, но реализован не правильно
FOR($x=$cap_arr[0],$x<arrsize($cap_arr)-1,2) -  $cap_arr[0] это координата с черным пикселем, arrsize($cap_arr) это количество элементов в массиве. не те значения сравниваются. ну и остальное туда же $x2_cap=$x

правильно:
Code: (clickermann) [Select]
$x1_cap=$cap_arr[0]
FOR($a=0,$a<arrsize($cap_arr),2)
      if ($cap_arr[$a]>$x2_cap)
         $x2_cap=$cap_arr[$a]
      end_if
      if ($cap_arr[$a]<$x1_cap)
         $x1_cap=$cap_arr[$a]
      end_if
END_CYC

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

Code: (clickermann) [Select]
$x1_fr=574      // координаты поля с капчей (целиком, то что белое)
$y1_fr=311
$x2_fr=655
$y2_fr=334




GETSCREEN($x1_fr,$y1_fr,$x2_fr,$y2_fr)
COLORMODE(8,$x1_fr,$y1_fr,$x2_fr,$y2_fr)
wait(1)

$t = $_ms
scanpxl($cap_arr,$x1_fr,$y1_fr,$x2_fr,$y2_fr, 0)
$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) = 0)
         $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) = 0)
         $x2_cap= $x
         $y=$y2_cap+1
         $x=$x1_fr
      END_IF
   END_CYC
END_CYC
print("первый тест за ", $_ms-$t,"мс.")
print($x1_cap," ",$y1_cap," ",$x2_cap," ",$y2_cap)


//=======================================
$x1_cap=0
$y1_cap=0
$x2_cap=0
$y2_cap=0
UNDEFINE($cap_arr)
//=======================================
wait(1)

$t = $_ms
scanpxl($cap_arr,$x1_fr,$y1_fr,$x2_fr,$y2_fr, 0)
$x1_cap=$cap_arr[0]
FOR($a=0,$a<arrsize($cap_arr),2)
      if ($cap_arr[$a]>$x2_cap)
         $x2_cap=$cap_arr[$a]
      end_if
      if ($cap_arr[$a]<$x1_cap)
         $x1_cap=$cap_arr[$a]
      end_if
END_CYC
$y1_cap=$cap_arr[1]
$y2_cap=ARRPOP($cap_arr)
print("второй тест за ", $_ms-$t,"мс.")
print($x1_cap," ",$y1_cap," ",$x2_cap," ",$y2_cap)


halt
Code: [Select]
20:00:01 первый тест за 325мс.
20:00:01 586 319 641 332
20:00:03 второй тест за 273мс.
20:00:03 586 319 641 332

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

вопрос то вот в чем:

Quote
как лучше всего определить, с каким шаблоном больше всего совпадает найденая картинка? чтото никак не могу сообразить. остановился на таком варианте (сам непонимаю что именно он определяет, но результат лучший из всех что и перебирал) - ((($num_n*100)/($num_cap_temp-$num_n))*100)/(($num_cap_n*100)/$num_cap_temp)
$num_n - пиксели которые совпали с шаблоном
$num_cap_n - количество пикселей найденных на капче
$num_cap_temp - количество пикселей которые записаны в шаблоне.
наглядно

черные пиксели - шаблон
красные пиксели - искомая картинка

вот как правильнее определить, что это шестерка а не восьмерка?

Doda

  • Guest
Re: Распознавалка симпл капчи
« Reply #34 on: January 24, 2016, 08:26:53 PM »
Точно, не то сравниваю! и прирост не такой уж значительный.
Я пробую искать без шаблонов. доделаю, скину. например без шаблонов легко будут искаться 0, 8. то есть:
количество прямых линий, их соотношение к границам картинки,   пропуски  между линиями по горизонтали. ну и диагонали прикрутить. пример.  7 - прямая линия сверху, 2 - снизу. 0 - по краям, симметричная  дыра в центре. от 8 отличается тремя полосами по горизонтали
« Last Edit: January 24, 2016, 08:36:00 PM by Браm комара »

Doda

  • Guest
Re: Распознавалка симпл капчи
« Reply #35 on: January 24, 2016, 08:56:39 PM »
Вот например.
два нуля

Code: (clickermann) [Select]
23:51:51 разрыв по длине, на высоте 336 длина -4
23:51:51 2
23:51:51 2
23:51:51 разрыв по длине, на высоте 337 длина -4
23:51:51 2
23:51:51 2
23:51:51 разрыв по длине, на высоте 338 длина -5
23:51:51 2
23:51:51 2
23:51:51 разрыв по длине, на высоте 339 длина -5
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 340 длина -5
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 341 длина -5
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 342 длина -5
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 343 длина -5
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 344 длина -4
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 345 длина -4
23:51:52 2
23:51:52 2
23:51:52 2
23:51:52 665 674 start y - 334
23:51:52 2
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 336 длина -5
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 337 длина -6
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 338 длина -6
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 339 длина -6
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 340 длина -7
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 341 длина -6
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 342 длина -6
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 343 длина -5
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 344 длина -5
23:51:52 2
23:51:52 2
23:51:52 разрыв по длине, на высоте 345 длина -4
23:51:52 2

как видно, разрыв между боковыми стенками у нас  с 336 по 345 по высоте, примерно сплошной, без разрывов. значит это ноль. я думаю так распознавать, без шаблонов. шаблоном будет - количество соединений, линий, кругов.  описанное в коде

Doda

  • Guest
Re: Распознавалка симпл капчи
« Reply #36 on: January 24, 2016, 09:45:52 PM »
начало кода драмстера - на определение границ, дальше оперируя с границами    по прямым линиям, кругам - пробую настроить.  например,  линия больше 75 процентов по нижней полосе, отстутствие замкнутых разрывов(ноль, восемь. начинается слева, потом разрыв, ведущей до правой образующей цифры). отсутствие горизонтальных прямых. Способ не универсален, при сильных искривлениях капчи он загнется
« Last Edit: January 24, 2016, 10:42:50 PM by Браm комара »

Золотой

  • Оплот сообщества
  • ****
  • Posts: 312
    • View Profile
Re: Распознавалка симпл капчи
« Reply #37 on: January 27, 2016, 11:45:11 AM »
как на картинке обойти букву по контуру? начиная с одной точки, обойти п округу, и вернуться к исходной, с сохранением всех координат?
 для начала нужно сохранить все нужные координаты. Нужные координаты для нас те которые относятся к контуру.
искать будем на обработанной чёрно-белой картинке цифры.
1. создаем массив всех чёрных пикселей.
2. последовательно проверяем все пиксели массива, на соседство с белыми пикселями.если такого соседства нет, то пиксель нам неинтересен, он внутренний. Если есть, то важно задать какой белый пиксель является зачётным;
2.а. Если учитывать только те четыре, что соседствуют по горизонтали и вертикали,
то  получаем небольшой массив координат пикселей внешнего и внутренних контуров ( если такой есть у данной буквы)
его можно обойти соединяя пиксели контура вертикально, горизонтально и диагонально.
2.б.  Если учитывать, как соседние ещё и 4 пикселя по диагонали,
то полученный массив контуров буквы будет вдвое больше  и обходить его нужно будет поворотами на 90 градусов, по непрерывной ломанной от пикселя к пикселю.
что удобнее в рамках определения капчи зависит от выбранных способов дальнейшей обработки.
3. Чтоб на практике попиксельно обойти полученные контуры, массив нужно сортировать уже на предмет соседства двух чёрных пикселей из массива контуров,  с соседством + - 1 пиксель. примеры сортировки массивов на форуме есть.


dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Распознавалка симпл капчи
« Reply #38 on: February 02, 2016, 06:30:10 PM »
вчера  пришла мне кое какая идея по распознания данной капчи ... и всяческих других чисел. получилось очень даже ничего, не менее 9 из 10 распознаний проходит успешно, тем более, что распознавание со временем улучшается при обучении не распознанных цифр. загвоздка иногда бывает в определении количества цифр в капче, но я пока об этом не задумывался.
вышло не так уж и сложно, а результат очень даже ничего. я даже видео записал https://www.youtube.com/watch?v=mpQ-nnGXUFg
иногда путает 8 и 0 .... ну еще с 9 тоже, но редко.

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

делим ее на 4 части по высоте. определяем координату Х точки а1 и а2, находим разницу в смещении, сравниваем эту разницу с полной шириной цифры, и в зависимости в какую сторону смещается точка и на сколько, по отношению к общей ширине, получаем число - -2, -1, 0, 1, 2. если с минусом, значит линия цифры уходит влево, если положительное, то в право. если 0, то точки находятся в одной линии вертикали, смещения нет. если 2 - значит точка сместилась на расстояние в половину ширины искомой цифры и более. 1 - смещение не значительное, менее половины ширины.
так определяем поочереди от а1 к а2, от б1 к б2, от а2 к а3, б2 - б3 и тд. в результате имеем набор из восьми чисел. пишем этот набор в виде строки в файл при обучении (окно ввода, вылезет если цифра не распознана). при распознавании - идет сравнение со строками каждого файла, 10 файлов с ранее записанными комбинациями рельефа цифр.

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

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

скрипт, для общего обозрения (не будет работать без файлов очертаний цифр (во вложении), либо пока не обучится) :
Code: (clickermann) [Select]
#name "ReCapcha"

SUB(pos_size)
   UNDEFINE($num_line_start)
   UNDEFINE($num_line_end)
   UNDEFINE($num_real)
   UNDEFINE($num_y1)
   
   GETSCREEN($x1_fr,$y1_fr,$x2_fr,$y2_fr)
   COLORMODE(8,$x1_fr,$y1_fr,$x2_fr,$y2_fr)
   
   
   scanpxl($cap_arr,$x1_fr,$y1_fr,$x2_fr,$y2_fr, 0)
   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) = 0)
            $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) = 0)
            $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)  = 0)
            IF((pxl($x+1,$y)  = 0)|(pxl($x+1,$y-1) = 0)|(pxl($x+1,$y+1) = 0))
               $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)  = 0)
                  $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)  = 0)
               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)  = 0)
               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),0)
            $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),0)
            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)) = 0)
               $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)) = 0)
               $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
//=============================================
//=============================================
//=============================================
$x1_fr=835     // координаты поля с капчей (целиком, то что белое)
$y1_fr=438
$x2_fr=916
$y2_fr=459


//$x1_fr=350      // координаты поля с капчей (целиком, то что белое)
//$y1_fr=665
//$x2_fr=674
//$y2_fr=809


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

IF(arrsize($num_line_start) ! 6)
   print("найдено ",arrsize($num_line_start)," цифр")
   halt
END_IF


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

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



halt
опять же, сильно код не проверял, возможно в нем есть что улучшать.


Кликермен

  • Активный участник
  • ***
  • Posts: 112
    • View Profile
Re: Распознавалка симпл капчи
« Reply #39 on: February 02, 2016, 06:57:34 PM »
Драмстер, ты гений! я пробовал нечто подобное реализовать, но по другому принципу
 смотрим пиксели слева направо, и сверху вниз. если находим черный каему, запоминаем, доходим до края -   встречалась ли каемка повторно. если  встречалась, то запоминаем,  где у нас  есть такое место. это сразу отсекает 7.  например  цифра 5, такое встречается по горизонтали(снизу завиток)

и вертикали (дважды).

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

Кликермен

  • Активный участник
  • ***
  • Posts: 112
    • View Profile
Re: Распознавалка симпл капчи
« Reply #40 on: February 09, 2016, 07:33:50 AM »
подскажите, куда копать

что есть? 3 массива, в которых  10<ячеек<15, он такого вида
12 17 17
14 5 15
14 0 12
14 0 10
14 0 12
12 0 14
10 0 14
12 0 14
14 1 14
12 5 14
8 12 15
5 19 17
//////
1 массив 2 массив 3 массив. наименьшие/наибольшие цифры -скопления/отсутствие пикселей.
8 25 20
14 17 20
20 11 14
20 8 11
14 2 11
11 0 11
14 0 11
20 0 14
20 0 17
17 8 17

В данном примере это 0. как технически грамотнее реализовать поиск min/max областей? с запоминанием индексов массивов? причем массивов 3

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Распознавалка симпл капчи
« Reply #41 on: February 10, 2016, 09:42:07 PM »
если я правильно понял задачу, то:
Code: (clickermann) [Select]
STRSEPARATE("8,14,20,20,14,11,14,2,20,17",",",$arr)

$arr_min= $arr[0]
$arr_max= $arr[0]
FOR($a=0,$a<ARRSIZE($arr)
   IF($arr_min>$arr[$a])
      $arr_min=$arr[$a]
      $i_min=$a
   END_IF
   IF($arr_max<$arr[$a])
      $arr_max=$arr[$a]
      $i_max=$a
   END_IF
END_CYC

print("min - ",$arr_min," под индексом ", $i_min)
print("max - ",$arr_max," под индексом ", $i_max)


halt
находим в массиве мин/макс, и запоминаем их индексы.
« Last Edit: February 10, 2016, 09:43:59 PM by dramster »

SVS

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: Распознавалка симпл капчи
« Reply #42 on: March 01, 2016, 07:54:24 PM »
Хотел проверить как работает распознавалка капчи,пишет 18:54:26 найдено цифр в поле - 1
18:54:26 найдено 1 цифр.Что не так делаю??

Кликермен

  • Активный участник
  • ***
  • Posts: 112
    • View Profile
Re: Распознавалка симпл капчи
« Reply #43 on: March 01, 2016, 08:13:44 PM »
измени положение капчи у себя

SVS

  • Зашел в гости
  • *
  • Posts: 3
    • View Profile
Re: Распознавалка симпл капчи
« Reply #44 on: March 02, 2016, 12:26:10 AM »
$x1_fr=835     // координаты поля с капчей (целиком, то что белое)
$y1_fr=438
$x2_fr=916
$y2_fr=459
Я так понял тут надо выставить свои координаты?Выставлял верхний левый и нижний правый углы белого поля с капчей.
Результат тот же.