@@ -232,6 +232,86 @@ mp_obj_t cv2_imgproc_Canny(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw
232
232
return mat_to_mp_obj (edges);
233
233
}
234
234
235
+ mp_obj_t cv2_imgproc_connectedComponents (size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
236
+ // Define the arguments
237
+ enum { ARG_image, ARG_labels, ARG_connectivity, ARG_ltype };
238
+ static const mp_arg_t allowed_args[] = {
239
+ { MP_QSTR_image, MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
240
+ { MP_QSTR_labels, MP_ARG_OBJ, { .u_obj = mp_const_none } },
241
+ { MP_QSTR_connectivity, MP_ARG_INT, { .u_int = 8 } },
242
+ { MP_QSTR_ltype, MP_ARG_INT, { .u_int = CV_16U } }, // Normally CV_32S, but ulab doesn't support 32-bit integers
243
+ };
244
+
245
+ // Parse the arguments
246
+ mp_arg_val_t args[MP_ARRAY_SIZE (allowed_args)];
247
+ mp_arg_parse_all (n_args, pos_args, kw_args, MP_ARRAY_SIZE (allowed_args), allowed_args, args);
248
+
249
+ // Convert arguments to required types
250
+ Mat image = mp_obj_to_mat (args[ARG_image].u_obj );
251
+ Mat labels = mp_obj_to_mat (args[ARG_labels].u_obj );
252
+ int connectivity = args[ARG_connectivity].u_int ;
253
+ int ltype = args[ARG_ltype].u_int ;
254
+
255
+ // Return value
256
+ int retval = 0 ;
257
+
258
+ // Call the corresponding OpenCV function
259
+ try {
260
+ retval = connectedComponents (image, labels, connectivity, ltype);
261
+ } catch (Exception& e) {
262
+ mp_raise_msg (&mp_type_Exception, MP_ERROR_TEXT (e.what ()));
263
+ }
264
+
265
+ // Return the result
266
+ mp_obj_t result[2 ];
267
+ result[0 ] = mp_obj_new_int (retval);
268
+ result[1 ] = mat_to_mp_obj (labels);
269
+ return mp_obj_new_tuple (2 , result);
270
+ }
271
+
272
+ // mp_obj_t cv2_imgproc_connectedComponentsWithStats(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
273
+ // // Define the arguments
274
+ // enum { ARG_image, ARG_labels, ARG_stats, ARG_centroids, ARG_connectivity, ARG_ltype };
275
+ // static const mp_arg_t allowed_args[] = {
276
+ // { MP_QSTR_image, MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
277
+ // { MP_QSTR_labels, MP_ARG_OBJ, { .u_obj = mp_const_none } },
278
+ // { MP_QSTR_stats, MP_ARG_OBJ, { .u_obj = mp_const_none } },
279
+ // { MP_QSTR_centroids, MP_ARG_OBJ, { .u_obj = mp_const_none } },
280
+ // { MP_QSTR_connectivity, MP_ARG_INT, { .u_int = 8 } },
281
+ // { MP_QSTR_ltype, MP_ARG_INT, { .u_int = CV_16U } }, // Normally CV_32S, but ulab doesn't support 32-bit integers
282
+ // };
283
+
284
+ // // Parse the arguments
285
+ // mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
286
+ // mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
287
+
288
+ // // Convert arguments to required types
289
+ // Mat image = mp_obj_to_mat(args[ARG_image].u_obj);
290
+ // Mat labels = mp_obj_to_mat(args[ARG_labels].u_obj);
291
+ // Mat stats = mp_obj_to_mat(args[ARG_stats].u_obj);
292
+ // Mat centroids = mp_obj_to_mat(args[ARG_centroids].u_obj);
293
+ // int connectivity = args[ARG_connectivity].u_int;
294
+ // int ltype = args[ARG_ltype].u_int;
295
+
296
+ // // Return value
297
+ // int retval = 0;
298
+
299
+ // // Call the corresponding OpenCV function
300
+ // try {
301
+ // retval = connectedComponentsWithStats(image, labels, stats, centroids, connectivity, ltype);
302
+ // } catch(Exception& e) {
303
+ // mp_raise_msg(&mp_type_Exception, MP_ERROR_TEXT(e.what()));
304
+ // }
305
+
306
+ // // Return the result
307
+ // mp_obj_t result[4];
308
+ // result[0] = mp_obj_new_int(retval);
309
+ // result[1] = mat_to_mp_obj(labels);
310
+ // result[2] = mat_to_mp_obj(stats);
311
+ // result[3] = mat_to_mp_obj(centroids);
312
+ // return mp_obj_new_tuple(4, result);
313
+ // }
314
+
235
315
mp_obj_t cv2_imgproc_circle (size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
236
316
// Define the arguments
237
317
enum { ARG_img, ARG_center, ARG_radius, ARG_color, ARG_thickness, ARG_lineType, ARG_shift };
0 commit comments