一、模板匹配概念

二、单模板匹配

 #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)、模板匹配及应用的更多相关文章

  1. opencv学习之路(28)、轮廓查找与绘制(七)——位置关系及轮廓匹配

    一.点与轮廓的距离及位置关系 #include "opencv2/opencv.hpp" #include <iostream> using namespace std ...

  2. Python+OpenCV图像处理(九)—— 模板匹配

    百度百科:模板匹配是一种最原始.最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配问题.它是图像处理中最基本.最常用的匹配方法.模板匹配具有自身的局限性, ...

  3. opencv学习之路(35)、SURF特征点提取与匹配(三)

    一.简介 二.opencv中的SURF算法接口 三.特征点匹配方法 四.代码 1.特征点提取 #include "opencv2/opencv.hpp" #include < ...

  4. opencv学习之路(34)、SIFT特征匹配(二)

    一.特征匹配简介 二.暴力匹配 1.nth_element筛选 #include "opencv2/opencv.hpp" #include <opencv2/nonfree ...

  5. 《opencv学习》 之 特征检测与匹配

    这几天学习SURF特征检测,直接看的视频和书本有点吃不消,现在是基本看懂了,如果写博客记录没有必要,因为网上都差不多,笔记都在书上了,以下是个人认为比较浅显易懂的文章,当然海有很多好文章我没看到. 看 ...

  6. opencv学习之路(5)、鼠标和滑动条操作

    一.鼠标事件 #include<opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespa ...

  7. OpenCV 学习之路(2) -- 操作像素

    本节内容: 访问像素值 用指针扫描图像 用迭代器扫描图像 编写高效的图像扫描循环 扫描图像并访问相邻像素 实现简单的图像运算 图像重映射 访问像素值 准备工作: 创建一个简单函数,用它在图像中加入椒盐 ...

  8. opencv学习之路【四】——opencv文件结构介绍

    这里要感谢这篇博主的文章 部分内容转载自此 opencv在2.3版本之前 都是用的c语言实现的 而在2.3以后的版本 做了很多重大的改变 其中最主要的是用c++重写大部分结构 然后文件的结构和2.0之 ...

  9. Opencv学习之路—Opencv下基于HOG特征的KNN算法分类训练

    在计算机视觉研究当中,HOG算法和LBP算法算是基础算法,但是却十分重要.后期很多图像特征提取的算法都是基于HOG和LBP,所以了解和掌握HOG,是学习计算机视觉的前提和基础. HOG算法的原理很多资 ...

随机推荐

  1. Spark连接MongoDB之Scala

    MongoDB Connector for Spark Spark Connector Scala Guide spark-shell --jars "mongo-spark-connect ...

  2. Q - Girls and Boys

    来源poj1068 In the second year of the university somebody started a study on the romantic relations be ...

  3. windows服务安装 System.IO.FileLoadException

    报错如下: System.IO.FileLoadException: 未能加载文件或程序集“file:///D:\WindowsService\bin\Debug\WindowsService.exe ...

  4. PHP合并数组及去重

    本文介绍的是一维数组的去重 合并数组的方法 array_merge: 数字键,直接往后添加,key重置 字符串键,后面的数组的值会替代前面的值 +: 数字键,后面的数组的值不会替代前面的值 字符串键, ...

  5. php 判断手机号 和 手机号中间四位以**** 代替

    代码: //自定义函数手机号隐藏中间四位 function get_phone($str){ $str=$str; $resstr=substr_replace($str,'****',3,4); r ...

  6. shell 脚本的编写

    创建一个shell文件 1. 创建一个.sh文件 2. 文件第一行声明shell编译器路径  #!/bin/bash 3. 修改文件权限 chmod 777 文件名    或  /bin/bash  ...

  7. python全栈开发 * 08知识点汇总 * 180608

    08知识点梳理 文件操作一 .文件操作 r (只读)1.r (读) rb(字节)f=open("果蔬大杂烩",mode="r",encoding="U ...

  8. redash学习记录

    一.简介 一款开源的 BI 工具Redash 二.参考资料 一款开源的 BI 工具Redash 浅析数据查询与可视化工具--Redash

  9. Codeforces 1090A - Company Merging - [签到水题][2018-2019 Russia Open High School Programming Contest Problem A]

    题目链接:https://codeforces.com/contest/1090/problem/A A conglomerate consists of n companies. To make m ...

  10. spring和springboot

    Spring四大原则: 1.使用POJO进行轻量级和最小侵入式开发 2.通过依赖注入和基于接口编程实现松耦合 3,.通过AOP和默认习惯进行声明式编程 4.使用AOP和模版template减少模式化代 ...