reference/ocr-simple/get_skew.cc
changeset 0 6b8091ca909a
equal deleted inserted replaced
-1:000000000000 0:6b8091ca909a
       
     1 #include "get_skew.h"
       
     2 #include <stdio.h>
       
     3 #include <time.h>
       
     4 #include <sys/time.h>
       
     5 #include "tcl_interface.h"
       
     6 
       
     7 int docommand(char* fmt, ...);
       
     8 
       
     9 struct angle_and_sd
       
    10 {
       
    11   double angle;
       
    12   double sd;
       
    13 };
       
    14 
       
    15 #define DEBUG_GET_SKEW 1
       
    16 
       
    17 double get_skew(RLEMap* r)
       
    18 /*--------------------------------------------------------------
       
    19 Primary Purpose: Determine the angle of rotation of the RLEMap r
       
    20 Arguments: pointer to an RLEMap
       
    21 Return Value: detected angle of rotation
       
    22 Rev: AR
       
    23 ---------------------------------------------------------------*/
       
    24 {
       
    25 
       
    26   int i,j,max_index;
       
    27   double max_sd = 0;
       
    28   double test_angle, angular_skip, angle_increment;
       
    29   Histogram* temp_hist;
       
    30   angle_and_sd Angles_and_Sds[20];
       
    31 
       
    32   struct timeval tv;
       
    33   double start_time;
       
    34   gettimeofday(&tv, NULL);
       
    35   start_time = (double)tv.tv_sec;
       
    36   printf("Starting deskew process: time = %lf\n", ((double) tv.tv_sec) - start_time);
       
    37   if(ENABLE_USER_INTERFACE)
       
    38     set_status("Finding Skew. . .");
       
    39 /* first run, angular spacing = 1 degree */
       
    40   
       
    41   test_angle = -1;
       
    42   angular_skip = 1;  
       
    43   double loop_start_angle = 0;
       
    44   double loop_step = 1;
       
    45   for(i = 0; i < 2; i++)
       
    46     {
       
    47       temp_hist = project_histogram(r, loop_start_angle);
       
    48       Angles_and_Sds[0].angle = loop_start_angle;
       
    49       Angles_and_Sds[0].sd = temp_hist->get_standard_dev();
       
    50   
       
    51       temp_hist = project_histogram(r, loop_start_angle + loop_step);
       
    52       Angles_and_Sds[1].angle = loop_start_angle + loop_step;
       
    53       Angles_and_Sds[1].sd = temp_hist->get_standard_dev();
       
    54       
       
    55       if(Angles_and_Sds[1].sd > Angles_and_Sds[0].sd) 
       
    56 	{
       
    57 	  angle_increment = loop_step;
       
    58 	  max_index = 1;
       
    59 	  test_angle = Angles_and_Sds[1].angle + angle_increment;
       
    60 	}
       
    61       else
       
    62 	{
       
    63 	  max_index = 0;
       
    64 	  angle_increment = -loop_step;
       
    65 	  test_angle = Angles_and_Sds[0].angle + angle_increment;
       
    66 	}
       
    67       for(j = 2; j < 10; j++)
       
    68 	{
       
    69 	  temp_hist = project_histogram(r, test_angle);
       
    70 	  Angles_and_Sds[j].angle = test_angle; 
       
    71 	  Angles_and_Sds[j].sd = temp_hist->get_standard_dev(); 
       
    72 	  if(Angles_and_Sds[j].sd > Angles_and_Sds[max_index].sd)
       
    73 	    {
       
    74 	      max_index = j;
       
    75 	      test_angle += angle_increment;
       
    76 	    }
       
    77 	  else
       
    78 	    break;
       
    79 	}      
       
    80       loop_start_angle = Angles_and_Sds[max_index].angle;
       
    81       loop_step = 0.1;
       
    82     }
       
    83   gettimeofday(&tv, NULL);
       
    84   /*  printf("Done findinge skew.  Elapsed time = %lf\n", ((double) tv.tv_sec) - start_time); */
       
    85   if(ENABLE_USER_INTERFACE)
       
    86       {
       
    87 	set_status("Skew angle = %.3lf", Angles_and_Sds[max_index].angle);
       
    88 	update();
       
    89       }
       
    90   return Angles_and_Sds[max_index].angle;
       
    91 }  
       
    92 
       
    93 
       
    94 
       
    95 
       
    96 
       
    97