OpenCV 中的模板匹配可以处理两个相同大小的图像吗?
Can template matching in OpenCV deal with two same-sized images?
我想在OpenCV中使用模板匹配来获取两张图片的相似度。众所周知,模板匹配通常用于在较大的图像中找到较小的图像部分。这是我的问题。我发现当模板图像和源图像大小相同时,从函数 matchTemplate() 获得的结果矩阵始终为 0,即使这两个图像完全相同。
OpenCV 中的模板匹配可以处理两个相同大小的图像吗?
也许我应该先道歉:归一化后矩阵的值确实为零,只要两张图片大小相同。我错了:)
查看此页面:
OpenCV - Normalize
部分OpenCV源码:
void cv::normalize( InputArray _src, OutputArray _dst, double a, double b,
int norm_type, int rtype, InputArray _mask )
{
Mat src = _src.getMat(), mask = _mask.getMat();
double scale = 1, shift = 0;
if( norm_type == CV_MINMAX )
{
double smin = 0, smax = 0; //Records the maximum and minimum value in the _src matrix
double dmin = MIN( a, b ), dmax = MAX( a, b );
minMaxLoc( _src, &smin, &smax, 0, 0, mask ); //Find the minimum and maximum value
scale = (dmax - dmin)*(smax - smin > DBL_EPSILON ? 1./(smax - smin) : 0);
shift = dmin - smin*scale;
}
//...
if( !mask.data )
src.convertTo( dst, rtype, scale, shift );
else
{
//...
}
}
由于结果数组中只有一个元素,smin
= smax
= result[0][0]
scale = (dmax - dmin)*(smax - smin > DBL_EPSILON ? 1./(smax - smin) : 0);
= (1 - 0 ) * (0) = 0
shift = dmin - smin*scale
= 0 - result[0][0] * 0
= 0
之后void Mat::convertTo(OutputArray m, int rtype, double alpha, double beta)
使用如下公式:(saturate_cast
与你的问题无关,暂时忽略。)
当你调用normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() )
时,无论矩阵中的元素是什么,它都会执行src.convertTo( dst, rtype, scale, shift );
with scale
= 0
, shift
= 0
。
在这个 convertTo
函数中,
alpha = 0, beta = 0
result[0][0] = result[0][0] * alpha + beta
= result[0][0] * 0 + 0
= 0
因此,无论结果矩阵中的值为:
只要图片和模板大小一样,结果矩阵的大小就是1x1,归一化后,结果矩阵会变成[0]
.
我想在OpenCV中使用模板匹配来获取两张图片的相似度。众所周知,模板匹配通常用于在较大的图像中找到较小的图像部分。这是我的问题。我发现当模板图像和源图像大小相同时,从函数 matchTemplate() 获得的结果矩阵始终为 0,即使这两个图像完全相同。
OpenCV 中的模板匹配可以处理两个相同大小的图像吗?
也许我应该先道歉:归一化后矩阵的值确实为零,只要两张图片大小相同。我错了:)
查看此页面: OpenCV - Normalize
部分OpenCV源码:
void cv::normalize( InputArray _src, OutputArray _dst, double a, double b,
int norm_type, int rtype, InputArray _mask )
{
Mat src = _src.getMat(), mask = _mask.getMat();
double scale = 1, shift = 0;
if( norm_type == CV_MINMAX )
{
double smin = 0, smax = 0; //Records the maximum and minimum value in the _src matrix
double dmin = MIN( a, b ), dmax = MAX( a, b );
minMaxLoc( _src, &smin, &smax, 0, 0, mask ); //Find the minimum and maximum value
scale = (dmax - dmin)*(smax - smin > DBL_EPSILON ? 1./(smax - smin) : 0);
shift = dmin - smin*scale;
}
//...
if( !mask.data )
src.convertTo( dst, rtype, scale, shift );
else
{
//...
}
}
由于结果数组中只有一个元素,smin
= smax
= result[0][0]
scale = (dmax - dmin)*(smax - smin > DBL_EPSILON ? 1./(smax - smin) : 0);
= (1 - 0 ) * (0) = 0
shift = dmin - smin*scale
= 0 - result[0][0] * 0
= 0
之后void Mat::convertTo(OutputArray m, int rtype, double alpha, double beta)
使用如下公式:(saturate_cast
与你的问题无关,暂时忽略。)
当你调用normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() )
时,无论矩阵中的元素是什么,它都会执行src.convertTo( dst, rtype, scale, shift );
with scale
= 0
, shift
= 0
。
在这个 convertTo
函数中,
alpha = 0, beta = 0
result[0][0] = result[0][0] * alpha + beta
= result[0][0] * 0 + 0
= 0
因此,无论结果矩阵中的值为:
只要图片和模板大小一样,结果矩阵的大小就是1x1,归一化后,结果矩阵会变成[0]
.