diff --git a/doc/tutorials/imgproc/histograms/template_matching/images/Template_Matching_Mask_Example.jpg b/doc/tutorials/imgproc/histograms/template_matching/images/Template_Matching_Mask_Example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..711faec3b153f378e367e1a2ea252c41e5173356 Binary files /dev/null and b/doc/tutorials/imgproc/histograms/template_matching/images/Template_Matching_Mask_Example.jpg differ diff --git a/doc/tutorials/imgproc/histograms/template_matching/template_matching.markdown b/doc/tutorials/imgproc/histograms/template_matching/template_matching.markdown index c39fd159f0f8ad8369655bfe9da8471c57e03286..5196f424a8fd1b2e3bd002f27e2f2aa6ee42349a 100644 --- a/doc/tutorials/imgproc/histograms/template_matching/template_matching.markdown +++ b/doc/tutorials/imgproc/histograms/template_matching/template_matching.markdown @@ -19,6 +19,10 @@ Theory Template matching is a technique for finding areas of an image that match (are similar) to a template image (patch). +While the patch must be a rectangle it may be that not all of the +rectangle is relevent. In such a case, a mask can be used to isolate the portion of the patch +that should be used to find the match. + ### How does it work? - We need two primary components: @@ -51,6 +55,28 @@ template image (patch). - In practice, we use the function @ref cv::minMaxLoc to locate the highest value (or lower, depending of the type of matching method) in the *R* matrix. +### How does the mask work? +- If masking is needed for the match, three components are required: + + -# **Source image (I):** The image in which we expect to find a match to the template image + -# **Template image (T):** The patch image which will be compared to the template image + -# **Mask image (M):** The mask, a greyscale image that masks the template + + +- Only two matching methods currently accept a mask: CV_TM_SQDIFF and CV_TM_CCORR_NORMED (see + below for explanation of all the matching methods available in opencv). + + +- The mask must have the same dimensions as the template + + +- The mask should be a greyscale image where each pixel contains some value from black to white. + Pixels that are white are fully included in calculating the best match. Pixels that are black + are excluded from the match. A value between black and white will include some of + the match proportion to how dark the pixel is. + + ![](images/Template_Matching_Mask_Example.jpg) + ### Which are the matching methods available in OpenCV? Good question. OpenCV implements Template matching in the function @ref cv::matchTemplate . The @@ -88,10 +114,11 @@ Code ---- - **What does this program do?** - - Loads an input image and a image patch (*template*) + - Loads an input image, an image patch (*template*), and optionally a mask - Perform a template matching procedure by using the OpenCV function @ref cv::matchTemplate with any of the 6 matching methods described before. The user can choose the method by - entering its selection in the Trackbar. + entering its selection in the Trackbar. If a mask is supplied, it will only be used for + the methods that support masking - Normalize the output of the matching procedure - Localize the location with higher matching probability - Draw a rectangle around the area corresponding to the highest match @@ -115,8 +142,8 @@ Explanation @endcode -# Load the source image and template: @code{.cpp} - img = imread( argv[1], 1 ); - templ = imread( argv[2], 1 ); + img = imread( argv[1], IMREAD_COLOR ); + templ = imread( argv[2], IMREAD_COLOR ); @endcode -# Create the windows to show the results: @code{.cpp} @@ -150,10 +177,14 @@ Explanation @endcode -# Perform the template matching operation: @code{.cpp} - matchTemplate( img, templ, result, match_method ); + bool method_accepts_mask = CV_TM_SQDIFF == match_method || match_method == CV_TM_CCORR_NORMED; + if (use_mask && method_accepts_mask) + { matchTemplate( img, templ, result, match_method, mask); } + else + { matchTemplate( img, templ, result, match_method); } @endcode - the arguments are naturally the input image **I**, the template **T**, the result **R** and the - match_method (given by the Trackbar) + the arguments are naturally the input image **I**, the template **T**, the result **R**, the + match_method (given by the Trackbar), and optionally the mask image **M** -# We normalize the results: @code{.cpp}