reference/ocr-simple/project.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 <stdarg.h>
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     2
#include "tcl_interface.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     3
#include "project.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     4
#include "histogram.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     5
#include "bitmap.h"
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     6
#include <stdio.h>
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     7
#include <math.h>
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     8
#include <cstdlib>
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
     9
#include "status_message.h"
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
int docommand(char* fmt, ...);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    12
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
void draw_bitmap(int x, int y, char* xbm_file)
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
  docommand(".t.f.c create bitmap %d %d -bitmap @%s", x, y, xbm_file);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    18
  docommand("update");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    19
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    20
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    21
#define LINE_SKIP 5
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    22
#define DRAW_RAYS 0
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    23
#define DEBUG_PROJECT_HISTOGRAM 1
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    24
#define DRAW_PIXELS 0
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    25
#define PRINT_STATUS 1
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    26
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    27
Histogram* project_histogram(RLEMap* r, double cut_angle)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    28
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    29
  if (ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    30
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    31
	docommand("update");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    32
	if(DRAW_RAYS)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    33
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    34
	      docommand(".main_window.display.work_space delete project_ray");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    35
	    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    36
	if(DRAW_PIXELS)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    37
	    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    38
	      docommand(".t.f.c delete project_pixels");
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    39
	    }
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
  int num_values = r->imageLength() / LINE_SKIP;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    42
  int* ret_array = (int*) malloc (sizeof(int) * num_values);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    43
  for(int current_value = 0; current_value < num_values; current_value++)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    44
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    45
      ret_array[current_value] = calculate_one_rle_ray_weight(r, cut_angle, current_value*LINE_SKIP);  /* the real work */
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
  Histogram* h = new Histogram(num_values - 1, ret_array, cut_angle);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    48
  if(PRINT_STATUS && ENABLE_USER_INTERFACE)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    49
      {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    50
	set_status("Deskewing: @%.3lf degrees, standard deviation = %.3lf", cut_angle, h->get_standard_dev());
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    51
      }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    52
  if(0)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    53
    h->display();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    54
  return h;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    55
}
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
inline double deg_to_rad(double deg)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    58
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    59
  return deg * (M_PI / 180.00);
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    62
int PRINT_RAYS = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    63
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    64
int calculate_one_rle_ray_weight(RLEMap* rlemap, double cut_angle, int row_num)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    65
{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    66
  /* cuts through b at cut_angle (cut angle in DEG) , adding up the weights */ 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    67
  /* of the pixels in the cut line */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    68
  /* RLEMap methodology:  Translate the angular slope into rise/run slope,
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    69
     find out how many bits (how much run) to read horizontally before 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    70
     jumping upwards one bit.  Make use of RLEMap::pixels_between(row,st,fi) */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    71
  /* possible optimizations: calculate this initial stuff "run_bits" "slope" 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    72
     once for each histogram, pass as args to this */
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
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    75
  double slope;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    76
  double float_run_bits;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    77
  int y_update;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    78
  double new_x;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    79
  double rad_cut_angle = deg_to_rad(cut_angle);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    80
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    81
  slope = tan(rad_cut_angle);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    82
  float_run_bits = fabs((((double)1)/sin(rad_cut_angle)) * cos(rad_cut_angle));
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    83
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    84
  int ray_weight = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    85
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    86
  double cur_x = 0;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    87
  int cur_y = row_num;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    88
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    89
  if(cut_angle < 0) 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    90
    y_update =  -1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    91
  else
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    92
    y_update = 1;
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
  int image_height = rlemap->imageLength();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    96
  int image_width = rlemap->imageWidth();
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    97
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    98
  while(((new_x = cur_x + float_run_bits) < image_width) &&
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
    99
	(cur_y >= 0) && (cur_y < image_height))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   100
    {
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   101
      /* watch out about going past rlemap bounds */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   102
      ray_weight += rlemap->pixels_between((int)cur_x, (int)new_x, cur_y);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   103
      cur_x = new_x + 1;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   104
      cur_y = cur_y + y_update;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   105
    }
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   106
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   107
  /* and once more for posterity */
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   108
  if((cur_y >= 0) && (cur_y < image_height) && (cur_x < image_width))
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   109
    ray_weight += rlemap->pixels_between((int)cur_x, image_width, cur_y);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   110
  
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   111
  if(1)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   112
    if(DRAW_RAYS)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   113
	{
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   114
	  docommand(".main_window.display.work_space create line %d %d %d %d -fill blue -tags {project_ray IMAGE_TAG}", 0, row_num, (int)cur_x, (int)cur_y);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   115
	} 
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   116
  if(PRINT_RAYS)
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   117
    printf("---Ray weight for cut angle %lf = %d\n", cut_angle, ray_weight);
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   118
  return ray_weight;
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   119
}
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   120
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   121
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   122
6b8091ca909a Init from working directory of svn repository.
viric@llimona
parents:
diff changeset
   123