7

OpenCV, as of version 3.0.0, added a mask feature to the matchTemplate method. It supports template matching with transparent templates by defining a mask on the template. My python program below works fine, but if I add a mask parameter to the cv2.matchTemplate call, it throws an error:

OpenCV Error: The function/feature is not implemented () in matchTemplateMask, file /Users/jared.rada/dev/opencv/modules/imgproc/src/templmatch.cpp, line 894
Traceback (most recent call last):
File "masked.py", line 13, in <module>
res = cv2.matchTemplate(img, tmpl, cv2.TM_CCOEFF_NORMED, data, mask)
cv2.error: /Users/jared.rada/dev/opencv/modules/imgproc/src/templmatch.cpp:894: error: (-213)  in function matchTemplateMask`

My source code:

import sys
import numpy as np
import cv2


img = cv2.imread('./image.jpg')
tmpl = cv2.imread('./tmpl.png')
mask = cv2.imread('./mask.png')
w, h = tmpl.shape[:-1]
data = np.zeros((h, w, 3), dtype=np.uint8)

res = cv2.matchTemplate(img, tmpl, cv2.TM_CCOEFF_NORMED, data, mask)

min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

top_left = max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img, top_left, bottom_right, (0, 0, 255), 2)

cv2.imshow("images", np.hstack([img]))
cv2.waitKey(0)

How do I know if the python bindings support the mask feature?

jaredrada
  • 1,130
  • 3
  • 12
  • 25
  • you might be wrong about the version, if it was merged on jan 19, it's probably in opencv3.1 only. – berak Feb 26 '16 at 18:38
  • yes good point @berak, i also tried 3.1.0 (confirmed by `print cv2.__version__` which reads `3.1.0` but it throws the same error. any other suggestions on how i can find out if this feature is implemented in the python bindings? – jaredrada Feb 26 '16 at 18:40
  • 1
    i looked at the .cpp file mentioned in the error, and i see this signature `static bool matchTemplate_CCOEFF_NORMED(InputArray _image, InputArray _templ, OutputArray _result)` so it appears there is no parameter for the mask. – jaredrada Feb 26 '16 at 18:43

2 Answers2

10

there is an easy answer: looking at the src code , you will find, that it's only implemented for method == CV_TM_SQDIFF and method == CV_TM_CCORR_NORMED , in other words, not for your desired cv2.TM_CCOEFF_NORMED

berak
  • 39,159
  • 9
  • 91
  • 89
6

update for the answer: see src code

and the commit:

templmatch: Add support for mask for all methods

now latest pip install opencv-contrib-python will including mask for all methods (testd on python3.7(

Felix Liu
  • 199
  • 2
  • 9