php разгадываем капчу

Discussion in 'PHP' started by Romaxa55, 18 Feb 2014.

  1. Romaxa55

    Romaxa55 Banned

    Joined:
    19 Oct 2005
    Messages:
    144
    Likes Received:
    30
    Reputations:
    4
    Спасибо огромное, тема решина, оставляю самые необходиме функции тут для распознания текста с картинки, сорри что код без коментов

    Всем огромное спасибо! И особое спасибо для 4upakabr0 =)

    PHP:
    function cmp($n$a$b) {
        
    $f=0;    
        
    $i=0;
        
    $sizeB=count($b);    
        foreach(
    $a as $k=>$v) {        
            if(
    $sizeB<=$i) { return 1; }
            if(
    $k==$n) { $f=1; }
            if(
    $f) {            
                if(
    $v!=$b[$i]) { return 0; }
                
    $i++;
            }
        }
        return 
    1;
    }

    $im imagecreatefrompng("captcha.png");
    $tmp imagecreate (imagesx($im), imagesy($im));
    imagealphablending($tmpfalse);
    imagesavealpha($tmptrue);
    imagecopyresampled($tmp$im0000imagesx($im), imagesy($im), imagesx($im), imagesy($im));
    $imagex =imagesx($tmp);
    $imagey =imagesy($tmp);


    for (
    $x 0$x $imagex$x++) 
        {
        for (
    $y 0$y $imagey$y++) 
            {
            
    $i imagecolorat ($tmp$x$y);
            
    $old=ImageColorsForIndex($tmp,$i);
            
    $r = (int)($old['red'] + $old['green'] + $old['blue'])/3;
            if (
    $r != 128)
                {
                
    ImageColorSet($tmp,$i,255,255,255);
                
    $img_arr[$x][$y] = 1;
                }
                else
                {
                
    $img_arr[$x][$y] = 0;
                }
            }
        }


    for (
    $x 0$x $imagex$x++) 
        {
        for (
    $y 0$y $imagey$y++) 
            {
            if (
    $img_arr[$x][$y] == 0) {$res[$x].= 1;} //else {$res[$x].= 0;}
            
    }
        }



    foreach (
    $mask as $m => $mask_value)
    {  
    $i=0;
    foreach (
    $res as $ind => $val) {
        if(
    $mask[$m][0] === $val ) {        
            if(
    cmp($ind$res$mask[$m]))
                {
                
                
    $rrr[$ind] = $m
                
                
                }
        }
        
    $i++;
    }

    }

    f
    полезная статья по php + GD ТУТ
     
    #1 Romaxa55, 18 Feb 2014
    Last edited: 19 Feb 2014
  2. banned

    banned Banned

    Joined:
    20 Nov 2006
    Messages:
    3,324
    Likes Received:
    1,193
    Reputations:
    252
    Искать первое вхождение шаблона, если найдено сверять следующее.
    http://php.net/foreach
     
    1 person likes this.
  3. 4upakabr0

    4upakabr0 Member

    Joined:
    14 May 2008
    Messages:
    124
    Likes Received:
    23
    Reputations:
    0
    Алгоритм очевиден. Положим массив А - это массив с данными, массив В - шаблон.

    - Перебираешь каждую строку А и сравниваешь с первой строкой В.
    - Если совпадение, то запускаешь детальное сравнение от текущей строкии в А под номером N до N+(длинна В), если всё прошло без запинки, то запоминаешь N - отсюда у нас найден шаблон.
    - Далее, если найден шаблон и тебе не ныжны пересекающиеся множества строк шаблонов, то прыгаешь дальше на длинну массива В, иначе просто берешь вторую строку

    чот мне делать нехер стало, вот накидал код:

    PHP:
    <?php

    // !!! берём за условие, что индексы в массиве-маске идут последовательно и начинаются с 0 !!!
    $mask[1] = array(
    "11",
    "11",
    "1111111111",
    "11111111111",
    "111111111111",
    "11",
    "11",
    );  

     
    //здесь нам срать на идексы, т.к. фореач
    $result[16] = '11';
    $result[17] = '111';
    $result[18] = '111';
    $result[19] = '111';
    $result[20] = '111';
    $result[21] = '111';
    $result[22] = '111';
    $result[23] = '111';
    $result[24] = '1111111';
    $result[25] = '111111';
    $result[26] = '111';
    $result[32] = '1';
    $result[33] = '11';
    $result[34] = '11';
    $result[35] = '11';
    $result[36] = '11';
    $result[37] = '11';
    $result[38] = '11';
    $result[39] = '111111111';
    $result[40] = '1111111111';
    $result[41] = '111111111';
    $result[42] = '1';
    $result[47] = '11'//тот самый кусок
    $result[48] = '11' ;//тот самый кусок
    $result[49] = '1111111111';
    $result[50] = '11111111111'//тот самый кусок
    $result[51] = '111111111111'//тот самый кусок
    $result[52] = '11'//тот самый кусок
    $result[53] = '11' ;//тот самый кусок
    $result[57] = '111111';
    $result[58] = '11111111';
    $result[63] = '1';
    $result[64] = '111111111';
    $result[65] = '1111111'  ;

    $i=0;
    foreach (
    $result as $ind => $val) {
        if(
    $mask[1][0] === $val ) {        
            if(
    cmp($ind$result$mask[1])) print "since line number $i with key $ind in array 'result' next ".count($mask[1])." lines matched with array 'mask[1] !";
        }
        
    $i++;
    }

    function 
    cmp($n$a$b) {
        
    $f=0;    
        
    $i=0;
        
    $sizeB=count($b);    
        foreach(
    $a as $k=>$v) {        
            if(
    $sizeB<=$i) { return 1; }
            if(
    $k==$n) { $f=1; }
            if(
    $f) {            
                if(
    $v!=$b[$i]) { return 0; }
                
    $i++;
            }
        }
        return 
    1;
    }

    ?>
    у тебя в исходных данных ошибки были, я чуть подправил массивы. алгоритм рабочий. находит все совпадения с перекрытиями.
     
    #3 4upakabr0, 18 Feb 2014
    Last edited: 18 Feb 2014
    1 person likes this.
  4. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Romaxa55 взять шаблоны и исходные данные, преобразовать в строки через implode с символом, который не встречается, а дальше strpos. Будет работать стабильнее, чем большинство из того, что вы сможете написать.
     
    _________________________
    3 people like this.
  5. Romaxa55

    Romaxa55 Banned

    Joined:
    19 Oct 2005
    Messages:
    144
    Likes Received:
    30
    Reputations:
    4
    Спасибо всем огромное, тему можно закрывать, ставлю плюсики всем кто участвовал)