work on beacon
[aversive.git] / projects / microb2010 / sensorboard / img_processing.h
1
2     
3
4 typedef struct _Object_bb
5 {
6         uint8_t x_min;
7         uint8_t x_max;
8         uint8_t y_min;
9         uint8_t y_max;
10         uint16_t len;
11 }Object_bb;
12
13 #define POLY_MAX_PTS 12
14 typedef struct _Object_poly
15 {       
16         uint16_t pixels_perim;
17         uint16_t pts_num;
18         point_t pts[POLY_MAX_PTS];
19         uint16_t len;
20         uint8_t color;
21 }Object_poly;
22     
23
24 typedef struct _zone
25 {       
26         point_t p;
27         uint8_t h:7;
28         uint8_t valid:1;
29 }zone;
30
31
32 typedef struct _drop_column_zone
33 {
34         uint8_t valid;
35         uint8_t z;
36         uint8_t h;
37 }drop_column_zone;
38
39 typedef struct _drop_lintel_zone
40 {
41         uint8_t valid;
42         uint8_t z1;
43         uint8_t h;
44         uint8_t z2;
45 }drop_lintel_zone;
46
47
48
49
50 #define MAX_ZONES 30
51
52 #define MAX_SISTER_PER_ZONE 1
53
54
55
56 unsigned char *parcour_img(unsigned char* data, int16_t x_in, int16_t y_in, Object_bb *sac_obj, Object_poly *sac_obj_poly, int16_t max_obj);
57
58 float vect_get_angle(vect_t*v, vect_t* w);
59
60 void object_poly_get_min_ar(Object_poly *o, unsigned int *pts_index_out, vect_t *v_out, vect_t *r1, vect_t*r2);
61
62 void draw_pt_vect(unsigned char *buf, int16_t x_in, int16_t y_in, vect_t *v, point_t p);
63
64 void vect_rot_trigo(vect_t* v);
65
66 int object_poly_caliper_to_rectangle(Object_poly *o, 
67                                      unsigned int *pts_index_out, vect_t* caliper, 
68                                      vect_t *r1, vect_t*r2, point_t *p);
69
70 int split_rectangle(point_t *p, vect_t *r1, vect_t* r2, uint8_t max_zone, zone* zones, uint8_t color);
71
72
73
74 int zone_filtre_min_surface(unsigned char* data, int16_t x_in, int16_t y_in, 
75                             uint8_t color, unsigned int num_zone, zone* p);
76
77 void reset_drop_zone(void);
78 void display_drop_zones(uint8_t n_columns, uint8_t n_lintels, zone* zones);
79
80 unsigned int solve_objects_dropping(unsigned int points, unsigned int points_max,
81                                     uint8_t n_columns, uint8_t n_lintels, 
82                                     uint8_t zones_num, zone* zones, int8_t sisters[MAX_ZONES][MAX_SISTER_PER_ZONE], uint8_t working_zone);
83
84 uint8_t process_img(unsigned char *buffer, int16_t x_in, int16_t y_in,
85                     zone * all_zones, uint8_t max_zones);
86
87
88 uint8_t color2h(uint8_t color);
89 uint8_t h2color(uint8_t color);
90
91 int8_t get_column_dropzone(unsigned char *buffer, int16_t x_in, int16_t y_in, 
92                            uint8_t working_zone, int16_t center_x, int16_t center_y,
93                            int16_t * dropzone_x, int16_t * dropzone_y);
94
95
96 uint8_t is_temple_there(unsigned char * buffer, int16_t x_in, int16_t y_in, 
97                         uint8_t h, int16_t center_x, int16_t center_y);
98
99
100
101 int8_t find_temple_dropzone(unsigned char *buffer, int16_t x_in, int16_t y_in, 
102                             uint8_t working_zone, int16_t center_x, int16_t center_y,
103                             int16_t * dropzone_x, int16_t * dropzone_y);
104
105 void process_img_to_zone(unsigned char *buffer, int16_t x_in, int16_t y_in);
106
107 #define PIXEL2CM (300./27.)
108
109
110 extern uint8_t g_zone_num;
111 extern zone g_all_zones[MAX_ZONES];