Показать сообщение отдельно

  #16  
Старый 10.07.2008, 23:27
demonoid
Banned
Регистрация: 12.01.2007
Сообщений: 113
Провел на форуме:
4094601

Репутация: 495
По умолчанию


Тренировался в написании модулей ( классов )


Код:
package BOCR;
use strict;
use GD;
use constant {
                RED   => 44,
                GREEN => 18,
                BLUE  => 4,
};

my %c = ( 0 => '7:4,0:4' , 
          1 => '2:2,3:2' ,  
          2 => '7:9' ,  
          3 => '0:1,0:8' ,  
          4 => '5:2,6:9' ,  
          5 => '0:0,0:1' ,  
          6 => '3:4,0:4' , 
          7 => '7:0' , 
          8 => '2:4,3:4' , 
          9 => '7:4,7:7' , );


sub new {
    my $class = shift;
    my $self  = {   DEBUG  => 0,
                    NAME   => undef,
                    @_,
                };
    return bless $self, $class;
}

sub recognition {
    my $self = shift;
    unless ( defined $self->{ NAME } ){
        $self->{ NAME } = shift ;
    }
    
    my $count = 0;
    my $image = GD::Image->newFromJpeg( $self->{ NAME } );
    for ( my $x0 = 5; $x0 <= 41; $x0 += 9 )
    {
         print "\t\tНачало новой позиции цифры \n\n" if $self->{ DEBUG };
         foreach my $n ( sort keys %c )
         {
            print " Цифра : #$n\n\n" if $self->{ DEBUG };
            foreach ( split ',',$c{$n} )
            {
                my ( $x,$y ) = split ':'; 
                print "Координаты : x = $x y = $y ; " if $self->{ DEBUG };
                my ( $r,$g,$b ) = $image->rgb( $image->getPixel( $x+$x0,$y+5 ) );
                print "RGB : r = $r g = $g b = $b\n" if $self->{ DEBUG };
                if  ( ( RED>=$r )&&( GREEN>=$g )&&( $b=BLUE ) ){
                    $count++;
                    print "Совпадение #$count : цифра #$n ; координаты : x = $x y = $y \n" if $self->{ DEBUG };
                }
                if ( ( $count == 2 ) || ( $count == 1 ) && ( $n == 2 ) || ( $count == 1 ) && ( $n == 7 ) ){
                    $count = 0;
                    print "Найдена цифра : '$n' \n" if $self->{ DEBUG };
                    $self->{ NUMBER } .= $n;
                    last;
                }
            }
            $count = 0;
           print "\n" if $self->{ DEBUG };
         }
    }
    print "Результат : $self->{ NUMBER }\n" if $self->{ DEBUG };
    return $self->{ NUMBER };
}

1;
Использывать примерно так :

Код:
#!/usr/bin/perl -w

use strict;
use BOCR;

my $i = new BOCR(   DEBUG => 1, # можно и без отладки =]
                    NAME  => 'b.jpeg' );
print $i->recognition;

Пример отладки :


Код:
$ perl b.pl
                      Начало новой позиции цифры 

 Цифра : #0

Координаты : x = 7 y = 4 ; RGB : r = 236 g = 198 b = 68
Координаты : x = 0 y = 4 ; RGB : r = 28 g = 14 b = 4
Совпадение #1 : цифра #0 ; координаты : x = 0 y = 4 
.....
 Цифра : #6

Координаты : x = 3 y = 4 ; RGB : r = 36 g = 14 b = 4
Совпадение #1 : цифра #6 ; координаты : x = 3 y = 4 
Координаты : x = 0 y = 4 ; RGB : r = 28 g = 14 b = 4
Совпадение #2 : цифра #6 ; координаты : x = 0 y = 4 
Найдена цифра : '6' 
.....
Результат : 6099