opencv学习之路(21)、模板匹配及应用
一、模板匹配概念




二、单模板匹配
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv; void main()
{
Mat temp=imread("E://mu.jpg");
Mat src=imread("E://lena.jpg");
Mat dst=src.clone();
imshow("temp",temp); int width=src.cols-temp.cols+;//result宽度
int height=src.rows-temp.rows+;//result高度 Mat result(height,width,CV_32FC1);//创建结果映射图像
//matchTemplate(srcImg, templateImg, resultImg, CV_TM_SQDIFF); //平方差匹配法(最好匹配0)
//matchTemplate(srcImg, templateImg, resultImg, CV_TM_SQDIFF_NORMED); //归一化平方差匹配法(最好匹配0)
//matchTemplate(srcImg, templateImg, resultImg, CV_TM_CCORR); //相关匹配法(最坏匹配0)
//matchTemplate(srcImg, templateImg, resultImg, CV_TM_CCORR_NORMED); //归一化相关匹配法(最坏匹配0)
//matchTemplate(srcImg, templateImg, resultImg, CV_TM_CCOEFF); //系数匹配法(最好匹配1)
matchTemplate(src,temp,result,CV_TM_CCOEFF_NORMED);//化相关系数匹配,最佳值1
imshow("result",result);
normalize(result,result,,,NORM_MINMAX,-);//归一化到0-1范围 double minValue,maxValue;
Point minLoc,maxLoc;
minMaxLoc(result,&minValue,&maxValue,&minLoc,&maxLoc);
cout<<"minValue="<<minValue<<endl;
cout<<"maxValue="<<maxValue<<endl; rectangle(dst,maxLoc,Point(maxLoc.x+temp.cols,maxLoc.y+temp.rows),Scalar(,,),,);
imshow("dst",dst); waitKey();
}

注意:result的长宽正好是原图-模板图的长宽,result图中白亮程度表示匹配程度
三、视频模板匹配
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv; void main()
{
Mat frame,resultImg;
Mat templateImg = imread("E://green.jpg");
VideoCapture cap("E://1.mp4");
if(!cap.isOpened())
return;
int resultImg_cols,resultImg_rows; while()
{
cap>>frame;
if(frame.empty()) break;
Mat showImg = frame.clone();
resultImg_cols = frame.cols - templateImg.cols + ;
resultImg_rows = frame.rows - templateImg.rows + ;
resultImg.create(resultImg_cols, resultImg_rows, CV_32FC1);
matchTemplate(frame, templateImg, resultImg, CV_TM_CCOEFF_NORMED); //化相关系数匹配法(最好匹配1)
normalize(resultImg, resultImg, , , NORM_MINMAX); double minValue, maxValue;
Point minLoc, maxLoc;
Point matchLoc; minMaxLoc(resultImg, &minValue, &maxValue, &minLoc, &maxLoc);
cout<<"max_value= "<<maxValue<<endl;
//cout<<"min_value= "<<minValue<<endl;
if(maxValue>=0.7)
rectangle(showImg, maxLoc, Point(maxLoc.x + templateImg.cols, maxLoc.y + templateImg.rows), Scalar(, , ), );
imshow("frame", frame);
imshow("result", showImg);
if( == waitKey())
break;
}
destroyAllWindows(); waitKey();
}

四、多模板匹配(没懂/(ㄒoㄒ)/~~)
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace std;
using namespace cv; void main()
{
Mat srcImg = imread("E://src.png");
Mat templateImg = imread("E://temp.png");
Mat resultImg;
Mat showImg = srcImg.clone(); int resultImg_cols = srcImg.cols - templateImg.cols + ;
int resultImg_rows = srcImg.rows - templateImg.rows + ; resultImg.create(resultImg_cols, resultImg_rows, CV_32FC1);
matchTemplate(srcImg, templateImg, resultImg, CV_TM_CCOEFF_NORMED); //化相关系数匹配法(最好匹配1)
normalize(resultImg, resultImg, , , NORM_MINMAX);
Mat midImg = resultImg.clone(); //多目标模板匹配---方法一
/*double matchValue;
int count0=0;
int tempW=0, tempH=0;
char matchRate[10]; for(int i=0; i<resultImg_rows; i++)
{
for(int j=0; j<resultImg_cols; j++)
{
matchValue = resultImg.at<float>(i, j);
sprintf(matchRate, "%0.2f", matchValue);
if(matchValue>=0.85 && (abs(j - tempW)>5) && (abs(i - tempH)>5) )
{
count0++;
putText(showImg, matchRate, Point(j-5, i-5), CV_FONT_HERSHEY_COMPLEX, 1, Scalar(0, 0, 255), 1);
rectangle(showImg, Point(j, i), Point(j + templateImg.cols, i + templateImg.rows), Scalar(0, 255, 0), 2);
tempW = j;
tempH = i;
}
}
}
cout<<"count="<<count0<<endl;
imshow("resultImg", resultImg);
imshow("dst", showImg);*/ //多目标模板匹配---方法二
double minValue, maxValue;
Point minLoc, maxLoc;
Point matchLoc;
char matchRate[]; for(int i=; i<; i++)
{
int startX = maxLoc.x - ;
int startY = maxLoc.y - ;
int endX = maxLoc.x + ;
int endY = maxLoc.y + ;
if(startX< || startY<)
{
startX = ;
startY = ;
}
if(endX > resultImg.cols - || endY > resultImg.rows - )
{
endX = resultImg.cols - ;
endY = resultImg.rows- ;
}
Mat temp = Mat::zeros(endX - startX, endY - startY, CV_32FC1);
//Mat ROI = resultImg(Rect(Point(startX, startY), temp.cols, temp.rows));
temp.copyTo(resultImg(Rect(startX, startY, temp.cols, temp.rows)));
minMaxLoc(resultImg, &minValue, &maxValue, &minLoc, &maxLoc);
if(maxValue<0.8) break; cout<<"max_value= "<<maxValue<<endl;
sprintf(matchRate, "%0.2f", maxValue);
putText(showImg, matchRate, Point(maxLoc.x - , maxLoc.y - ), CV_FONT_HERSHEY_COMPLEX, , Scalar(, , ), );
rectangle(showImg, maxLoc, Point(maxLoc.x + templateImg.cols, maxLoc.y + templateImg.rows), Scalar(, , ), ); }
imshow("midImg", midImg);
imshow("resultImg", resultImg);
imshow("dst", showImg); waitKey();
}

