模板匹配

模板匹配

模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。

在OpenCV中提供了6种匹配度量方法。

  1. 平方差匹配法CV_TM_SQDIFF
  2. 归一化平方差匹配法CV_TM_SQDIFF_NORMED
  3. 相关匹配法CV_TM_CCORR
  4. 归一化相关匹配法CV_TM_CCORR_NORMED
  5. 系数匹配法CV_TM_CCOEFF
  6. 化相关系数匹配法CV_TMCCOEFF_NORMED

通常来讲,随着从简单测量方法(平方差)到更复杂的测量方法(相关系数法),我们可以获得越来越准确的匹配。然而这同时也会以越来越大的计算量为代价。对于选取何种方法,针对不同的匹配情况进行对此分析比较,选取更适合自己应用场景同时兼顾速度和精度的最佳方案。 注意 :对于方法SQDIFF和SQDIFF_NORMED两种方法来讲,越小的值就有着更高的匹配结果,而其余的方法则是数值越大匹配效果越好。

示例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <opencv2/opencv.hpp>
#include <stdio.h>

using namespace std;
using namespace cv;

int main(){
    // 读取原图
    Mat src = imread("../assets/zhaonimei.jpg",IMREAD_COLOR);
    imshow("src",src);

    // 模板
    Mat temp = imread("../assets/mei.jpg",IMREAD_COLOR);
    imshow("teamplate",temp);
    // 调用api查找内容
    int width = src.cols - temp.cols;
    int height = src.rows - temp.rows;
    Mat result(height,width,CV_8UC1);
    matchTemplate(src,temp,result,TM_SQDIFF);

    // 将结果进行归一化处理  , 可做可不做
    normalize(result,result,0,1,NORM_MINMAX);

    Point minLoc,maxLoc;
    double min,max;
    // 求最大值最小值
    minMaxLoc(result,&min,&max,&minLoc,&maxLoc);

    printf("min:%f ,max:%f..\n",min,max);

    rectangle(src,Rect(minLoc.x,minLoc.y,temp.cols,temp.rows),Scalar(0,0,255),2,LINE_AA);


    imshow("dst",src);
    waitKey(0);
    destroyAllWindows();
    return 0;
}