@@ -292,12 +292,12 @@ static void cvTsMatchTemplate( const CvMat* img, const CvMat* templ, CvMat* resu
292292 denom += a_sum2.val [2 ] - (a_sum.val [2 ]*a_sum.val [2 ])/area;
293293 }
294294 denom = sqrt (MAX (denom,0 ))*b_denom;
295- if ( fabs (value) < denom )
295+ if ( fabs (value) < denom || method == CV_TM_SQDIFF_NORMED )
296296 value /= denom;
297297 else if ( fabs (value) < denom*1.125 )
298298 value = value > 0 ? 1 : -1 ;
299299 else
300- value = method != CV_TM_SQDIFF_NORMED ? 0 : 1 ;
300+ value = 0 ;
301301 }
302302
303303 ((float *)(result->data .ptr + result->step *i))[j] = (float )value;
@@ -436,15 +436,15 @@ TEST(Imgproc_MatchTemplate, bug_15215) {
436436
437437 // manually compute sqdiff norm
438438 Scalar squaredDiff = delta.dot (delta);
439- float sqdiff = squaredDiff.val [0 ];
439+ double sqdiff = squaredDiff.val [0 ];
440440 Scalar sumOfSquaredProduct = cv::sum (cvimg.mul (cvimg)) * cv::sum (cvtmpl.mul (cvtmpl));
441441 double norm_ = cv::sqrt (sumOfSquaredProduct.val [0 ]);
442- float expectedResult = sqdiff / (float ) norm_;
442+ double expectedResult = sqdiff / (float ) norm_;
443443
444444 // compute with matchTemplate
445445 cv::Mat output;
446446 cv::matchTemplate (cvimg, cvtmpl, output, CV_TM_SQDIFF_NORMED);
447- float actualResult = output.at <float >(0 , 0 );
447+ double actualResult = output.at <float >(0 , 0 );
448448 ASSERT_FLOAT_EQ (actualResult, expectedResult);
449449}
450450} // namespace
0 commit comments