Skip to content

Commit ec05574

Browse files
committed
Add connectedComponents
1 parent 60cd368 commit ec05574

File tree

3 files changed

+94
-0
lines changed

3 files changed

+94
-0
lines changed

src/imgproc.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,86 @@ mp_obj_t cv2_imgproc_Canny(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw
232232
return mat_to_mp_obj(edges);
233233
}
234234

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+
235315
mp_obj_t cv2_imgproc_circle(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
236316
// Define the arguments
237317
enum { ARG_img, ARG_center, ARG_radius, ARG_color, ARG_thickness, ARG_lineType, ARG_shift };

src/imgproc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ extern mp_obj_t cv2_imgproc_bilateralFilter(size_t n_args, const mp_obj_t *pos_a
77
extern mp_obj_t cv2_imgproc_blur(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
88
extern mp_obj_t cv2_imgproc_boxFilter(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
99
extern mp_obj_t cv2_imgproc_Canny(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
10+
extern mp_obj_t cv2_imgproc_connectedComponents(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
11+
// extern mp_obj_t cv2_imgproc_connectedComponentsWithStats(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
1012
extern mp_obj_t cv2_imgproc_circle(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
1113
extern mp_obj_t cv2_imgproc_cvtColor(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
1214
extern mp_obj_t cv2_imgproc_dilate(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);

src/opencv_upy.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_bilateralFilter_obj, 4, cv2_imgpro
1515
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_blur_obj, 2, cv2_imgproc_blur);
1616
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_boxFilter_obj, 3, cv2_imgproc_boxFilter);
1717
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_Canny_obj, 3, cv2_imgproc_Canny);
18+
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_connectedComponents_obj, 1, cv2_imgproc_connectedComponents);
19+
// static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_connectedComponentsWithStats_obj, 1, cv2_imgproc_connectedComponentsWithStats);
1820
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_circle_obj, 4, cv2_imgproc_circle);
1921
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_cvtColor_obj, 2, cv2_imgproc_cvtColor);
2022
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_dilate_obj, 2, cv2_imgproc_dilate);
@@ -61,6 +63,14 @@ static const mp_rom_map_elem_t cv2_module_globals_table[] = {
6163
// include them here because it's C++ and this is C, so we have to redefine
6264
// them here. Only a subset of the most common conversions are included.
6365

66+
// OpenCV data types, from opencv2/core/hal/interface.h
67+
{ MP_ROM_QSTR(MP_QSTR_CV_8U), MP_ROM_INT(0) },
68+
{ MP_ROM_QSTR(MP_QSTR_CV_8S), MP_ROM_INT(1) },
69+
{ MP_ROM_QSTR(MP_QSTR_CV_16U), MP_ROM_INT(2) },
70+
{ MP_ROM_QSTR(MP_QSTR_CV_16S), MP_ROM_INT(3) },
71+
{ MP_ROM_QSTR(MP_QSTR_CV_32F), MP_ROM_INT(4) },
72+
// Other types are currently not supported by ulab
73+
6474
// Border types, from opencv2/core/base.hpp
6575
{ MP_ROM_QSTR(MP_QSTR_BORDER_CONSTANT), MP_ROM_INT(0) },
6676
{ MP_ROM_QSTR(MP_QSTR_BORDER_REPLICATE), MP_ROM_INT(1) },
@@ -210,6 +220,8 @@ static const mp_rom_map_elem_t cv2_module_globals_table[] = {
210220
{ MP_ROM_QSTR(MP_QSTR_blur), MP_ROM_PTR(&cv2_imgproc_blur_obj) },
211221
{ MP_ROM_QSTR(MP_QSTR_boxFilter), MP_ROM_PTR(&cv2_imgproc_boxFilter_obj) },
212222
{ MP_ROM_QSTR(MP_QSTR_Canny), MP_ROM_PTR(&cv2_imgproc_Canny_obj) },
223+
{ MP_ROM_QSTR(MP_QSTR_connectedComponents), MP_ROM_PTR(&cv2_imgproc_connectedComponents_obj) },
224+
// { MP_ROM_QSTR(MP_QSTR_connectedComponentsWithStats), MP_ROM_PTR(&cv2_imgproc_connectedComponentsWithStats_obj) },
213225
{ MP_ROM_QSTR(MP_QSTR_circle), MP_ROM_PTR(&cv2_imgproc_circle_obj) },
214226
{ MP_ROM_QSTR(MP_QSTR_cvtColor), MP_ROM_PTR(&cv2_imgproc_cvtColor_obj) },
215227
{ MP_ROM_QSTR(MP_QSTR_dilate), MP_ROM_PTR(&cv2_imgproc_dilate_obj) },

0 commit comments

Comments
 (0)