OpenCv给出的MatchTemplate函数,是在一幅图像中寻找与另一幅模板图像最匹配(相似)部分。

一.参数详解 

    MatchTemplate(InputArray image, InputArray templ, OutputArray result, int method);

        image:输入一个待匹配的图像,支持8U或者32F。

        templ:输入一个模板图像,与image相同类型。

        result:输出保存结果的矩阵,32F类型。

        method:要使用的数据比较方法。

    1.result

        result是一个结果矩阵,假设待匹配图像为 I,宽高为(W,H),模板图像为 T,宽高为(w,h)。那么result的大小就为(W-w+1,H-h+1) 。

        原因是因为,在匹配时,以模板大小的搜索框依次遍历整张图片时,每行需要遍历(W-w+1)次,每列需要遍历(H-h+1)。

        以下列矩阵为例:

        待匹配图像 I.Size(5,5),模板图像 T.Size(3,3)。以Size(3,3)的搜索框遍历图像I时,x方向需要遍历3次,y方向遍历3次。

        多观察发现,归纳出result.Size(W-w+1,H-h+1)。

     2.method

         T 代表模板图像,I 代表待匹配图像。

        x ,y 代表当前搜索框在 矩阵中左上角元素的坐标。

        x' ,y' 代表T和搜索框框出来的 的矩阵的元素坐标。

        如下图:以归一化相关系数匹配方法为例。

        此时搜索框左上角坐标(x,y)=(0,0)。

          对此搜索框内的矩阵和模板矩阵进行数据比较。

          第一步:去均值。

          第二步:求俩矩阵内积,以及两个矩阵内元素平方和的平方的乘积。

        对公式研究发现:

               方差匹配方法:匹配度越高,值越接近于0。

               归一化方差匹配方法:完全匹配结果为0。

               相关性匹配方法:完全匹配会得到很大值,不匹配会得到一个很小值或0。

               归一化的互相关匹配方法:完全匹配会得到1, 完全不匹配会得到0。

               相关系数匹配方法:完全匹配会得到一个很大值,完全不匹配会得到0,完全负相关会得到很大的负数。

      (此处与书籍以及大部分分享的资料所认为不同,研究公式发现,只有归一化的相关系数才会有[-1,1]的值域)

               归一化的相关系数匹配方法:完全匹配会得到1,完全负相关匹配会得到-1,完全不匹配会得到0。

    如有错误,敬请指正,谢谢!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