microb 2010
[aversive.git] / projects / microb2010 / sensorboard / img_processing.h
diff --git a/projects/microb2010/sensorboard/img_processing.h b/projects/microb2010/sensorboard/img_processing.h
new file mode 100644 (file)
index 0000000..4c06237
--- /dev/null
@@ -0,0 +1,111 @@
+
+    
+
+typedef struct _Object_bb
+{
+       uint8_t x_min;
+       uint8_t x_max;
+       uint8_t y_min;
+       uint8_t y_max;
+       uint16_t len;
+}Object_bb;
+
+#define POLY_MAX_PTS 12
+typedef struct _Object_poly
+{      
+       uint16_t pixels_perim;
+       uint16_t pts_num;
+       point_t pts[POLY_MAX_PTS];
+       uint16_t len;
+       uint8_t color;
+}Object_poly;
+    
+
+typedef struct _zone
+{      
+       point_t p;
+       uint8_t h:7;
+       uint8_t valid:1;
+}zone;
+
+
+typedef struct _drop_column_zone
+{
+       uint8_t valid;
+       uint8_t z;
+       uint8_t h;
+}drop_column_zone;
+
+typedef struct _drop_lintel_zone
+{
+       uint8_t valid;
+       uint8_t z1;
+       uint8_t h;
+       uint8_t z2;
+}drop_lintel_zone;
+
+
+
+
+#define MAX_ZONES 30
+
+#define MAX_SISTER_PER_ZONE 1
+
+
+
+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);
+
+float vect_get_angle(vect_t*v, vect_t* w);
+
+void object_poly_get_min_ar(Object_poly *o, unsigned int *pts_index_out, vect_t *v_out, vect_t *r1, vect_t*r2);
+
+void draw_pt_vect(unsigned char *buf, int16_t x_in, int16_t y_in, vect_t *v, point_t p);
+
+void vect_rot_trigo(vect_t* v);
+
+int object_poly_caliper_to_rectangle(Object_poly *o, 
+                                    unsigned int *pts_index_out, vect_t* caliper, 
+                                    vect_t *r1, vect_t*r2, point_t *p);
+
+int split_rectangle(point_t *p, vect_t *r1, vect_t* r2, uint8_t max_zone, zone* zones, uint8_t color);
+
+
+
+int zone_filtre_min_surface(unsigned char* data, int16_t x_in, int16_t y_in, 
+                           uint8_t color, unsigned int num_zone, zone* p);
+
+void reset_drop_zone(void);
+void display_drop_zones(uint8_t n_columns, uint8_t n_lintels, zone* zones);
+
+unsigned int solve_objects_dropping(unsigned int points, unsigned int points_max,
+                                   uint8_t n_columns, uint8_t n_lintels, 
+                                   uint8_t zones_num, zone* zones, int8_t sisters[MAX_ZONES][MAX_SISTER_PER_ZONE], uint8_t working_zone);
+
+uint8_t process_img(unsigned char *buffer, int16_t x_in, int16_t y_in,
+                   zone * all_zones, uint8_t max_zones);
+
+
+uint8_t color2h(uint8_t color);
+uint8_t h2color(uint8_t color);
+
+int8_t get_column_dropzone(unsigned char *buffer, int16_t x_in, int16_t y_in, 
+                          uint8_t working_zone, int16_t center_x, int16_t center_y,
+                          int16_t * dropzone_x, int16_t * dropzone_y);
+
+
+uint8_t is_temple_there(unsigned char * buffer, int16_t x_in, int16_t y_in, 
+                       uint8_t h, int16_t center_x, int16_t center_y);
+
+
+
+int8_t find_temple_dropzone(unsigned char *buffer, int16_t x_in, int16_t y_in, 
+                           uint8_t working_zone, int16_t center_x, int16_t center_y,
+                           int16_t * dropzone_x, int16_t * dropzone_y);
+
+void process_img_to_zone(unsigned char *buffer, int16_t x_in, int16_t y_in);
+
+#define PIXEL2CM (300./27.)
+
+
+extern uint8_t g_zone_num;
+extern zone g_all_zones[MAX_ZONES];