@@ -292,12 +292,12 @@ static void cvTsMatchTemplate( const CvMat* img, const CvMat* templ, CvMat* resu
292
292
denom += a_sum2.val [2 ] - (a_sum.val [2 ]*a_sum.val [2 ])/area;
293
293
}
294
294
denom = sqrt (MAX (denom,0 ))*b_denom;
295
- if ( fabs (value) < denom )
295
+ if ( fabs (value) < denom || method == CV_TM_SQDIFF_NORMED )
296
296
value /= denom;
297
297
else if ( fabs (value) < denom*1.125 )
298
298
value = value > 0 ? 1 : -1 ;
299
299
else
300
- value = method != CV_TM_SQDIFF_NORMED ? 0 : 1 ;
300
+ value = 0 ;
301
301
}
302
302
303
303
((float *)(result->data .ptr + result->step *i))[j] = (float )value;
@@ -436,15 +436,15 @@ TEST(Imgproc_MatchTemplate, bug_15215) {
436
436
437
437
// manually compute sqdiff norm
438
438
Scalar squaredDiff = delta.dot (delta);
439
- float sqdiff = squaredDiff.val [0 ];
439
+ double sqdiff = squaredDiff.val [0 ];
440
440
Scalar sumOfSquaredProduct = cv::sum (cvimg.mul (cvimg)) * cv::sum (cvtmpl.mul (cvtmpl));
441
441
double norm_ = cv::sqrt (sumOfSquaredProduct.val [0 ]);
442
- float expectedResult = sqdiff / (float ) norm_;
442
+ double expectedResult = sqdiff / (float ) norm_;
443
443
444
444
// compute with matchTemplate
445
445
cv::Mat output;
446
446
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 );
448
448
ASSERT_FLOAT_EQ (actualResult, expectedResult);
449
449
}
450
450
} // namespace
0 commit comments