图像处理 模板匹配

演示用局部图片匹配整张图片

VS2017 + OpenCV4.0.1编译

 1 #include <iostream>
 2 #include <opencv2/opencv.hpp>
 3 #include <opencv2/core.hpp>
 4 #include <opencv2/highgui.hpp>
 5 #include <opencv2/imgproc.hpp>
 6 using namespace std;
 7 using namespace cv;
 8 
 9 //定义全局变量
10 Mat src, temp, res;
11 
12 //显示窗口名
13 string img_window = "source image";
14 string res_window = "result image";
15 
16 int match_method;
17 int max_tracker = 5;
18 
19 //滑动条回调函数
20 void match(int pos, void*)
21 {
22     Mat subImg;
23     src.copyTo(subImg);//拷贝副本
24     int res_row = src.rows - temp.rows + 1;
25     int res_col = src.cols - temp.cols + 1;
26     res.create(res_row, res_col, CV_32FC1);//创建结果矩阵
27 
28     //模板匹配
29     matchTemplate(subImg, temp, res, match_method);
30     normalize(res, res, 0, 1, NORM_MINMAX, -1, Mat());
31 
32     //定位
33     double minVal, maxVal;
34     Point minLoc, maxLoc, matchLoc;
35     minMaxLoc(res, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
36 
37     //分类讨论
38     if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
39         matchLoc = minLoc;
40     else
41         matchLoc = maxLoc;
42 
43     //矩形框显示匹配结果
44     rectangle(subImg, matchLoc, Point(matchLoc.x + temp.cols, matchLoc.y + temp.rows), Scalar(0, 255, 0), 2);
45     rectangle(res, matchLoc, Point(matchLoc.x + temp.cols, matchLoc.y + temp.rows), Scalar(0, 255, 0), 2);
46     
47     imshow(img_window, subImg);
48     imshow(res_window, res);
49 }
50 
51 int main()
52 {
53     //读入原图和模板图
54     src = imread("D:\\trashBox\\testIMG\\memory.jpg");
55     temp = imread("D:\\trashBox\\testIMG\\temp.png");
56     imshow("模板", temp);
57     
58     //创建显示窗口
59     namedWindow(img_window);
60     namedWindow(res_window);
61 
62     //创建滑动条
63     match(2, 0);
64     createTrackbar("匹配方法", img_window, &match_method, max_tracker, match);
65     
66     waitKey(0);
67     return 0;
68 }

参考资料

【1】http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/template_matching/template_matching.html#template-matching

#模板匹配 import cv2 as cv import numpy as np def template_demo(): dog = cv.imread("E:/opencv/picture/dog.jpg") dog_nose = cv.imread("E:/opencv/picture/nose.jpg") cv.imshow("dog",dog) result = cv.matchTemplate(dog,dog_nose,cv.TM_CCORR_NORMED) h,w =dog_nose.shape[:2] min_val,max_val,min_loc,max_loc=cv.minMaxLoc(result) pt1 = max_loc pt2 = (pt1[0]+w,pt1[1]+h) cv.rectangle(dog,pt1,pt2,(0,255,0),2) cv.imshow("match",dog) print(result) #src = cv.imread("E:/opencv/picture/dog.jpg") #cv.imshow("inital_window",src) template_demo() cv.waitKey(0) cv.destroyAllWindows() 分析: 模板匹配通常用于目标检测。本文我们检测狗图片的鼻子。 • 我们需要两个主要组件: 1. 源图像(I):我们期望找到与模板图像匹配的图像 2. 模板图像(T):将与模板图像进行比较的补丁图像 1. result = cv.matchTemplate(dog,dog_nose,cv.TM_CCORR_NORMED) void cv::matchTemplate( cv::InputArray image, // 待匹配图像W*H cv::InputArray templ, // 模板图像,和image类型相同, 大小 w*h cv::OutputArray result, // 匹配结果图像, 类型 32F, 大小 (W-w+1)*(H-h+1) int method // 用于比较的方法 ); 其中method有: TM_SQDIFF_NORMED匹配数值越低表示匹配效果越好 TM_CCORR_NORMED,TM_CCOEFF_NORMED匹配数值越大表示匹配效果越好 result参数:(保存各个点匹配结果的参数) 模板匹配函数cvMatchTemplate依次计算模板与待测图片的重叠区域的相似度,并将结果存入映射图像result当中,也就是说result图像中的每一个点的值代表了一次相似度比较结果 模板在待测图像上每次在横向或是纵向上移动一个像素,并作一次比较计算 我们可以通过cv.minMaxLoc函数来确定结果矩阵的最大值和最小值的位置。 2. cv.minMaxLoc(result) 返回result数值中最小值以及最小值所在的位置和最大值以及最大值所在的位置。 3. 当知道哪个点匹配度最高时这个时候我们需要用矩阵把模板给标出来 C++: void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0) 第一个参数:要在哪个图像上画? 第二个参数:矩阵的左上角点坐标 第三个参数:矩阵的右下角点坐标 第四个参数:颜色
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值