Allow building the image library and modules without a filesystem.

* Images, models and descriptors I/O can be disabled with imlib flag.
* Image creation in memory still works if image I/O is disabled.
* TF and Haar can still load built-in models/cascades if image I/O is disabled.
This commit is contained in:
iabdalkader 2020-12-26 21:05:34 +02:00
parent 7ea7bc01f7
commit a0d7cf13ad
23 changed files with 188 additions and 54 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -6,10 +6,14 @@
* File System Helper Functions
*
*/
#include "imlib_config.h"
#if defined(IMLIB_ENABLE_IMAGE_IO)
#include <string.h>
#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

View File

@ -8,12 +8,15 @@
*
* BMP reader/writer.
*/
#include <arm_math.h>
#include <stdlib.h>
#include <ff.h>
#include "ff_wrapper.h"
#include "xalloc.h"
#include "imlib.h"
#if defined(IMLIB_ENABLE_IMAGE_IO)
#include <stdlib.h>
#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

View File

@ -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 <arm_math.h>
#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);

View File

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

View File

@ -10,7 +10,9 @@
* Based on the work of Francesco Comaschi (f.comaschi@tue.nl)
*/
#include <stdio.h>
#include <arm_math.h>
#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;

View File

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

View File

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

View File

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

View File

@ -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)
{

View File

@ -8,11 +8,17 @@
*
* PPM/PGM reader/writer.
*/
#include "imlib.h"
#if defined(IMLIB_ENABLE_IMAGE_IO)
#include <stdio.h>
#include <ff.h>
#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

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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) {

View File

@ -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();

View File

@ -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;
}