bug-ocrad
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Bug-ocrad] info on number 4 recognition


From: Fabrizio Sinato
Subject: Re: [Bug-ocrad] info on number 4 recognition
Date: Thu, 10 May 2007 10:56:34 +0200
User-agent: Thunderbird 1.5.0.5 (X11/20060719)

Greetings,

the attached archive contains a patch to recognize the "open" glyph
of the number 4. E.g. as it is handwritten:

                      /
                     /
                    /   |
                   +----+--
                        |

WARNING: there is a bug in this patch: ocrad 0.16 will not recognize
the backquote (`) anymore, so it is just offered as a starting point
for others.

Right now we are using OCRAD on numbers only, and I will probably not
attempt to improve this patch very soon.

You can get this patch and some test images from
http://fax.appix.net/ocrad-0.16-patch.tgz

I hope this helps,

Fabrizio.


[open-4.patch]

Index: profile.h
===================================================================
--- profile.h    (revision 606)
+++ profile.h    (working copy)
@@ -49,6 +49,8 @@
  int  area( int l = 0, int r = -1 ) throw();
  bool increasing( int i = 1 ) throw();
  bool decreasing( int i = 1 ) throw();
+  bool increasing( int b, int e ) throw();
+  bool decreasing( int b, int e ) throw();
  bool isconcave() throw();
  bool isconvex() throw();
  bool isflat() throw();
Index: feats_test0.cc
===================================================================
--- feats_test0.cc    (revision 606)
+++ feats_test0.cc    (working copy)
@@ -335,7 +335,14 @@
    if( urow > b.top() && lrow < b.bottom() && rp.isctip() &&
        ( bp.ispit() || tp.ispit() || ( bp.islpit() && tp.islpit() ) ) &&
        b.escape_right( b.vcenter(), b.hcenter() ) )
-      return 'c';
+      {
+      int tpc = tp.pos(50);
+      int bpc = bp.pos(50);
+      if ( tp.area( tpc, tpc ) + bp.area( bpc, bpc ) < b.height() * 0.20 )
+         return 'c';
+      else
+         return '<';
+      }
    }

  if( b.height() > 2 * b.width() && rp.isconvex() )
@@ -473,6 +480,10 @@

  if( lp.isconvex() || lp.ispit() )
    {
+ if( ( hbars() == 1 ) && lp.decreasing( lp.pos( 0 ), hbar(0).top() - b.top() )
+        && (hbar(0).top() > b.top() + lp.pos( 50 ))
+        && (hbar(0).top() < b.top() + lp.pos( 90 )) )
+      return '4';
    int col = 0, row = 0;
    for( int i = rp.pos( 30 ); i <= rp.pos( 60 ); ++i )
      if( rp[i] > col ) { col = rp[i]; row = i; }
Index: profile.cc
===================================================================
--- profile.cc    (revision 606)
+++ profile.cc    (working copy)
@@ -169,7 +169,9 @@
  return area;
  }

-
+//
+// profile increase from top towards bottom: rp( 7 ) -> increase
+//
bool Profile::increasing( int i ) throw()
  {
  if( _limit < 0 ) initialize();
@@ -179,7 +181,9 @@
  return true;
  }

-
+//
+// profile decrease from top towards bottom: lp( 4 ) -> decrease
+//
bool Profile::decreasing( int i ) throw()
  {
  if( _limit < 0 ) initialize();
@@ -192,6 +196,32 @@
  }


+bool Profile::increasing( int b, int e ) throw()
+  {
+  if( _limit < 0 ) initialize();
+  int stop = e;
+  if ( e > samples() )
+     stop = samples();
+  if( b <= 0 || b > stop - 2 || data[stop-1] - data[b] < 2 )
+    return false;
+  while( ++b < stop ) if( data[b] < data[b-1] ) return false;
+  return true;
+  }
+
+
+bool Profile::decreasing( int b, int e ) throw()
+  {
+  if( _limit < 0 ) initialize();
+  int stop = e;
+  if ( e > samples() )
+     stop = samples();
+  if( b < 0 || b >= stop - 2 || data[stop-1] - data[b] > 2 )
+    return false;
+  while( ++b < stop ) if( data[b] > data[b-1] ) return false;
+  return true;
+  }
+
+
bool Profile::isconcave() throw()
  {
  if( _isconcave < 0 )
@@ -604,12 +634,12 @@
  if( _limit < 0 ) initialize();
  if( samples() < 5 ) return false;

- const int xl = ( samples() / 30 ) + 1, yl = ( data[xl] + data[xl+1] ) / 2 ; + const int xl = (int)( samples() * 0.30 ) + 1, yl = ( data[xl] + data[xl+1] ) / 2 ; const int xr = samples() - xl - 1, yr = ( data[xr-1] + data[xr] ) / 2 ;
  const int dx = xr - xl, dy = yr - yl;
  if( dx <= 0 ) return false;
-  const int dmax = dx * ( ( samples() / 20 ) + 2 );
-  int faults = samples() / 10;
+  const int dmax = dx * ( (int)( samples() * 0.10 ) + 2 );
+  int faults = (int)(samples() * 0.10);
  for( int i = 0; i < samples(); ++i )
    {
    int y = ( dx * yl ) + ( ( i - xl ) * dy );
@@ -620,3 +650,4 @@
  if( _dy ) *_dy = dy;
  return true;
  }
+
Index: feats.cc
===================================================================
--- feats.cc    (revision 606)
+++ feats.cc    (working copy)
@@ -200,14 +200,17 @@
  const Block & b = *_block;

  if( hbars() == 1 && hbar(0).top() <= b.top() + ( b.height() / 10 ) &&
+      vbars() == 0 &&
      4 * hbar(0).height() <= b.height() &&
      5 * hbar(0).width() >= 4 * b.width() &&
      rp.increasing( hbar(0).vcenter() - b.top() ) &&
rp[hbar(0).bottom()-b.top()+2] - rp[hbar(0).bottom()-b.top()] < b.width() / 4 )
    return '7';

-  if( b.height() > b.width() && rp.increasing( 1 ) &&
-      b.seek_left( b.vcenter(), b.hcenter() ) <= b.left() )
+  if( hbars() == 1 &&
+      b.height() > b.width() &&
+      hbar(0).bottom() - b.top() <= b.height() / 5 &&
+      rp.increasing( hbar(0).bottom() - b.top(), rp.pos(80) ) ) //&&
    return '7';

if( tp.minima( b.height() / 4 ) == 1 && bp.minima( b.height() / 4 ) == 1 )
Index: feats_test1.cc
===================================================================
--- feats_test1.cc    (revision 606)
+++ feats_test1.cc    (working copy)
@@ -173,7 +173,7 @@

  int col = h.hcenter();
  int row = b.seek_top( h.top(), col, false ) - 1;
-  if( row <= b.top() )
+  if( row <= b.top() + 1 )
    {
    col = h.right(); if( b.right() - h.right() > h.width() ) ++col;
    row = b.seek_top( h.top(), col, false ) - 1;






reply via email to

[Prev in Thread] Current Thread [Next in Thread]