Skip to content

Commit 60cd368

Browse files
committed
Add template matching
1 parent da3452c commit 60cd368

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

src/imgproc.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,6 +1025,39 @@ mp_obj_t cv2_imgproc_line(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_
10251025
return mat_to_mp_obj(img);
10261026
}
10271027

1028+
mp_obj_t cv2_imgproc_matchTemplate(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
1029+
// Define the arguments
1030+
enum { ARG_img, ARG_templ, ARG_method, ARG_result, ARG_mask };
1031+
static const mp_arg_t allowed_args[] = {
1032+
{ MP_QSTR_img, MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
1033+
{ MP_QSTR_templ, MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_obj = MP_OBJ_NULL } },
1034+
{ MP_QSTR_method, MP_ARG_REQUIRED | MP_ARG_INT, { .u_int = TM_CCOEFF_NORMED } },
1035+
{ MP_QSTR_result, MP_ARG_OBJ, { .u_obj = mp_const_none } },
1036+
{ MP_QSTR_mask, MP_ARG_OBJ, { .u_obj = mp_const_none } },
1037+
};
1038+
1039+
// Parse the arguments
1040+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
1041+
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
1042+
1043+
// Convert arguments to required types
1044+
Mat img = mp_obj_to_mat(args[ARG_img].u_obj);
1045+
Mat templ = mp_obj_to_mat(args[ARG_templ].u_obj);
1046+
int method = args[ARG_method].u_int;
1047+
Mat result = mp_obj_to_mat(args[ARG_result].u_obj);
1048+
Mat mask = mp_obj_to_mat(args[ARG_mask].u_obj);
1049+
1050+
// Call the corresponding OpenCV function
1051+
try {
1052+
matchTemplate(img, templ, result, method, mask);
1053+
} catch(Exception& e) {
1054+
mp_raise_msg(&mp_type_Exception, MP_ERROR_TEXT(e.what()));
1055+
}
1056+
1057+
// Return the result
1058+
return mat_to_mp_obj(result);
1059+
}
1060+
10281061
mp_obj_t cv2_imgproc_medianBlur(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
10291062
// Define the arguments
10301063
enum { ARG_src, ARG_ksize, ARG_dst };

src/imgproc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ extern mp_obj_t cv2_imgproc_HoughLines(size_t n_args, const mp_obj_t *pos_args,
2525
extern mp_obj_t cv2_imgproc_HoughLinesWithAccumulator(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
2626
extern mp_obj_t cv2_imgproc_Laplacian(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
2727
extern mp_obj_t cv2_imgproc_line(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
28+
extern mp_obj_t cv2_imgproc_matchTemplate(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
2829
extern mp_obj_t cv2_imgproc_medianBlur(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
2930
extern mp_obj_t cv2_imgproc_morphologyEx(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);
3031
extern mp_obj_t cv2_imgproc_putText(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args);

src/opencv_upy.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_HoughLines_obj, 4, cv2_imgproc_Hou
3333
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_HoughLinesWithAccumulator_obj, 4, cv2_imgproc_HoughLinesWithAccumulator);
3434
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_Laplacian_obj, 2, cv2_imgproc_Laplacian);
3535
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_line_obj, 4, cv2_imgproc_line);
36+
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_matchTemplate_obj, 3, cv2_imgproc_matchTemplate);
3637
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_medianBlur_obj, 2, cv2_imgproc_medianBlur);
3738
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_morphologyEx_obj, 3, cv2_imgproc_morphologyEx);
3839
static MP_DEFINE_CONST_FUN_OBJ_KW(cv2_imgproc_putText_obj, 6, cv2_imgproc_putText);
@@ -184,6 +185,14 @@ static const mp_rom_map_elem_t cv2_module_globals_table[] = {
184185
{ MP_ROM_QSTR(MP_QSTR_MARKER_SQUARE), MP_ROM_INT(4) },
185186
{ MP_ROM_QSTR(MP_QSTR_MARKER_TRIANGLE_UP), MP_ROM_INT(5) },
186187
{ MP_ROM_QSTR(MP_QSTR_MARKER_TRIANGLE_DOWN), MP_ROM_INT(6) },
188+
189+
// Template matching modes, from opencv2/imgproc.hpp
190+
{ MP_ROM_QSTR(MP_QSTR_TM_SQDIFF), MP_ROM_INT(0) },
191+
{ MP_ROM_QSTR(MP_QSTR_TM_SQDIFF_NORMED), MP_ROM_INT(1) },
192+
{ MP_ROM_QSTR(MP_QSTR_TM_CCORR), MP_ROM_INT(2) },
193+
{ MP_ROM_QSTR(MP_QSTR_TM_CCORR_NORMED), MP_ROM_INT(3) },
194+
{ MP_ROM_QSTR(MP_QSTR_TM_CCOEFF), MP_ROM_INT(4) },
195+
{ MP_ROM_QSTR(MP_QSTR_TM_CCOEFF_NORMED), MP_ROM_INT(5) },
187196

188197
////////////////////////////////////////////////////////////////////////////
189198
// OpenCV core functions
@@ -219,6 +228,7 @@ static const mp_rom_map_elem_t cv2_module_globals_table[] = {
219228
{ MP_ROM_QSTR(MP_QSTR_HoughLinesWithAccumulator), MP_ROM_PTR(&cv2_imgproc_HoughLinesWithAccumulator_obj) },
220229
{ MP_ROM_QSTR(MP_QSTR_Laplacian), MP_ROM_PTR(&cv2_imgproc_Laplacian_obj) },
221230
{ MP_ROM_QSTR(MP_QSTR_line), MP_ROM_PTR(&cv2_imgproc_line_obj) },
231+
{ MP_ROM_QSTR(MP_QSTR_matchTemplate), MP_ROM_PTR(&cv2_imgproc_matchTemplate_obj) },
222232
{ MP_ROM_QSTR(MP_QSTR_medianBlur), MP_ROM_PTR(&cv2_imgproc_medianBlur_obj) },
223233
{ MP_ROM_QSTR(MP_QSTR_morphologyEx), MP_ROM_PTR(&cv2_imgproc_morphologyEx_obj) },
224234
{ MP_ROM_QSTR(MP_QSTR_putText), MP_ROM_PTR(&cv2_imgproc_putText_obj) },

0 commit comments

Comments
 (0)