opencv - OpenCV 中的模板匹配可以处理两个相同大小的图像吗?

标签 opencv similarity template-matching

我想在 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 与你的问题,所以我们现在可以忽略它。)

convertTo

当你调用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 - OpenCV 中的模板匹配可以处理两个相同大小的图像吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28102385/

相关文章:

python - 优化裁剪功能

c++ - destroyWindow(来自 opencv)关闭所有窗口并停止 c++ 程序

algorithm - 在大型文件中查找部分相似的文件

python - 如何使用 matchTemplate 基于共同特征对齐两个图像

opencv - 模板匹配 - 互相关与平方差异 - 何时选择一个而不是另一个?

python - 找到使用 houghlines opencv 绘制的两条线的交点

c - VLC 的 opencv_example 插件无法正常工作

Python:两个网络之间的jaccard相似性?

java - 从两个字符串中找到相似子串的方法

Java 模板匹配越界