diff --git a/modules/imgproc/src/templmatch.cpp b/modules/imgproc/src/templmatch.cpp index 5671025b0f..827af3eb47 100644 --- a/modules/imgproc/src/templmatch.cpp +++ b/modules/imgproc/src/templmatch.cpp @@ -850,7 +850,8 @@ static void matchTemplateMask( InputArray _img, InputArray _templ, OutputArray _ // CCorr(I', T') = CCorr(I, T'*M) - sum(T'*M)/sum(M)*CCorr(I, M) // It does not matter what to use Mat/MatExpr, it should be evaluated to perform assign subtraction - Mat temp_res = img_mask_corr.mul(sum(templx_mask).div(mask_sum)); + Mat temp_res; + multiply(img_mask_corr, sum(templx_mask).div(mask_sum), temp_res); if (img.channels() == 1) { result -= temp_res; @@ -881,8 +882,11 @@ static void matchTemplateMask( InputArray _img, InputArray _templ, OutputArray _ Mat img_mask2_corr(corrSize, img.type()); crossCorr(img2, mask2, norm_imgx, Point(0,0), 0, 0); crossCorr(img, mask2, img_mask2_corr, Point(0,0), 0, 0); - temp_res = img_mask_corr.mul(Scalar(1.0, 1.0, 1.0, 1.0).div(mask_sum)) - .mul(img_mask_corr.mul(mask2_sum.div(mask_sum)) - 2 * img_mask2_corr); + Mat temp_res1; + multiply(img_mask_corr, Scalar(1.0, 1.0, 1.0, 1.0).div(mask_sum), temp_res1); + Mat temp_res2; + multiply(img_mask_corr, mask2_sum.div(mask_sum), temp_res2); + temp_res = temp_res1.mul(temp_res2 - 2 * img_mask2_corr); if (img.channels() == 1) { norm_imgx += temp_res; diff --git a/modules/imgproc/test/test_templmatchmask.cpp b/modules/imgproc/test/test_templmatchmask.cpp index 3c8ab665ae..c9664cc406 100644 --- a/modules/imgproc/test/test_templmatchmask.cpp +++ b/modules/imgproc/test/test_templmatchmask.cpp @@ -275,4 +275,16 @@ INSTANTIATE_TEST_CASE_P(MultiChannelMask, Imgproc_MatchTemplateWithMask2, Values(cv::TM_SQDIFF, cv::TM_SQDIFF_NORMED, cv::TM_CCORR, cv::TM_CCORR_NORMED, cv::TM_CCOEFF, cv::TM_CCOEFF_NORMED))); +TEST(Imgproc_MatchTemplateWithMask, bug_26389) { + const Mat image = Mat::ones(Size(10, 10), CV_8UC1); + const Mat templ = Mat::ones(Size(10, 7), CV_8UC1); + const Mat mask = Mat::ones(Size(10, 7), CV_8UC1); + + for (const int method : {TM_CCOEFF, TM_CCOEFF_NORMED}) + { + Mat result; + matchTemplate(image, templ, result, method, mask); + } +} + }} // namespace