|
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 |