From 1c962cb7a6e6c930e7bf59c1b234889f0f54885e Mon Sep 17 00:00:00 2001 From: "Kwabena W. Agyeman" Date: Sun, 27 Jul 2025 14:36:35 -0700 Subject: [PATCH] modules/py_helper: Add transform argument helper. --- modules/py_helper.c | 37 +++++++++++++++++++++++++++++++++++++ modules/py_helper.h | 1 + 2 files changed, 38 insertions(+) diff --git a/modules/py_helper.c b/modules/py_helper.c index 7ecede2bf..f165f3dd3 100644 --- a/modules/py_helper.c +++ b/modules/py_helper.c @@ -28,6 +28,9 @@ #include "framebuffer.h" #include "py_helper.h" #include "py_assert.h" +#if defined(MODULE_ULAB_ENABLED) +#include "ndarray.h" +#endif // MODULE_ULAB_ENABLED #if MICROPY_PY_CSI #include "omv_csi.h" #endif @@ -104,6 +107,40 @@ const void *py_helper_arg_to_palette(const mp_obj_t arg, uint32_t pixfmt) { return palette; } +void *py_helper_arg_to_transform(const mp_obj_t arg) { + if (arg == mp_const_none) { + return NULL; + } + + #if defined(MODULE_ULAB_ENABLED) && defined(OPENMV_N6) + if (!MP_OBJ_IS_TYPE(arg, &ulab_ndarray_type)) { + mp_raise_msg(&mp_type_TypeError, MP_ERROR_TEXT("Expected a ndarray")); + } + + ndarray_obj_t *ndarray = MP_OBJ_TO_PTR(arg); + + if (ndarray->dtype != NDARRAY_FLOAT) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Expected a ndarray with dtype float")); + } + + if (!ndarray_is_dense(ndarray)) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Expected a dense ndarray")); + } + + if (ndarray->ndim != 2) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Expected a 2D ndarray")); + } + + if ((ndarray->shape[ULAB_MAX_DIMS-2] != 3) || (ndarray->shape[ULAB_MAX_DIMS-1] != 3)) { + mp_raise_msg(&mp_type_ValueError, MP_ERROR_TEXT("Invalid matrix shape!")); + } + + return ndarray->array; + #else + mp_raise_msg(&mp_type_TypeError, MP_ERROR_TEXT("Transform operations are not supported!")); + #endif // MODULE_ULAB_ENABLED +} + rectangle_t py_helper_arg_to_roi(const mp_obj_t arg, const image_t *img) { rectangle_t roi = {0, 0, img->w, img->h}; if (arg != mp_const_none) { diff --git a/modules/py_helper.h b/modules/py_helper.h index be651550e..eac35b1f0 100644 --- a/modules/py_helper.h +++ b/modules/py_helper.h @@ -38,6 +38,7 @@ typedef enum py_helper_arg_image_flags { extern const mp_obj_fun_builtin_var_t py_func_unavailable_obj; image_t *py_helper_arg_to_image(const mp_obj_t arg, uint32_t flags); const void *py_helper_arg_to_palette(const mp_obj_t arg, uint32_t pixfmt); +void *py_helper_arg_to_transform(const mp_obj_t arg); rectangle_t py_helper_arg_to_roi(const mp_obj_t arg, const image_t *img); void py_helper_arg_to_scale(const mp_obj_t arg_x_scale, const mp_obj_t arg_y_scale, float *x_scale, float *y_scale);