From 3e99ef0cebc1f8dd5ea01f39e9e6bc2c9d9437be Mon Sep 17 00:00:00 2001 From: "Kwabena W. Agyeman" Date: Mon, 21 Oct 2024 13:01:35 -0700 Subject: [PATCH] py_image: Add new depth palette. --- .../01-Camera/06-Time-of-Flight/tof_camera.py | 2 +- .../06-Time-of-Flight/tof_overlay.py | 2 +- src/omv/imlib/imlib.h | 2 ++ src/omv/imlib/rainbow_tab.c | 34 +++++++++++++++++++ src/omv/modules/py_csi.c | 9 +++++ src/omv/modules/py_helper.c | 8 +++++ src/omv/modules/py_image.c | 13 +++++++ src/omv/modules/py_tof.c | 8 ++--- tools/gen_rainbow.py | 12 +++++++ 9 files changed, 82 insertions(+), 8 deletions(-) diff --git a/scripts/examples/01-Camera/06-Time-of-Flight/tof_camera.py b/scripts/examples/01-Camera/06-Time-of-Flight/tof_camera.py index f51091916..3ebfc5939 100644 --- a/scripts/examples/01-Camera/06-Time-of-Flight/tof_camera.py +++ b/scripts/examples/01-Camera/06-Time-of-Flight/tof_camera.py @@ -28,7 +28,7 @@ while True: hint=image.BILINEAR, scale=(0, 4000), copy_to_fb=True, - color_palette=tof.PALETTE_IRONBOW, + color_palette=image.PALETTE_DEPTH, ) img.flush() except RuntimeError as e: diff --git a/scripts/examples/01-Camera/06-Time-of-Flight/tof_overlay.py b/scripts/examples/01-Camera/06-Time-of-Flight/tof_overlay.py index dd641a23c..78061f8c7 100644 --- a/scripts/examples/01-Camera/06-Time-of-Flight/tof_overlay.py +++ b/scripts/examples/01-Camera/06-Time-of-Flight/tof_overlay.py @@ -41,7 +41,7 @@ while True: hint=image.BILINEAR, alpha=100, scale=(0, 4000), - color_palette=tof.PALETTE_RAINBOW, + color_palette=image.PALETTE_DEPTH, ) # Draw min and max distance. diff --git a/src/omv/imlib/imlib.h b/src/omv/imlib/imlib.h index 570a0852d..61c56dba7 100644 --- a/src/omv/imlib/imlib.h +++ b/src/omv/imlib/imlib.h @@ -375,6 +375,7 @@ extern const int8_t lab_table[196608 / 2]; typedef enum { COLOR_PALETTE_RAINBOW, COLOR_PALETTE_IRONBOW, + COLOR_PALETTE_DEPTH, COLOR_PALETTE_EVT_DARK, COLOR_PALETTE_EVT_LIGHT } color_palette_t; @@ -382,6 +383,7 @@ typedef enum { // Color palette LUTs extern const uint16_t rainbow_table[256]; extern const uint16_t ironbow_table[256]; +extern const uint16_t depth_table[256]; extern const uint16_t evt_dark_table[256]; extern const uint16_t evt_light_table[256]; diff --git a/src/omv/imlib/rainbow_tab.c b/src/omv/imlib/rainbow_tab.c index 922edfbb0..ea428e126 100644 --- a/src/omv/imlib/rainbow_tab.c +++ b/src/omv/imlib/rainbow_tab.c @@ -1,4 +1,38 @@ #include +const uint16_t depth_table[256] = { + 0xF820, 0xF840, 0xF840, 0xF860, 0xF880, 0xF8A0, 0xF8C0, 0xF8C0, + 0xF8E0, 0xF900, 0xF920, 0xF940, 0xF940, 0xF960, 0xF980, 0xF9A0, + 0xF9A0, 0xF9C0, 0xF9E0, 0xFA00, 0xFA20, 0xFA20, 0xFA40, 0xFA60, + 0xFA80, 0xFAA0, 0xFAA0, 0xFAC0, 0xFAE0, 0xFB00, 0xFB20, 0xFB20, + 0xFB40, 0xFB60, 0xFB80, 0xFBA0, 0xFBA0, 0xFBC0, 0xFBE0, 0xFC00, + 0xFC20, 0xFC20, 0xFC40, 0xFC60, 0xFC80, 0xFCA0, 0xFCA0, 0xFCC0, + 0xFCE0, 0xFD00, 0xFD00, 0xFD20, 0xFD40, 0xFD60, 0xFD80, 0xFD80, + 0xFDA0, 0xFDC0, 0xFDE0, 0xFE00, 0xFE00, 0xFE20, 0xFE40, 0xFE60, + 0xFE80, 0xFE80, 0xFEA0, 0xFEC0, 0xFEE0, 0xFF00, 0xFF00, 0xFF20, + 0xFF40, 0xFF60, 0xFF80, 0xFF80, 0xFFA0, 0xFFC0, 0xFFE0, 0xFFE0, + 0xF7E0, 0xF7E0, 0xF7E0, 0xEFE0, 0xEFE0, 0xE7E0, 0xE7E0, 0xE7E0, + 0xDFE0, 0xDFE0, 0xD7E0, 0xD7E0, 0xD7E0, 0xCFE0, 0xCFE0, 0xC7E0, + 0xC7E0, 0xC7E0, 0xBFE0, 0xBFE0, 0xBFE0, 0xB7E0, 0xB7E0, 0xAFE0, + 0xAFE0, 0xAFE0, 0xA7E0, 0xA7E0, 0x9FE0, 0x9FE0, 0x9FE0, 0x97E0, + 0x97E0, 0x8FE0, 0x8FE0, 0x8FE0, 0x87E0, 0x87E0, 0x87E0, 0x7FE0, + 0x7FE0, 0x77E0, 0x77E0, 0x77E0, 0x6FE0, 0x6FE0, 0x67E0, 0x67E0, + 0x67E0, 0x5FE0, 0x5FE0, 0x57E0, 0x57E0, 0x57E0, 0x4FE0, 0x4FE0, + 0x47E0, 0x47E0, 0x47E0, 0x3FE0, 0x3FE0, 0x3FE0, 0x37E0, 0x37E0, + 0x2FE0, 0x2FE0, 0x2FE0, 0x27E0, 0x27E0, 0x1FE0, 0x1FE0, 0x1FE0, + 0x17E0, 0x17E0, 0x0FE0, 0x0FE0, 0x0FE0, 0x07E0, 0x07E0, 0x07E1, + 0x07E1, 0x07E1, 0x07E2, 0x07E2, 0x07E2, 0x07E3, 0x07E3, 0x07E4, + 0x07E4, 0x07E4, 0x07E5, 0x07E5, 0x07E6, 0x07E6, 0x07E6, 0x07E7, + 0x07E7, 0x07E8, 0x07E8, 0x07E8, 0x07E9, 0x07E9, 0x07EA, 0x07EA, + 0x07EA, 0x07EB, 0x07EB, 0x07EB, 0x07EC, 0x07EC, 0x07ED, 0x07ED, + 0x07ED, 0x07EE, 0x07EE, 0x07EF, 0x07EF, 0x07EF, 0x07F0, 0x07F0, + 0x07F1, 0x07F1, 0x07F1, 0x07F2, 0x07F2, 0x07F2, 0x07F3, 0x07F3, + 0x07F4, 0x07F4, 0x07F4, 0x07F5, 0x07F5, 0x07F6, 0x07F6, 0x07F6, + 0x07F7, 0x07F7, 0x07F8, 0x07F8, 0x07F8, 0x07F9, 0x07F9, 0x07FA, + 0x07FA, 0x07FA, 0x07FB, 0x07FB, 0x07FB, 0x07FC, 0x07FC, 0x07FD, + 0x07FD, 0x07FD, 0x07FE, 0x07FE, 0x07FF, 0x07FF, 0x07DF, 0x07BF, + 0x07BF, 0x079F, 0x077F, 0x075F, 0x073F, 0x073F, 0x071F, 0x06FF, + 0x06DF, 0x06BF, 0x06BF, 0x069F, 0x067F, 0x065F, 0x063F, 0x063F +}; const uint16_t rainbow_table[256] = { 0x063F, 0x063F, 0x065F, 0x067F, 0x069F, 0x06BF, 0x06BF, 0x06DF, 0x06FF, 0x071F, 0x073F, 0x073F, 0x075F, 0x077F, 0x079F, 0x07BF, diff --git a/src/omv/modules/py_csi.c b/src/omv/modules/py_csi.c index 0e16744d2..8139bbc18 100644 --- a/src/omv/modules/py_csi.c +++ b/src/omv/modules/py_csi.c @@ -1038,6 +1038,11 @@ static mp_obj_t py_omv_csi_set_color_palette(mp_obj_t palette_obj) { case COLOR_PALETTE_IRONBOW: omv_csi_set_color_palette(ironbow_table); break; + #if (MICROPY_PY_TOF == 1) + case COLOR_PALETTE_DEPTH: + omv_csi_set_color_palette(depth_table); + break; + #endif // MICROPY_PY_TOF == 1 #if (OMV_GENX320_ENABLE == 1) case COLOR_PALETTE_EVT_DARK: omv_csi_set_color_palette(evt_dark_table); @@ -1060,6 +1065,10 @@ static mp_obj_t py_omv_csi_get_color_palette() { return mp_obj_new_int(COLOR_PALETTE_RAINBOW); } else if (palette == ironbow_table) { return mp_obj_new_int(COLOR_PALETTE_IRONBOW); + #if (MICROPY_PY_TOF == 1) + } else if (palette == depth_table) { + return mp_obj_new_int(COLOR_PALETTE_DEPTH); + #endif // MICROPY_PY_TOF == 1 #if (OMV_GENX320_ENABLE == 1) } else if (palette == evt_dark_table) { return mp_obj_new_int(COLOR_PALETTE_EVT_DARK); diff --git a/src/omv/modules/py_helper.c b/src/omv/modules/py_helper.c index 291be1dc3..eae5d5cbf 100644 --- a/src/omv/modules/py_helper.c +++ b/src/omv/modules/py_helper.c @@ -78,6 +78,10 @@ const void *py_helper_arg_to_palette(const mp_obj_t arg, uint32_t pixfmt) { palette = rainbow_table; } else if (type == COLOR_PALETTE_IRONBOW) { palette = ironbow_table; + #if (MICROPY_PY_TOF == 1) + } else if (type == COLOR_PALETTE_DEPTH) { + palette = depth_table; + #endif // MICROPY_PY_TOF == 1 #if (OMV_GENX320_ENABLE == 1) } else if (type == COLOR_PALETTE_EVT_DARK) { palette = evt_dark_table; @@ -484,6 +488,10 @@ const uint16_t *py_helper_keyword_color_palette(uint n_args, const mp_obj_t *arg default_color_palette = rainbow_table; } else if (palette == COLOR_PALETTE_IRONBOW) { default_color_palette = ironbow_table; + #if (MICROPY_PY_TOF == 1) + } else if (palette == COLOR_PALETTE_DEPTH) { + default_color_palette = depth_table; + #endif // MICROPY_PY_TOF == 1 #if (OMV_GENX320_ENABLE == 1) } else if (palette == COLOR_PALETTE_EVT_DARK) { default_color_palette = evt_dark_table; diff --git a/src/omv/modules/py_image.c b/src/omv/modules/py_image.c index 5af728213..154169b2b 100644 --- a/src/omv/modules/py_image.c +++ b/src/omv/modules/py_image.c @@ -1210,6 +1210,13 @@ static mp_obj_t py_image_to_ironbow(uint n_args, const mp_obj_t *args, mp_map_t } static MP_DEFINE_CONST_FUN_OBJ_KW(py_image_to_ironbow_obj, 1, py_image_to_ironbow); +#if (MICROPY_PY_TOF == 1) +static mp_obj_t py_image_to_depth(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { + return py_image_to(PIXFORMAT_RGB565, MP_ROM_INT(COLOR_PALETTE_DEPTH), false, n_args, args, kw_args); +} +static MP_DEFINE_CONST_FUN_OBJ_KW(py_image_to_depth_obj, 1, py_image_to_depth); +#endif // MICROPY_PY_TOF == 1 + #if (OMV_GENX320_ENABLE == 1) static mp_obj_t py_image_to_evt_dark(uint n_args, const mp_obj_t *args, mp_map_t *kw_args) { return py_image_to(PIXFORMAT_RGB565, MP_ROM_INT(COLOR_PALETTE_EVT_DARK), false, n_args, args, kw_args); @@ -6245,6 +6252,9 @@ static const mp_rom_map_elem_t locals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR_to_rgb565), MP_ROM_PTR(&py_image_to_rgb565_obj)}, {MP_ROM_QSTR(MP_QSTR_to_rainbow), MP_ROM_PTR(&py_image_to_rainbow_obj)}, {MP_ROM_QSTR(MP_QSTR_to_ironbow), MP_ROM_PTR(&py_image_to_ironbow_obj)}, + #if (MICROPY_PY_TOF == 1) + {MP_ROM_QSTR(MP_QSTR_to_depth), MP_ROM_PTR(&py_image_to_depth_obj)}, + #endif // MICROPY_PY_TOF == 1 #if (OMV_GENX320_ENABLE == 1) {MP_ROM_QSTR(MP_QSTR_to_evt_dark), MP_ROM_PTR(&py_image_to_evt_dark_obj)}, {MP_ROM_QSTR(MP_QSTR_to_evt_light), MP_ROM_PTR(&py_image_to_evt_light_obj)}, @@ -7058,6 +7068,9 @@ static const mp_rom_map_elem_t globals_dict_table[] = { {MP_ROM_QSTR(MP_QSTR_PNG), MP_ROM_INT(PIXFORMAT_PNG)}, /* PNG/COMPRESSED*/ {MP_ROM_QSTR(MP_QSTR_PALETTE_RAINBOW), MP_ROM_INT(COLOR_PALETTE_RAINBOW)}, {MP_ROM_QSTR(MP_QSTR_PALETTE_IRONBOW), MP_ROM_INT(COLOR_PALETTE_IRONBOW)}, + #if (MICROPY_PY_TOF == 1) + {MP_ROM_QSTR(MP_QSTR_PALETTE_DEPTH), MP_ROM_INT(COLOR_PALETTE_DEPTH)}, + #endif // MICROPY_PY_TOF == 1 #if (OMV_GENX320_ENABLE == 1) {MP_ROM_QSTR(MP_QSTR_PALETTE_EVT_DARK), MP_ROM_INT(COLOR_PALETTE_EVT_DARK)}, {MP_ROM_QSTR(MP_QSTR_PALETTE_EVT_LIGHT), MP_ROM_INT(COLOR_PALETTE_EVT_LIGHT)}, diff --git a/src/omv/modules/py_tof.c b/src/omv/modules/py_tof.c index 8e9098e26..a77c2c57e 100644 --- a/src/omv/modules/py_tof.c +++ b/src/omv/modules/py_tof.c @@ -404,7 +404,7 @@ mp_obj_t py_tof_draw_depth(uint n_args, const mp_obj_t *pos_args, mp_map_t *kw_a { MP_QSTR_roi, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} }, { MP_QSTR_rgb_channel, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = -1 } }, { MP_QSTR_alpha, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 256 } }, - { MP_QSTR_color_palette, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_INT(COLOR_PALETTE_RAINBOW)} }, + { MP_QSTR_color_palette, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_INT(COLOR_PALETTE_DEPTH)} }, { MP_QSTR_alpha_palette, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} }, { MP_QSTR_hint, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0 } }, { MP_QSTR_scale, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} }, @@ -480,7 +480,7 @@ mp_obj_t py_tof_snapshot(uint n_args, const mp_obj_t *pos_args, mp_map_t *kw_arg { MP_QSTR_roi, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} }, { MP_QSTR_rgb_channel, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = -1 } }, { MP_QSTR_alpha, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 256 } }, - { MP_QSTR_color_palette, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_INT(COLOR_PALETTE_RAINBOW)} }, + { MP_QSTR_color_palette, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_INT(COLOR_PALETTE_DEPTH)} }, { MP_QSTR_alpha_palette, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} }, { MP_QSTR_hint, MP_ARG_INT | MP_ARG_KW_ONLY, {.u_int = 0 } }, { MP_QSTR_scale, MP_ARG_OBJ | MP_ARG_KW_ONLY, {.u_rom_obj = MP_ROM_NONE} }, @@ -578,10 +578,6 @@ static const mp_rom_map_elem_t globals_dict_table[] = { #if (OMV_TOF_VL53L5CX_ENABLE == 1) { MP_ROM_QSTR(MP_QSTR_TOF_VL53L5CX), MP_ROM_INT(TOF_VL53L5CX) }, #endif - { MP_ROM_QSTR(MP_QSTR_PALETTE_RAINBOW), MP_ROM_INT(COLOR_PALETTE_RAINBOW) }, - { MP_ROM_QSTR(MP_QSTR_PALETTE_IRONBOW), MP_ROM_INT(COLOR_PALETTE_IRONBOW) }, - { MP_ROM_QSTR(MP_QSTR_GRAYSCALE), MP_ROM_INT(PIXFORMAT_GRAYSCALE) }, - { MP_ROM_QSTR(MP_QSTR_RGB565), MP_ROM_INT(PIXFORMAT_RGB565) }, { MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&py_tof_init_obj) }, { MP_ROM_QSTR(MP_QSTR_reset), MP_ROM_PTR(&py_tof_init_obj) }, { MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&py_tof_deinit_obj) }, diff --git a/tools/gen_rainbow.py b/tools/gen_rainbow.py index d25d9e11f..c716051fb 100644 --- a/tools/gen_rainbow.py +++ b/tools/gen_rainbow.py @@ -48,6 +48,18 @@ col = [(int((((r*255)*31)+127.5)/255)&0x1F)<<11 | (int((((g*255)*63)+127.5)/255)&0x3F)<<5 | (int((((b*255)*31)+127.5)/255)&0x1F) for r,g,b in tup] +sys.stdout.write("const uint16_t depth_table[%d] = {\n" % NUM_COL) +for i in range(NUM_COL): + if not (i % 8): + sys.stdout.write(" ") + sys.stdout.write("0x%04X" % col[255-i]) + if (i + 1) % 8: + sys.stdout.write(", ") + elif i != (NUM_COL-1): + sys.stdout.write(",\n") + else: + sys.stdout.write("\n};\n") + sys.stdout.write("const uint16_t rainbow_table[%d] = {\n" % NUM_COL) for i in range(NUM_COL): if not (i % 8):