@@ -426,48 +426,57 @@ mp_obj_t cv2_imgproc_connectedComponents(size_t n_args, const mp_obj_t *pos_args
426
426
return mp_obj_new_tuple (2 , result);
427
427
}
428
428
429
- // mp_obj_t cv2_imgproc_connectedComponentsWithStats(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
430
- // // Define the arguments
431
- // enum { ARG_image, ARG_labels, ARG_stats, ARG_centroids, ARG_connectivity, ARG_ltype };
432
- // static const mp_arg_t allowed_args[] = {
433
- // { MP_QSTR_image, MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
434
- // { MP_QSTR_labels, MP_ARG_OBJ, { .u_obj = mp_const_none } },
435
- // { MP_QSTR_stats, MP_ARG_OBJ, { .u_obj = mp_const_none } },
436
- // { MP_QSTR_centroids, MP_ARG_OBJ, { .u_obj = mp_const_none } },
437
- // { MP_QSTR_connectivity, MP_ARG_INT, { .u_int = 8 } },
438
- // { MP_QSTR_ltype, MP_ARG_INT, { .u_int = CV_16U } }, // Normally CV_32S, but ulab doesn't support 32-bit integers
439
- // };
440
-
441
- // // Parse the arguments
442
- // mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
443
- // mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
444
-
445
- // // Convert arguments to required types
446
- // Mat image = mp_obj_to_mat(args[ARG_image].u_obj);
447
- // Mat labels = mp_obj_to_mat(args[ARG_labels].u_obj);
448
- // Mat stats = mp_obj_to_mat(args[ARG_stats].u_obj);
449
- // Mat centroids = mp_obj_to_mat(args[ARG_centroids].u_obj);
450
- // int connectivity = args[ARG_connectivity].u_int;
451
- // int ltype = args[ARG_ltype].u_int;
452
-
453
- // // Return value
454
- // int retval = 0;
455
-
456
- // // Call the corresponding OpenCV function
457
- // try {
458
- // retval = connectedComponentsWithStats(image, labels, stats, centroids, connectivity, ltype);
459
- // } catch(Exception& e) {
460
- // mp_raise_msg(&mp_type_Exception, MP_ERROR_TEXT(e.what()));
461
- // }
462
-
463
- // // Return the result
464
- // mp_obj_t result[4];
465
- // result[0] = mp_obj_new_int(retval);
466
- // result[1] = mat_to_mp_obj(labels);
467
- // result[2] = mat_to_mp_obj(stats);
468
- // result[3] = mat_to_mp_obj(centroids);
469
- // return mp_obj_new_tuple(4, result);
470
- // }
429
+ mp_obj_t cv2_imgproc_connectedComponentsWithStats (size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
430
+ // Define the arguments
431
+ enum { ARG_image, ARG_labels, ARG_stats, ARG_centroids, ARG_connectivity, ARG_ltype };
432
+ static const mp_arg_t allowed_args[] = {
433
+ { MP_QSTR_image, MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
434
+ { MP_QSTR_labels, MP_ARG_OBJ, { .u_obj = mp_const_none } },
435
+ { MP_QSTR_stats, MP_ARG_OBJ, { .u_obj = mp_const_none } },
436
+ { MP_QSTR_centroids, MP_ARG_OBJ, { .u_obj = mp_const_none } },
437
+ { MP_QSTR_connectivity, MP_ARG_INT, { .u_int = 8 } },
438
+ { MP_QSTR_ltype, MP_ARG_INT, { .u_int = CV_16U } }, // Normally CV_32S, but ulab doesn't support 32-bit integers
439
+ };
440
+
441
+ // Parse the arguments
442
+ mp_arg_val_t args[MP_ARRAY_SIZE (allowed_args)];
443
+ mp_arg_parse_all (n_args, pos_args, kw_args, MP_ARRAY_SIZE (allowed_args), allowed_args, args);
444
+
445
+ // Convert arguments to required types
446
+ Mat image = mp_obj_to_mat (args[ARG_image].u_obj );
447
+ Mat labels32S; // TODO: Allow user input
448
+ Mat stats32S; // TODO: Allow user input
449
+ Mat centroids64F; // TODO: Allow user input
450
+ int connectivity = args[ARG_connectivity].u_int ;
451
+ int ltype = args[ARG_ltype].u_int ;
452
+
453
+ // Return value
454
+ int retval = 0 ;
455
+
456
+ // Call the corresponding OpenCV function
457
+ try {
458
+ retval = connectedComponentsWithStats (image, labels32S, stats32S, centroids64F, connectivity, ltype);
459
+ } catch (Exception& e) {
460
+ mp_raise_msg (&mp_type_Exception, MP_ERROR_TEXT (e.what ()));
461
+ }
462
+
463
+ // Convert output matrices to float
464
+ Mat labels, stats, centroids;
465
+ labels.allocator = &GetNumpyAllocator ();
466
+ stats.allocator = &GetNumpyAllocator ();
467
+ centroids.allocator = &GetNumpyAllocator ();
468
+ labels32S.convertTo (labels, CV_32F);
469
+ stats32S.convertTo (stats, CV_32F);
470
+ centroids64F.convertTo (centroids, CV_32F);
471
+
472
+ // Return the result
473
+ mp_obj_t result[4 ];
474
+ result[0 ] = mp_obj_new_int (retval);
475
+ result[1 ] = mat_to_mp_obj (labels);
476
+ result[2 ] = mat_to_mp_obj (stats);
477
+ result[3 ] = mat_to_mp_obj (centroids);
478
+ return mp_obj_new_tuple (4 , result);
479
+ }
471
480
472
481
mp_obj_t cv2_imgproc_contourArea (size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
473
482
// Define the arguments
0 commit comments