opencv学习之路(21)、模板匹配及应用的更多相关文章
- opencv学习之路(28)、轮廓查找与绘制(七)——位置关系及轮廓匹配
一.点与轮廓的距离及位置关系 #include "opencv2/opencv.hpp" #include <iostream> using namespace std ...
- Python+OpenCV图像处理(九)—— 模板匹配
百度百科:模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题.它是图像处理中最基本.最常用的匹配方法.模板匹配具有自身的局限性, ...
- opencv学习之路(35)、SURF特征点提取与匹配(三)
一.简介 二.opencv中的SURF算法接口 三.特征点匹配方法 四.代码 1.特征点提取 #include "opencv2/opencv.hpp" #include < ...
- opencv学习之路(34)、SIFT特征匹配(二)
一.特征匹配简介 二.暴力匹配 1.nth_element筛选 #include "opencv2/opencv.hpp" #include <opencv2/nonfree ...
- 《opencv学习》 之 特征检测与匹配
这几天学习SURF特征检测,直接看的视频和书本有点吃不消,现在是基本看懂了,如果写博客记录没有必要,因为网上都差不多,笔记都在书上了,以下是个人认为比较浅显易懂的文章,当然海有很多好文章我没看到. 看 ...
- opencv学习之路(5)、鼠标和滑动条操作
一.鼠标事件 #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespa ...
- OpenCV 学习之路(2) -- 操作像素
本节内容: 访问像素值 用指针扫描图像 用迭代器扫描图像 编写高效的图像扫描循环 扫描图像并访问相邻像素 实现简单的图像运算 图像重映射 访问像素值 准备工作: 创建一个简单函数,用它在图像中加入椒盐 ...
- opencv学习之路【四】——opencv文件结构介绍
这里要感谢这篇博主的文章 部分内容转载自此 opencv在2.3版本之前 都是用的c语言实现的 而在2.3以后的版本 做了很多重大的改变 其中最主要的是用c++重写大部分结构 然后文件的结构和2.0之 ...
- Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练
在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...
随机推荐
- VS Code设置成中文界面
1.打开VS Code,按:ctrl+shift+p打开指令面板,输入lang,选择Configure Display Language 2.将"locale"后面的"e ...
- Go语言基础之变量和常量
Go语言基础之变量和常量 变量和常量是编程中必不可少的部分,也是很好理解的一部分. 标识符与关键字 标识符 在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名.常量名.函数名等等. Go语 ...
- php项目,别人无法访问自己(windows 系统)上Apache服务器原因(转载)
别人无法访问自己电脑上的Apache服务器,其中最大的原因是因为Windows防火墙的因素. 1.有安装防火墙的,把防火墙关闭 2.windows默认带防火墙的,进入 控制面板-系统和安全-Windo ...
- js设计模式(六)---组合模式
组合模式将对象组合成树形结构,以表示“部分-整体”的层次结构.除了用来表示树形结构之外,组合模式的另一个好处是通过对象的多态性表现,使得用户对单个对象和组合对象的使用具有一致性.基本图例 1.组合模式 ...
- [Luogu P1886]滑动窗口--单调队列入门
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- 关于springMVC的日志管理
主要是基于在spring aop特性. 1. 创建一个系统日志的操作类,类里面提供一个方法,可以向数据库或者表中写入:访问用户名,访问IP,操作时间,访问包名,具体函数名. /** * @Name S ...
- python->读写excel
from openpyxl import load_workbook#将一个excel文档中的数据存放内存中,即变量wb保存了该excel的所有信息wb = load_workbook(r" ...
- openshift 容器云从入门到崩溃之四《配置用户验证》
1.配置本地用户 之前安装的时候选择了htpasswd验证方式 先创建用户 # htpasswd -c /etc/origin/master/htpasswd admin 授权为集群管理员 # oc ...
- 11.c#类的成员初始化顺序
转自http://www.cnblogs.com/siceblue/archive/2009/01/15/1376430.html C#作为一种纯面向对象的话言,为它编写的整个代码里面到处都离不开对象 ...
- BN多卡同步进行
为什么不进行多卡同步? BatchNorm的实现都是只考虑了single gpu.也就是说BN使用的均值和标准差是单个gpu算的,相当于缩小了mini-batch size.至于为什么这样实现,1)因 ...