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