mirror of
https://github.com/zebrajr/opencv.git
synced 2025-12-06 12:19:50 +01:00
Fix matchTemplate with mask crash
This commit is contained in:
parent
4d26e16af8
commit
ab0a818c84
|
|
@ -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)
|
// 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
|
// 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)
|
if (img.channels() == 1)
|
||||||
{
|
{
|
||||||
result -= temp_res;
|
result -= temp_res;
|
||||||
|
|
@ -881,8 +882,11 @@ static void matchTemplateMask( InputArray _img, InputArray _templ, OutputArray _
|
||||||
Mat img_mask2_corr(corrSize, img.type());
|
Mat img_mask2_corr(corrSize, img.type());
|
||||||
crossCorr(img2, mask2, norm_imgx, Point(0,0), 0, 0);
|
crossCorr(img2, mask2, norm_imgx, Point(0,0), 0, 0);
|
||||||
crossCorr(img, mask2, img_mask2_corr, 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))
|
Mat temp_res1;
|
||||||
.mul(img_mask_corr.mul(mask2_sum.div(mask_sum)) - 2 * img_mask2_corr);
|
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)
|
if (img.channels() == 1)
|
||||||
{
|
{
|
||||||
norm_imgx += temp_res;
|
norm_imgx += temp_res;
|
||||||
|
|
|
||||||
|
|
@ -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,
|
Values(cv::TM_SQDIFF, cv::TM_SQDIFF_NORMED, cv::TM_CCORR, cv::TM_CCORR_NORMED,
|
||||||
cv::TM_CCOEFF, cv::TM_CCOEFF_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
|
}} // namespace
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user