diff --git a/src/omv/boards/ARDUINO_GIGA/imlib_config.h b/src/omv/boards/ARDUINO_GIGA/imlib_config.h index 44ce6570f..ef0eee615 100644 --- a/src/omv/boards/ARDUINO_GIGA/imlib_config.h +++ b/src/omv/boards/ARDUINO_GIGA/imlib_config.h @@ -118,6 +118,11 @@ // Enable find_barcodes() (42 KB) #define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +#define IMLIB_ENABLE_FEATURES +#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN @@ -158,5 +163,4 @@ // Stereo Imaging // #define IMLIB_ENABLE_STEREO_DISPARITY - #endif //__IMLIB_CONFIG_H__ diff --git a/src/omv/boards/ARDUINO_NANO_33_BLE_SENSE/imlib_config.h b/src/omv/boards/ARDUINO_NANO_33_BLE_SENSE/imlib_config.h index b07c5fd69..6260080e2 100644 --- a/src/omv/boards/ARDUINO_NANO_33_BLE_SENSE/imlib_config.h +++ b/src/omv/boards/ARDUINO_NANO_33_BLE_SENSE/imlib_config.h @@ -119,6 +119,11 @@ // Enable find_barcodes() (42 KB) //#define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +//#define IMLIB_ENABLE_FEATURES +//#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +//#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/ARDUINO_NANO_RP2040_CONNECT/imlib_config.h b/src/omv/boards/ARDUINO_NANO_RP2040_CONNECT/imlib_config.h index 40516ed5c..86cbcee0e 100644 --- a/src/omv/boards/ARDUINO_NANO_RP2040_CONNECT/imlib_config.h +++ b/src/omv/boards/ARDUINO_NANO_RP2040_CONNECT/imlib_config.h @@ -118,6 +118,11 @@ // Enable find_barcodes() (42 KB) //#define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +//#define IMLIB_ENABLE_FEATURES +//#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +//#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/ARDUINO_NICLA_VISION/imlib_config.h b/src/omv/boards/ARDUINO_NICLA_VISION/imlib_config.h index ae26d1e03..49aa6077f 100644 --- a/src/omv/boards/ARDUINO_NICLA_VISION/imlib_config.h +++ b/src/omv/boards/ARDUINO_NICLA_VISION/imlib_config.h @@ -118,6 +118,11 @@ // Enable find_barcodes() (42 KB) #define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +#define IMLIB_ENABLE_FEATURES +#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/ARDUINO_PORTENTA_H7/imlib_config.h b/src/omv/boards/ARDUINO_PORTENTA_H7/imlib_config.h index 6fc81f158..e74af595a 100644 --- a/src/omv/boards/ARDUINO_PORTENTA_H7/imlib_config.h +++ b/src/omv/boards/ARDUINO_PORTENTA_H7/imlib_config.h @@ -118,6 +118,11 @@ // Enable find_barcodes() (42 KB) #define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +#define IMLIB_ENABLE_FEATURES +#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/OPENMV1/imlib_config.h b/src/omv/boards/OPENMV1/imlib_config.h index 57aadcf1c..c5aea0021 100644 --- a/src/omv/boards/OPENMV1/imlib_config.h +++ b/src/omv/boards/OPENMV1/imlib_config.h @@ -67,6 +67,11 @@ // Enable find_barcodes() (42 KB) //#define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +//#define IMLIB_ENABLE_FEATURES +//#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +//#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable Tensor Flow //#define IMLIB_ENABLE_TF diff --git a/src/omv/boards/OPENMV2/imlib_config.h b/src/omv/boards/OPENMV2/imlib_config.h index 8d06d0dba..ed4fafd9d 100644 --- a/src/omv/boards/OPENMV2/imlib_config.h +++ b/src/omv/boards/OPENMV2/imlib_config.h @@ -115,6 +115,11 @@ // Enable find_barcodes() (42 KB) //#define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +//#define IMLIB_ENABLE_FEATURES +//#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +//#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable Tensor Flow //#define IMLIB_ENABLE_TF diff --git a/src/omv/boards/OPENMV3/imlib_config.h b/src/omv/boards/OPENMV3/imlib_config.h index ca2cdde26..3f7e4092f 100644 --- a/src/omv/boards/OPENMV3/imlib_config.h +++ b/src/omv/boards/OPENMV3/imlib_config.h @@ -118,6 +118,11 @@ // Enable find_barcodes() (42 KB) #define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +#define IMLIB_ENABLE_FEATURES +#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/OPENMV4/imlib_config.h b/src/omv/boards/OPENMV4/imlib_config.h index 293b67872..c7860269c 100644 --- a/src/omv/boards/OPENMV4/imlib_config.h +++ b/src/omv/boards/OPENMV4/imlib_config.h @@ -118,6 +118,11 @@ // Enable find_barcodes() (42 KB) #define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +#define IMLIB_ENABLE_FEATURES +#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/OPENMV4P/imlib_config.h b/src/omv/boards/OPENMV4P/imlib_config.h index 54f34a214..4a931c55d 100644 --- a/src/omv/boards/OPENMV4P/imlib_config.h +++ b/src/omv/boards/OPENMV4P/imlib_config.h @@ -118,6 +118,11 @@ // Enable find_barcodes() (42 KB) #define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +#define IMLIB_ENABLE_FEATURES +#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/OPENMV4_PRO/imlib_config.h b/src/omv/boards/OPENMV4_PRO/imlib_config.h index 54f34a214..4a931c55d 100644 --- a/src/omv/boards/OPENMV4_PRO/imlib_config.h +++ b/src/omv/boards/OPENMV4_PRO/imlib_config.h @@ -118,6 +118,11 @@ // Enable find_barcodes() (42 KB) #define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +#define IMLIB_ENABLE_FEATURES +#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/OPENMVPT/imlib_config.h b/src/omv/boards/OPENMVPT/imlib_config.h index 54f34a214..4a931c55d 100644 --- a/src/omv/boards/OPENMVPT/imlib_config.h +++ b/src/omv/boards/OPENMVPT/imlib_config.h @@ -118,6 +118,11 @@ // Enable find_barcodes() (42 KB) #define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +#define IMLIB_ENABLE_FEATURES +#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/OPENMV_RT1060/imlib_config.h b/src/omv/boards/OPENMV_RT1060/imlib_config.h index cd5fe395b..2df869fd0 100644 --- a/src/omv/boards/OPENMV_RT1060/imlib_config.h +++ b/src/omv/boards/OPENMV_RT1060/imlib_config.h @@ -117,6 +117,11 @@ // Enable find_barcodes() (42 KB) #define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +#define IMLIB_ENABLE_FEATURES +#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/boards/PICO/imlib_config.h b/src/omv/boards/PICO/imlib_config.h index 56c810a3d..867020f4c 100644 --- a/src/omv/boards/PICO/imlib_config.h +++ b/src/omv/boards/PICO/imlib_config.h @@ -119,6 +119,11 @@ // Enable find_barcodes() (42 KB) //#define IMLIB_ENABLE_BARCODES +// Enable find_features() and built-in Haar cascades. (75KBs) +//#define IMLIB_ENABLE_FEATURES +//#define IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE +//#define IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE + // Enable CMSIS NN // #if !defined(CUBEAI) // #define IMLIB_ENABLE_CNN diff --git a/src/omv/imlib/haar.c b/src/omv/imlib/haar.c index ec462cbb5..a57e91267 100644 --- a/src/omv/imlib/haar.c +++ b/src/omv/imlib/haar.c @@ -19,6 +19,7 @@ #include "cascade.h" #include "file_utils.h" +#ifdef IMLIB_ENABLE_FEATURES static int eval_weak_classifier(cascade_t *cascade, point_t pt, int t_idx, int w_idx, int r_idx) { int32_t sumw = 0; mw_image_t *sum = cascade->sum; @@ -249,7 +250,9 @@ error: int imlib_load_cascade(cascade_t *cascade, const char *path) { // built-in cascade - if (strcmp(path, "frontalface") == 0) { + if (0) { + #ifdef IMLIB_ENABLE_FEATURES_BUILTIN_FACE_CASCADE + } else if (strcmp(path, "frontalface") == 0) { cascade->window.w = frontalface_window_w; cascade->window.h = frontalface_window_h; cascade->n_stages = frontalface_n_stages; @@ -261,6 +264,8 @@ int imlib_load_cascade(cascade_t *cascade, const char *path) { cascade->num_rectangles_array = (int8_t *) frontalface_num_rectangles_array; cascade->weights_array = (int8_t *) frontalface_weights_array; cascade->rectangles_array = (int8_t *) frontalface_rectangles_array; + #endif + #ifdef IMLIB_ENABLE_FEATURES_BUILTIN_EYES_CASCADE } else if (strcmp(path, "eye") == 0) { cascade->window.w = eye_window_w; cascade->window.h = eye_window_h; @@ -273,6 +278,7 @@ int imlib_load_cascade(cascade_t *cascade, const char *path) { cascade->num_rectangles_array = (int8_t *) eye_num_rectangles_array; cascade->weights_array = (int8_t *) eye_weights_array; cascade->rectangles_array = (int8_t *) eye_rectangles_array; + #endif } else { #if defined(IMLIB_ENABLE_IMAGE_FILE_IO) // xml cascade @@ -294,3 +300,4 @@ int imlib_load_cascade(cascade_t *cascade, const char *path) { } return FR_OK; } +#endif // IMLIB_ENABLE_FEATURES diff --git a/src/omv/modules/py_image.c b/src/omv/modules/py_image.c index 5c11f9739..78ef5b88e 100644 --- a/src/omv/modules/py_image.c +++ b/src/omv/modules/py_image.c @@ -35,7 +35,6 @@ #include "py_imageio.h" #endif -static const mp_obj_type_t py_cascade_type; static const mp_obj_type_t py_image_type; #if defined(IMLIB_ENABLE_IMAGE_FILE_IO) @@ -44,6 +43,9 @@ extern const char *ffs_strerror(FRESULT res); // Haar Cascade /////////////////////////////////////////////////////////////// +#ifdef IMLIB_ENABLE_FEATURES +static const mp_obj_type_t py_cascade_type; + typedef struct _py_cascade_obj_t { mp_obj_base_t base; struct cascade _cobj; @@ -67,6 +69,8 @@ STATIC MP_DEFINE_CONST_OBJ_TYPE( MP_TYPE_FLAG_NONE, print, py_cascade_print ); +#endif // IMLIB_ENABLE_FEATURES + // Keypoints object /////////////////////////////////////////////////////////// #ifdef IMLIB_ENABLE_FIND_KEYPOINTS @@ -6209,6 +6213,7 @@ static mp_obj_t py_image_find_template(uint n_args, const mp_obj_t *args, mp_map STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_find_template_obj, 3, py_image_find_template); #endif // IMLIB_FIND_TEMPLATE +#ifdef IMLIB_ENABLE_FEATURES static mp_obj_t py_image_find_features(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { image_t *arg_img = py_helper_arg_to_image(args[0], ARG_IMAGE_MUTABLE); cascade_t *cascade = py_cascade_cobj(args[1]); @@ -6243,6 +6248,7 @@ static mp_obj_t py_image_find_features(uint n_args, const mp_obj_t *args, mp_map return objects_list; } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_find_features_obj, 2, py_image_find_features); +#endif // IMLIB_ENABLE_FEATURES static mp_obj_t py_image_find_eye(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { image_t *arg_img = py_helper_arg_to_image(args[0], ARG_IMAGE_GRAYSCALE); @@ -6722,7 +6728,11 @@ static const mp_rom_map_elem_t locals_dict_table[] = { #else {MP_ROM_QSTR(MP_QSTR_find_template), MP_ROM_PTR(&py_func_unavailable_obj)}, #endif + #ifdef IMLIB_ENABLE_FEATURES {MP_ROM_QSTR(MP_QSTR_find_features), MP_ROM_PTR(&py_image_find_features_obj)}, + #else + {MP_ROM_QSTR(MP_QSTR_find_features), MP_ROM_PTR(&py_func_unavailable_obj)}, + #endif {MP_ROM_QSTR(MP_QSTR_find_eye), MP_ROM_PTR(&py_image_find_eye_obj)}, #ifdef IMLIB_ENABLE_FIND_LBP {MP_ROM_QSTR(MP_QSTR_find_lbp), MP_ROM_PTR(&py_image_find_lbp_obj)}, @@ -7084,6 +7094,7 @@ mp_obj_t py_image_load_image(uint n_args, const mp_obj_t *pos_args, mp_map_t *kw } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_load_image_obj, 1, py_image_load_image); +#ifdef IMLIB_ENABLE_FEATURES mp_obj_t py_image_load_cascade(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { cascade_t cascade; const char *path = mp_obj_str_get_str(args[0]); @@ -7114,6 +7125,7 @@ mp_obj_t py_image_load_cascade(uint n_args, const mp_obj_t *args, mp_map_t *kw_a return o; } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_load_cascade_obj, 1, py_image_load_cascade); +#endif // IMLIB_ENABLE_FEATURES #if defined(IMLIB_ENABLE_DESCRIPTOR) #if defined(IMLIB_ENABLE_IMAGE_FILE_IO) @@ -7425,7 +7437,9 @@ static const mp_rom_map_elem_t globals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR_yuv_to_rgb), MP_ROM_PTR(&py_image_yuv_to_rgb_obj)}, {MP_ROM_QSTR(MP_QSTR_yuv_to_lab), MP_ROM_PTR(&py_image_yuv_to_lab_obj)}, {MP_ROM_QSTR(MP_QSTR_Image), MP_ROM_PTR(&py_image_load_image_obj)}, + #ifdef IMLIB_ENABLE_FEATURES {MP_ROM_QSTR(MP_QSTR_HaarCascade), MP_ROM_PTR(&py_image_load_cascade_obj)}, + #endif #if defined(IMLIB_ENABLE_DESCRIPTOR) && defined(IMLIB_ENABLE_IMAGE_FILE_IO) {MP_ROM_QSTR(MP_QSTR_load_descriptor), MP_ROM_PTR(&py_image_load_descriptor_obj)}, {MP_ROM_QSTR(MP_QSTR_save_descriptor), MP_ROM_PTR(&py_image_save_descriptor_obj)},