diff --git a/src/omv/boards/OPENMV1/imlib_config.h b/src/omv/boards/OPENMV1/imlib_config.h index 2f9d5191c..9b579391b 100644 --- a/src/omv/boards/OPENMV1/imlib_config.h +++ b/src/omv/boards/OPENMV1/imlib_config.h @@ -11,6 +11,9 @@ #ifndef __IMLIB_CONFIG_H__ #define __IMLIB_CONFIG_H__ +// Enable Image I/O +//#define IMLIB_ENABLE_IMAGE_IO + // Enable LAB LUT //#define IMLIB_ENABLE_LAB_LUT diff --git a/src/omv/boards/OPENMV2/imlib_config.h b/src/omv/boards/OPENMV2/imlib_config.h index 233627085..f539b6f97 100644 --- a/src/omv/boards/OPENMV2/imlib_config.h +++ b/src/omv/boards/OPENMV2/imlib_config.h @@ -11,6 +11,9 @@ #ifndef __IMLIB_CONFIG_H__ #define __IMLIB_CONFIG_H__ +// Enable Image I/O +#define IMLIB_ENABLE_IMAGE_IO + // Enable LAB LUT #define IMLIB_ENABLE_LAB_LUT @@ -121,9 +124,8 @@ // Enable find_keypoints() //#define IMLIB_ENABLE_FIND_KEYPOINTS -#if defined(IMLIB_ENABLE_FIND_LBP) || defined(IMLIB_ENABLE_FIND_KEYPOINTS) - #define IMLIB_ENABLE_DESCRIPTOR -#endif +// Enable load, save and match descriptor +//#define IMLIB_ENABLE_DESCRIPTOR // Enable find_hog() //#define IMLIB_ENABLE_HOG diff --git a/src/omv/boards/OPENMV3/imlib_config.h b/src/omv/boards/OPENMV3/imlib_config.h index 1bfbe81c3..f9f367d99 100644 --- a/src/omv/boards/OPENMV3/imlib_config.h +++ b/src/omv/boards/OPENMV3/imlib_config.h @@ -11,6 +11,9 @@ #ifndef __IMLIB_CONFIG_H__ #define __IMLIB_CONFIG_H__ +// Enable Image I/O +#define IMLIB_ENABLE_IMAGE_IO + // Enable LAB LUT #define IMLIB_ENABLE_LAB_LUT @@ -131,9 +134,8 @@ // Enable find_keypoints() #define IMLIB_ENABLE_FIND_KEYPOINTS -#if defined(IMLIB_ENABLE_FIND_LBP) || defined(IMLIB_ENABLE_FIND_KEYPOINTS) - #define IMLIB_ENABLE_DESCRIPTOR -#endif +// Enable load, save and match descriptor +#define IMLIB_ENABLE_DESCRIPTOR // Enable find_hog() #define IMLIB_ENABLE_HOG diff --git a/src/omv/boards/OPENMV4/imlib_config.h b/src/omv/boards/OPENMV4/imlib_config.h index c182107d1..b28488213 100644 --- a/src/omv/boards/OPENMV4/imlib_config.h +++ b/src/omv/boards/OPENMV4/imlib_config.h @@ -11,6 +11,9 @@ #ifndef __IMLIB_CONFIG_H__ #define __IMLIB_CONFIG_H__ +// Enable Image I/O +#define IMLIB_ENABLE_IMAGE_IO + // Enable LAB LUT #define IMLIB_ENABLE_LAB_LUT @@ -131,9 +134,8 @@ // Enable find_keypoints() #define IMLIB_ENABLE_FIND_KEYPOINTS -#if defined(IMLIB_ENABLE_FIND_LBP) || defined(IMLIB_ENABLE_FIND_KEYPOINTS) - #define IMLIB_ENABLE_DESCRIPTOR -#endif +// Enable load, save and match descriptor +#define IMLIB_ENABLE_DESCRIPTOR // Enable find_hog() #define IMLIB_ENABLE_HOG diff --git a/src/omv/boards/OPENMV4P/imlib_config.h b/src/omv/boards/OPENMV4P/imlib_config.h index 2d00d8d58..5b529b05d 100644 --- a/src/omv/boards/OPENMV4P/imlib_config.h +++ b/src/omv/boards/OPENMV4P/imlib_config.h @@ -11,6 +11,9 @@ #ifndef __IMLIB_CONFIG_H__ #define __IMLIB_CONFIG_H__ +// Enable Image I/O +#define IMLIB_ENABLE_IMAGE_IO + // Enable LAB LUT #define IMLIB_ENABLE_LAB_LUT @@ -131,9 +134,8 @@ // Enable find_keypoints() #define IMLIB_ENABLE_FIND_KEYPOINTS -#if defined(IMLIB_ENABLE_FIND_LBP) || defined(IMLIB_ENABLE_FIND_KEYPOINTS) - #define IMLIB_ENABLE_DESCRIPTOR -#endif +// Enable load, save and match descriptor +#define IMLIB_ENABLE_DESCRIPTOR // Enable find_hog() #define IMLIB_ENABLE_HOG diff --git a/src/omv/boards/OPENMVPT/imlib_config.h b/src/omv/boards/OPENMVPT/imlib_config.h index 7b6b18811..1fc2304b3 100644 --- a/src/omv/boards/OPENMVPT/imlib_config.h +++ b/src/omv/boards/OPENMVPT/imlib_config.h @@ -11,6 +11,9 @@ #ifndef __IMLIB_CONFIG_H__ #define __IMLIB_CONFIG_H__ +// Enable Image I/O +#define IMLIB_ENABLE_IMAGE_IO + // Enable LAB LUT #define IMLIB_ENABLE_LAB_LUT @@ -131,9 +134,8 @@ // Enable find_keypoints() #define IMLIB_ENABLE_FIND_KEYPOINTS -#if defined(IMLIB_ENABLE_FIND_LBP) || defined(IMLIB_ENABLE_FIND_KEYPOINTS) - #define IMLIB_ENABLE_DESCRIPTOR -#endif +// Enable load, save and match descriptor +#define IMLIB_ENABLE_DESCRIPTOR // Enable find_hog() #define IMLIB_ENABLE_HOG diff --git a/src/omv/boards/PORTENTA/imlib_config.h b/src/omv/boards/PORTENTA/imlib_config.h index bbf43d61b..4ecbee3ac 100644 --- a/src/omv/boards/PORTENTA/imlib_config.h +++ b/src/omv/boards/PORTENTA/imlib_config.h @@ -11,6 +11,9 @@ #ifndef __IMLIB_CONFIG_H__ #define __IMLIB_CONFIG_H__ +// Enable Image I/O +#define IMLIB_ENABLE_IMAGE_IO + // Enable LAB LUT //#define IMLIB_ENABLE_LAB_LUT @@ -131,9 +134,8 @@ // Enable find_keypoints() #define IMLIB_ENABLE_FIND_KEYPOINTS -#if defined(IMLIB_ENABLE_FIND_LBP) || defined(IMLIB_ENABLE_FIND_KEYPOINTS) - #define IMLIB_ENABLE_DESCRIPTOR -#endif +// Enable load, save and match descriptor +#define IMLIB_ENABLE_DESCRIPTOR // Enable find_hog() #define IMLIB_ENABLE_HOG diff --git a/src/omv/common/ff_wrapper.c b/src/omv/common/ff_wrapper.c index 2b7953141..97da1e6cf 100644 --- a/src/omv/common/ff_wrapper.c +++ b/src/omv/common/ff_wrapper.c @@ -6,10 +6,14 @@ * File System Helper Functions * */ +#include "imlib_config.h" +#if defined(IMLIB_ENABLE_IMAGE_IO) + #include #include "py/runtime.h" #include "extmod/vfs.h" #include "extmod/vfs_fat.h" + #include "common.h" #include "fb_alloc.h" #include "ff_wrapper.h" @@ -460,3 +464,4 @@ void write_data(FIL *fp, const void *data, UINT size) if (bytes != size) ff_write_fail(fp); } } +#endif //IMLIB_ENABLE_IMAGE_IO diff --git a/src/omv/imlib/bmp.c b/src/omv/imlib/bmp.c index c4384672e..a69c55a03 100644 --- a/src/omv/imlib/bmp.c +++ b/src/omv/imlib/bmp.c @@ -8,12 +8,15 @@ * * BMP reader/writer. */ -#include -#include -#include -#include "ff_wrapper.h" -#include "xalloc.h" #include "imlib.h" +#if defined(IMLIB_ENABLE_IMAGE_IO) + +#include +#include "py/obj.h" +#include "py/nlr.h" + +#include "xalloc.h" +#include "ff_wrapper.h" // This function inits the geometry values of an image (opens file). bool bmp_read_geometry(FIL *fp, image_t *img, const char *path, bmp_read_settings_t *rs) @@ -216,10 +219,12 @@ void bmp_read(image_t *img, const char *path) void bmp_write_subimg(image_t *img, const char *path, rectangle_t *r) { rectangle_t rect; - if (!rectangle_subimg(img, r, &rect)) ff_no_intersection(NULL); + if (!rectangle_subimg(img, r, &rect)) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "No intersection!")); + } + FIL fp; file_write_open(&fp, path); - file_buffer_on(&fp); if (IM_IS_GS(img)) { const int row_bytes = (((rect.w * 8) + 31) / 32) * 4; @@ -300,3 +305,4 @@ void bmp_write_subimg(image_t *img, const char *path, rectangle_t *r) file_close(&fp); } +#endif //IMLIB_ENABLE_IMAGE_IO diff --git a/src/omv/imlib/fft.c b/src/omv/imlib/fft.c index 39bdc623b..28d81cc02 100644 --- a/src/omv/imlib/fft.c +++ b/src/omv/imlib/fft.c @@ -6,6 +6,8 @@ * FFT LIB - can do 1024 point real FFTs and 512 point complex FFTs * */ +#include "py/nlr.h" +#include "py/obj.h" #include #include "fb_alloc.h" #include "ff_wrapper.h" @@ -548,7 +550,9 @@ void fft1d_run_again(fft1d_controller_t *controller) void fft2d_alloc(fft2d_controller_t *controller, image_t *img, rectangle_t *r) { controller->img = img; - if (!rectangle_subimg(controller->img, r, &controller->r)) ff_no_intersection(NULL); + if (!rectangle_subimg(controller->img, r, &controller->r)) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "No intersection!")); + } controller->w_pow2 = int_clog2(controller->r.w); controller->h_pow2 = int_clog2(controller->r.h); diff --git a/src/omv/imlib/gif.c b/src/omv/imlib/gif.c index 9fe65580c..74563686d 100644 --- a/src/omv/imlib/gif.c +++ b/src/omv/imlib/gif.c @@ -8,9 +8,11 @@ * * A simple GIF encoder. */ +#include "imlib.h" +#if defined(IMLIB_ENABLE_IMAGE_IO) + #include "fb_alloc.h" #include "ff_wrapper.h" -#include "imlib.h" #define BLOCK_SIZE (126) // (2^7) - 2 // (DO NOT CHANGE!) void gif_open(FIL *fp, int width, int height, bool color, bool loop) @@ -115,3 +117,4 @@ void gif_close(FIL *fp) write_byte(fp, ';'); file_close(fp); } +#endif //IMLIB_ENABLE_IMAGE_IO diff --git a/src/omv/imlib/haar.c b/src/omv/imlib/haar.c index c0544fad5..f6577f7b2 100644 --- a/src/omv/imlib/haar.c +++ b/src/omv/imlib/haar.c @@ -10,7 +10,9 @@ * Based on the work of Francesco Comaschi (f.comaschi@tue.nl) */ #include -#include +#include "py/obj.h" +#include "py/nlr.h" + #include "ff.h" #include "ff_wrapper.h" #include "xalloc.h" @@ -163,6 +165,7 @@ array_t *imlib_detect_objects(image_t *image, cascade_t *cascade, rectangle_t *r return objects; } +#if defined(IMLIB_ENABLE_IMAGE_IO) int imlib_load_cascade_from_file(cascade_t *cascade, const char *path) { int i; @@ -248,6 +251,7 @@ error: file_close(&fp); return res; } +#endif //(IMLIB_ENABLE_IMAGE_IO) int imlib_load_cascade(cascade_t *cascade, const char *path) { @@ -277,8 +281,12 @@ int imlib_load_cascade(cascade_t *cascade, const char *path) cascade->weights_array = (int8_t *)eye_weights_array; cascade->rectangles_array = (int8_t *)eye_rectangles_array; } else { + #if defined(IMLIB_ENABLE_IMAGE_IO) // xml cascade return imlib_load_cascade_from_file(cascade, path); + #else + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Image I/O is not supported")); + #endif } int i; diff --git a/src/omv/imlib/imlib.c b/src/omv/imlib/imlib.c index 15974a93c..2780021bf 100644 --- a/src/omv/imlib/imlib.c +++ b/src/omv/imlib/imlib.c @@ -863,6 +863,7 @@ void imlib_bayer_to_binary(image_t *img, int x_offset, int y_offset, int width, //////////////////////////////////////////////////////////////////////////////// +#if defined(IMLIB_ENABLE_IMAGE_IO) static save_image_format_t imblib_parse_extension(image_t *img, const char *path) { size_t l = strlen(path); @@ -964,10 +965,12 @@ static void imlib_read_pixels(FIL *fp, image_t *img, int n_lines, img_read_setti break; } } +#endif //IMLIB_ENABLE_IMAGE_IO void imlib_image_operation(image_t *img, const char *path, image_t *other, int scalar, line_op_t op, void *data) { if (path) { + #if defined(IMLIB_ENABLE_IMAGE_IO) uint32_t size = fb_avail() / 2; void *alloc = fb_alloc(size, FB_ALLOC_NO_HINT); // We have to do this before the read. // This code reads a window of an image in at a time and then executes @@ -979,7 +982,8 @@ void imlib_image_operation(image_t *img, const char *path, image_t *other, int s img_read_settings_t rs; bool vflipped = imlib_read_geometry(&fp, &temp, path, &rs); if (!IM_EQUAL(img, &temp)) { - ff_not_equal(&fp); + f_close(&fp); + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Images not equal!")); } // When processing vertically flipped images the read function will fill // the window up from the bottom. The read function assumes that the @@ -1007,9 +1011,12 @@ void imlib_image_operation(image_t *img, const char *path, image_t *other, int s file_buffer_off(&fp); file_close(&fp); fb_free(); + #else + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Image I/O is not supported")); + #endif } else if (other) { if (!IM_EQUAL(img, other)) { - ff_not_equal(NULL); + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Images not equal!")); } switch (img->bpp) { case IMAGE_BPP_BINARY: { @@ -1085,6 +1092,7 @@ void imlib_image_operation(image_t *img, const char *path, image_t *other, int s } } +#if defined(IMLIB_ENABLE_IMAGE_IO) void imlib_load_image(image_t *img, const char *path) { FIL fp; @@ -1147,6 +1155,7 @@ void imlib_save_image(image_t *img, const char *path, rectangle_t *roi, int qual break; } } +#endif //IMLIB_ENABLE_IMAGE_IO //////////////////////////////////////////////////////////////////////////////// diff --git a/src/omv/imlib/jpeg.c b/src/omv/imlib/jpeg.c index b4150aabc..acfd9f0a5 100644 --- a/src/omv/imlib/jpeg.c +++ b/src/omv/imlib/jpeg.c @@ -1290,6 +1290,7 @@ jpeg_overflow: } #endif //defined OMV_HARDWARE_JPEG +#if defined(IMLIB_ENABLE_IMAGE_IO) // This function inits the geometry values of an image. void jpeg_read_geometry(FIL *fp, image_t *img, const char *path, jpg_read_settings_t *rs) { @@ -1376,3 +1377,4 @@ void jpeg_write(image_t *img, const char *path, int quality) } file_close(&fp); } +#endif //IMLIB_ENABLE_IMAGE_IO) diff --git a/src/omv/imlib/mjpeg.c b/src/omv/imlib/mjpeg.c index aa82db120..e8d4f12a3 100644 --- a/src/omv/imlib/mjpeg.c +++ b/src/omv/imlib/mjpeg.c @@ -8,9 +8,11 @@ * * A simple MJPEG encoder. */ +#include "imlib.h" +#if defined(IMLIB_ENABLE_IMAGE_IO) + #include "fb_alloc.h" #include "ff_wrapper.h" -#include "imlib.h" #define SIZE_OFFSET (1*4) #define MICROS_OFFSET (8*4) @@ -149,3 +151,4 @@ void mjpeg_close(FIL *fp, uint32_t *frames, uint32_t *bytes, float fps) write_long(fp, 4 + (*frames * 8) + *bytes); file_close(fp); } +#endif //IMLIB_ENABLE_IMAGE_IO diff --git a/src/omv/imlib/orb.c b/src/omv/imlib/orb.c index 0e87ad02f..5e3e05c5c 100644 --- a/src/omv/imlib/orb.c +++ b/src/omv/imlib/orb.c @@ -704,6 +704,7 @@ int orb_filter_keypoints(array_t *kpts, rectangle_t *r, point_t *c) return matches; } +#if defined(IMLIB_ENABLE_IMAGE_IO) int orb_save_descriptor(FIL *fp, array_t *kpts) { UINT bytes; @@ -823,6 +824,7 @@ int orb_load_descriptor(FIL *fp, array_t *kpts) error: return res; } +#endif //IMLIB_ENABLE_IMAGE_IO float orb_cluster_dist(int cx, int cy, void *kp_in) { diff --git a/src/omv/imlib/ppm.c b/src/omv/imlib/ppm.c index c7e0601d7..fecf47192 100644 --- a/src/omv/imlib/ppm.c +++ b/src/omv/imlib/ppm.c @@ -8,11 +8,17 @@ * * PPM/PGM reader/writer. */ + +#include "imlib.h" +#if defined(IMLIB_ENABLE_IMAGE_IO) + #include -#include -#include "ff_wrapper.h" +#include "py/obj.h" +#include "py/nlr.h" + #include "xalloc.h" #include "imlib.h" +#include "ff_wrapper.h" static void read_int_reset(ppm_read_settings_t *rs) { @@ -120,10 +126,12 @@ void ppm_read(image_t *img, const char *path) void ppm_write_subimg(image_t *img, const char *path, rectangle_t *r) { rectangle_t rect; - if (!rectangle_subimg(img, r, &rect)) ff_no_intersection(NULL); + if (!rectangle_subimg(img, r, &rect)) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "No intersection!")); + } + FIL fp; file_write_open(&fp, path); - file_buffer_on(&fp); if (IM_IS_GS(img)) { char buffer[20]; // exactly big enough for 5-digit w/h @@ -157,3 +165,4 @@ void ppm_write_subimg(image_t *img, const char *path, rectangle_t *r) file_close(&fp); } +#endif //IMLIB_ENABLE_IMAGE_IO diff --git a/src/omv/modules/py_gif.c b/src/omv/modules/py_gif.c index bbc5e75a0..43099c9db 100644 --- a/src/omv/modules/py_gif.c +++ b/src/omv/modules/py_gif.c @@ -26,7 +26,9 @@ typedef struct py_gif_obj { int height; bool color; bool loop; + #if defined(IMLIB_ENABLE_IMAGE_IO) FIL fp; + #endif } py_gif_obj_t; static mp_obj_t py_gif_open(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) @@ -38,8 +40,12 @@ static mp_obj_t py_gif_open(uint n_args, const mp_obj_t *args, mp_map_t *kw_args gif->loop = py_helper_keyword_int(n_args, args, 4, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_loop), true); gif->base.type = &py_gif_type; + #if defined(IMLIB_ENABLE_IMAGE_IO) file_write_open(&gif->fp, mp_obj_str_get_str(args[0])); gif_open(&gif->fp, gif->width, gif->height, gif->color, gif->loop); + #else + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Image I/O is not supported")); + #endif return gif; } @@ -63,8 +69,12 @@ static mp_obj_t py_gif_format(mp_obj_t gif_obj) static mp_obj_t py_gif_size(mp_obj_t gif_obj) { + #if defined(IMLIB_ENABLE_IMAGE_IO) py_gif_obj_t *arg_gif = gif_obj; return mp_obj_new_int(file_size_w_buf(&arg_gif->fp)); + #else + return mp_obj_new_int(0); + #endif } static mp_obj_t py_gif_loop(mp_obj_t gif_obj) @@ -75,6 +85,7 @@ static mp_obj_t py_gif_loop(mp_obj_t gif_obj) static mp_obj_t py_gif_add_frame(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { + #if defined(IMLIB_ENABLE_IMAGE_IO) py_gif_obj_t *arg_gif = args[0]; image_t *arg_img = py_image_cobj(args[1]); PY_ASSERT_FALSE_MSG(IM_IS_JPEG(arg_img), "Operation not supported on JPEG images."); @@ -85,13 +96,18 @@ static mp_obj_t py_gif_add_frame(uint n_args, const mp_obj_t *args, mp_map_t *kw int delay = py_helper_keyword_int(n_args, args, 2, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_delay), 10); gif_add_frame(&arg_gif->fp, arg_img, delay); + #else + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Image I/O is not supported")); + #endif return mp_const_none; } static mp_obj_t py_gif_close(mp_obj_t gif_obj) { + #if defined(IMLIB_ENABLE_IMAGE_IO) py_gif_obj_t *arg_gif = gif_obj; gif_close(&arg_gif->fp); + #endif return mp_const_none; } diff --git a/src/omv/modules/py_image.c b/src/omv/modules/py_image.c index 1d9badd6a..e88b1e11b 100644 --- a/src/omv/modules/py_image.c +++ b/src/omv/modules/py_image.c @@ -247,7 +247,8 @@ static const mp_obj_type_t py_kptmatch_type = { .locals_dict = (mp_obj_t) &py_kptmatch_locals_dict }; -#endif // IMLIB_ENABLE_FIND_KEYPOINTS + +#endif //IMLIB_ENABLE_DESCRIPTOR && IMLIB_ENABLE_FIND_KEYPOINTS // Image ////////////////////////////////////////////////////////////////////// @@ -1575,6 +1576,7 @@ static mp_obj_t py_image_crop(uint n_args, const mp_obj_t *args, mp_map_t *kw_ar } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_crop_obj, 1, py_image_crop); +#if defined(IMLIB_ENABLE_IMAGE_IO) static mp_obj_t py_image_save(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { image_t *arg_img = py_image_cobj(args[0]); @@ -1592,6 +1594,7 @@ static mp_obj_t py_image_save(uint n_args, const mp_obj_t *args, mp_map_t *kw_ar return args[0]; } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_save_obj, 2, py_image_save); +#endif //IMLIB_ENABLE_IMAGE_IO static mp_obj_t py_image_flush(mp_obj_t img_obj) { @@ -6363,7 +6366,11 @@ static const mp_rom_map_elem_t locals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR_copy), MP_ROM_PTR(&py_image_copy_obj)}, {MP_ROM_QSTR(MP_QSTR_crop), MP_ROM_PTR(&py_image_crop_obj)}, {MP_ROM_QSTR(MP_QSTR_scale), MP_ROM_PTR(&py_image_crop_obj)}, + #if defined(IMLIB_ENABLE_IMAGE_IO) {MP_ROM_QSTR(MP_QSTR_save), MP_ROM_PTR(&py_image_save_obj)}, + #else + {MP_ROM_QSTR(MP_QSTR_save), MP_ROM_PTR(&py_func_unavailable_obj)}, + #endif {MP_ROM_QSTR(MP_QSTR_flush), MP_ROM_PTR(&py_image_flush_obj)}, /* Drawing Methods */ {MP_ROM_QSTR(MP_QSTR_clear), MP_ROM_PTR(&py_image_clear_obj)}, @@ -6640,6 +6647,7 @@ static const mp_obj_type_t py_image_type = { .locals_dict = (mp_obj_t) &locals_dict }; +#if defined(IMLIB_ENABLE_IMAGE_IO) // ImageWriter Object // typedef struct py_imagewriter_obj { mp_obj_base_t base; @@ -6859,6 +6867,7 @@ mp_obj_t py_image_imagereader(mp_obj_t path) return obj; } STATIC MP_DEFINE_CONST_FUN_OBJ_1(py_image_imagereader_obj, py_image_imagereader); +#endif //IMLIB_ENABLE_IMAGE_IO mp_obj_t py_image_binary_to_grayscale(mp_obj_t arg) { @@ -7128,8 +7137,8 @@ mp_obj_t py_image_load_image(uint n_args, const mp_obj_t *args, mp_map_t *kw_arg bool mode = mp_obj_is_integer(args[0]); const char *path = mode ? NULL : mp_obj_str_get_str(args[0]); - mp_obj_t copy_to_fb_obj = py_helper_keyword_object(n_args, args, mode ? 3 : 1, - kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_copy_to_fb), NULL); + mp_obj_t copy_to_fb_obj = py_helper_keyword_object(n_args, args, + mode ? 3 : 1, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_copy_to_fb), NULL); bool copy_to_fb = false; image_t *arg_other = NULL; @@ -7167,12 +7176,17 @@ mp_obj_t py_image_load_image(uint n_args, const mp_obj_t *args, mp_map_t *kw_arg break; } } else { + #if defined(IMLIB_ENABLE_IMAGE_IO) fb_alloc_mark(); FIL fp; img_read_settings_t rs; imlib_read_geometry(&fp, &image, path, &rs); file_buffer_off(&fp); file_close(&fp); + #else + (void) path; + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Image I/O is not supported")); + #endif //IMLIB_ENABLE_IMAGE_IO } if (copy_to_fb) { @@ -7187,8 +7201,10 @@ mp_obj_t py_image_load_image(uint n_args, const mp_obj_t *args, mp_map_t *kw_arg if (mode) { memset(image.data, 0, image_size(&image)); } else { + #if defined(IMLIB_ENABLE_IMAGE_IO) imlib_load_image(&image, path); fb_alloc_free_till_mark(); + #endif } py_helper_update_framebuffer(&image); @@ -7233,7 +7249,8 @@ mp_obj_t py_image_load_cascade(uint n_args, const mp_obj_t *args, mp_map_t *kw_a } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_load_cascade_obj, 1, py_image_load_cascade); -#ifdef IMLIB_ENABLE_DESCRIPTOR +#if defined(IMLIB_ENABLE_DESCRIPTOR) +#if defined(IMLIB_ENABLE_IMAGE_IO) mp_obj_t py_image_load_descriptor(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { FIL fp; @@ -7363,6 +7380,7 @@ error: return mp_const_true; } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_save_descriptor_obj, 2, py_image_save_descriptor); +#endif //IMLIB_ENABLE_IMAGE_IO static mp_obj_t py_image_match_descriptor(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { @@ -7447,9 +7465,9 @@ static mp_obj_t py_image_match_descriptor(uint n_args, const mp_obj_t *args, mp_ return match_obj; } STATIC MP_DEFINE_CONST_FUN_OBJ_KW(py_image_match_descriptor_obj, 2, py_image_match_descriptor); -#endif // IMLIB_ENABLE_DESCRIPTOR +#endif //IMLIB_ENABLE_DESCRIPTOR -#if defined(IMLIB_ENABLE_FIND_KEYPOINTS) +#if defined(IMLIB_ENABLE_FIND_KEYPOINTS) && defined(IMLIB_ENABLE_IMAGE_IO) int py_image_descriptor_from_roi(image_t *img, const char *path, rectangle_t *roi) { FIL fp; @@ -7471,7 +7489,7 @@ int py_image_descriptor_from_roi(image_t *img, const char *path, rectangle_t *ro } return 0; } -#endif // IMLIB_ENABLE_KEYPOINTS +#endif // IMLIB_ENABLE_KEYPOINTS && IMLIB_ENABLE_IMAGE_IO static const mp_rom_map_elem_t globals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR___name__), MP_OBJ_NEW_QSTR(MP_QSTR_image)}, @@ -7488,23 +7506,23 @@ static const mp_rom_map_elem_t globals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR_CENTER), MP_ROM_INT(IMAGE_HINT_CENTER)}, {MP_ROM_QSTR(MP_QSTR_EXTRACT_RGB_CHANNEL_FIRST), MP_ROM_INT(IMAGE_HINT_EXTRACT_RGB_CHANNEL_FIRST)}, {MP_ROM_QSTR(MP_QSTR_APPLY_COLOR_PALETTE_FIRST), MP_ROM_INT(IMAGE_HINT_APPLY_COLOR_PALETTE_FIRST)}, -#ifdef IMLIB_FIND_TEMPLATE + #ifdef IMLIB_FIND_TEMPLATE {MP_ROM_QSTR(MP_QSTR_SEARCH_EX), MP_ROM_INT(SEARCH_EX)}, {MP_ROM_QSTR(MP_QSTR_SEARCH_DS), MP_ROM_INT(SEARCH_DS)}, -#endif + #endif {MP_ROM_QSTR(MP_QSTR_EDGE_CANNY), MP_ROM_INT(EDGE_CANNY)}, {MP_ROM_QSTR(MP_QSTR_EDGE_SIMPLE), MP_ROM_INT(EDGE_SIMPLE)}, {MP_ROM_QSTR(MP_QSTR_CORNER_FAST), MP_ROM_INT(CORNER_FAST)}, {MP_ROM_QSTR(MP_QSTR_CORNER_AGAST), MP_ROM_INT(CORNER_AGAST)}, -#ifdef IMLIB_ENABLE_APRILTAGS + #ifdef IMLIB_ENABLE_APRILTAGS {MP_ROM_QSTR(MP_QSTR_TAG16H5), MP_ROM_INT(TAG16H5)}, {MP_ROM_QSTR(MP_QSTR_TAG25H7), MP_ROM_INT(TAG25H7)}, {MP_ROM_QSTR(MP_QSTR_TAG25H9), MP_ROM_INT(TAG25H9)}, {MP_ROM_QSTR(MP_QSTR_TAG36H10), MP_ROM_INT(TAG36H10)}, {MP_ROM_QSTR(MP_QSTR_TAG36H11), MP_ROM_INT(TAG36H11)}, {MP_ROM_QSTR(MP_QSTR_ARTOOLKIT), MP_ROM_INT(ARTOOLKIT)}, -#endif -#ifdef IMLIB_ENABLE_BARCODES + #endif + #ifdef IMLIB_ENABLE_BARCODES {MP_ROM_QSTR(MP_QSTR_EAN2), MP_ROM_INT(BARCODE_EAN2)}, {MP_ROM_QSTR(MP_QSTR_EAN5), MP_ROM_INT(BARCODE_EAN5)}, {MP_ROM_QSTR(MP_QSTR_EAN8), MP_ROM_INT(BARCODE_EAN8)}, @@ -7521,9 +7539,14 @@ static const mp_rom_map_elem_t globals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR_PDF417), MP_ROM_INT(BARCODE_PDF417)}, {MP_ROM_QSTR(MP_QSTR_CODE93), MP_ROM_INT(BARCODE_CODE93)}, {MP_ROM_QSTR(MP_QSTR_CODE128), MP_ROM_INT(BARCODE_CODE128)}, -#endif + #endif + #if defined(IMLIB_ENABLE_IMAGE_IO) {MP_ROM_QSTR(MP_QSTR_ImageWriter), MP_ROM_PTR(&py_image_imagewriter_obj)}, {MP_ROM_QSTR(MP_QSTR_ImageReader), MP_ROM_PTR(&py_image_imagereader_obj)}, + #else + {MP_ROM_QSTR(MP_QSTR_ImageWriter), MP_ROM_PTR(&py_func_unavailable_obj)}, + {MP_ROM_QSTR(MP_QSTR_ImageReader), MP_ROM_PTR(&py_func_unavailable_obj)}, + #endif {MP_ROM_QSTR(MP_QSTR_binary_to_grayscale), MP_ROM_PTR(&py_image_binary_to_grayscale_obj)}, {MP_ROM_QSTR(MP_QSTR_binary_to_rgb), MP_ROM_PTR(&py_image_binary_to_rgb_obj)}, {MP_ROM_QSTR(MP_QSTR_binary_to_lab), MP_ROM_PTR(&py_image_binary_to_lab_obj)}, @@ -7546,15 +7569,18 @@ static const mp_rom_map_elem_t globals_dict_table[] = { {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)}, {MP_ROM_QSTR(MP_QSTR_HaarCascade), MP_ROM_PTR(&py_image_load_cascade_obj)}, -#ifdef IMLIB_ENABLE_DESCRIPTOR + #if defined(IMLIB_ENABLE_DESCRIPTOR) && defined(IMLIB_ENABLE_IMAGE_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)}, - {MP_ROM_QSTR(MP_QSTR_match_descriptor), MP_ROM_PTR(&py_image_match_descriptor_obj)} -#else + #else {MP_ROM_QSTR(MP_QSTR_load_descriptor), MP_ROM_PTR(&py_func_unavailable_obj)}, {MP_ROM_QSTR(MP_QSTR_save_descriptor), MP_ROM_PTR(&py_func_unavailable_obj)}, + #endif //IMLIB_ENABLE_DESCRIPTOR && IMLIB_ENABLE_IMAGE_IO + #if defined(IMLIB_ENABLE_DESCRIPTOR) + {MP_ROM_QSTR(MP_QSTR_match_descriptor), MP_ROM_PTR(&py_image_match_descriptor_obj)} + #else {MP_ROM_QSTR(MP_QSTR_match_descriptor), MP_ROM_PTR(&py_func_unavailable_obj)} -#endif + #endif }; STATIC MP_DEFINE_CONST_DICT(globals_dict, globals_dict_table); diff --git a/src/omv/modules/py_mjpeg.c b/src/omv/modules/py_mjpeg.c index b22b20ce3..5d05d9744 100644 --- a/src/omv/modules/py_mjpeg.c +++ b/src/omv/modules/py_mjpeg.c @@ -24,7 +24,9 @@ typedef struct py_mjpeg_obj { int height; uint32_t frames; uint32_t bytes; + #if defined(IMLIB_ENABLE_IMAGE_IO) FIL fp; + #endif } py_mjpeg_obj_t; static mp_obj_t py_mjpeg_open(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) @@ -36,8 +38,12 @@ static mp_obj_t py_mjpeg_open(uint n_args, const mp_obj_t *args, mp_map_t *kw_ar mjpeg->bytes = 0; // private mjpeg->base.type = &py_mjpeg_type; + #if defined(IMLIB_ENABLE_IMAGE_IO) file_write_open(&mjpeg->fp, mp_obj_str_get_str(args[0])); mjpeg_open(&mjpeg->fp, mjpeg->width, mjpeg->height); + #else + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Image I/O is not supported")); + #endif return mjpeg; } @@ -55,12 +61,17 @@ static mp_obj_t py_mjpeg_height(mp_obj_t mjpeg_obj) static mp_obj_t py_mjpeg_size(mp_obj_t mjpeg_obj) { + #if defined(IMLIB_ENABLE_IMAGE_IO) py_mjpeg_obj_t *arg_mjpeg = mjpeg_obj; return mp_obj_new_int(f_size(&arg_mjpeg->fp)); + #else + return mp_obj_new_int(0); + #endif } static mp_obj_t py_mjpeg_add_frame(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { + #if defined(IMLIB_ENABLE_IMAGE_IO) py_mjpeg_obj_t *arg_mjpeg = args[0]; image_t *arg_img = py_image_cobj(args[1]); PY_ASSERT_FALSE_MSG((arg_mjpeg->width != arg_img->w) @@ -70,13 +81,18 @@ static mp_obj_t py_mjpeg_add_frame(uint n_args, const mp_obj_t *args, mp_map_t * int arg_q = py_helper_keyword_int(n_args, args, 2, kw_args, MP_OBJ_NEW_QSTR(MP_QSTR_quality), 50); arg_q = IM_MIN(IM_MAX(arg_q, 1), 100); mjpeg_add_frame(&arg_mjpeg->fp, &arg_mjpeg->frames, &arg_mjpeg->bytes, arg_img, arg_q); + #else + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Image I/O is not supported")); + #endif return mp_const_none; } static mp_obj_t py_mjpeg_close(mp_obj_t mjpeg_obj, mp_obj_t fps_obj) { + #if defined(IMLIB_ENABLE_IMAGE_IO) py_mjpeg_obj_t *arg_mjpeg = mjpeg_obj; mjpeg_close(&arg_mjpeg->fp, &arg_mjpeg->frames, &arg_mjpeg->bytes, mp_obj_get_float(fps_obj)); + #endif return mp_const_none; } diff --git a/src/omv/modules/py_tf.c b/src/omv/modules/py_tf.c index 695c8013b..61c0fcdef 100644 --- a/src/omv/modules/py_tf.c +++ b/src/omv/modules/py_tf.c @@ -140,6 +140,7 @@ STATIC mp_obj_t int_py_tf_load(mp_obj_t path_obj, bool alloc_mode, bool helper_m tf_model->model_data = (unsigned char *) g_person_detect_model_data; tf_model->model_data_len = g_person_detect_model_data_len; } else { + #if defined(IMLIB_ENABLE_IMAGE_IO) FIL fp; file_read_open(&fp, path); tf_model->model_data_len = f_size(&fp); @@ -148,6 +149,9 @@ STATIC mp_obj_t int_py_tf_load(mp_obj_t path_obj, bool alloc_mode, bool helper_m : xalloc(tf_model->model_data_len); read_data(&fp, tf_model->model_data, tf_model->model_data_len); file_close(&fp); + #else + nlr_raise(mp_obj_new_exception_msg(&mp_type_OSError, "Image I/O is not supported")); + #endif } if (!helper_mode) { diff --git a/src/omv/ports/stm32/main.c b/src/omv/ports/stm32/main.c index 7a81289b0..8a0a9e885 100644 --- a/src/omv/ports/stm32/main.c +++ b/src/omv/ports/stm32/main.c @@ -500,7 +500,9 @@ soft_reset: uart_init0(); sensor_init0(); fb_alloc_init0(); + #ifdef IMLIB_ENABLE_IMAGE_IO file_buffer_init0(); + #endif py_lcd_init0(); py_fir_init0(); py_tv_init0(); diff --git a/src/omv/ports/stm32/usbdbg.c b/src/omv/ports/stm32/usbdbg.c index 56f9a47e4..201760fcf 100644 --- a/src/omv/ports/stm32/usbdbg.c +++ b/src/omv/ports/stm32/usbdbg.c @@ -210,6 +210,7 @@ void usbdbg_data_out(void *buffer, int length) break; case USBDBG_TEMPLATE_SAVE: { + #if defined(IMLIB_ENABLE_IMAGE_IO) image_t image; framebuffer_initialize_image(&image); @@ -221,13 +222,16 @@ void usbdbg_data_out(void *buffer, int length) char *path = (char*)buffer+sizeof(rectangle_t); imlib_save_image(&image, path, roi, 50); + // raise a flash IRQ to flush image //NVIC->STIR = FLASH_IRQn; + #endif //IMLIB_ENABLE_IMAGE_IO break; } case USBDBG_DESCRIPTOR_SAVE: { - #ifdef IMLIB_ENABLE_KEYPOINTS + #if defined(IMLIB_ENABLE_IMAGE_IO)\ + && defined(IMLIB_ENABLE_KEYPOINTS) image_t image; framebuffer_initialize_image(&image); @@ -239,7 +243,7 @@ void usbdbg_data_out(void *buffer, int length) char *path = (char*)buffer+sizeof(rectangle_t); py_image_descriptor_from_roi(&image, path, roi); - #endif + #endif //IMLIB_ENABLE_IMAGE_IO && IMLIB_ENABLE_KEYPOINTS break; }