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算法的原理很多资 ...
随机推荐
- ASP.NET MVC+Vue.js实现联系人管理
接触了一天vue.js,简单浏览了一本关于vue的电子书,就开始动手使用ASP.NET MVC和Vue.js开发一个联系人管理的小程序. 先看一下这个联系人管理的小程序的界面,也就是我们大概要实现什么 ...
- K XOR Clique
BaoBao has a sequence a1,a2,...,an. He would like to find a subset S of {1,2,...,n} such that ∀i ...
- [LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串
Given a string, find the length of the longest substring without repeating characters. Example 1: In ...
- 查看集成环境 phpstudy 中 mysql 版本号
1. 打开面板 2.其他选项菜单 3. Mysql工具 4. mysql命令行 5.输入密码,回车.phpstudy mysql默认 root 6.运行 select version();
- Web 端自动化测试
一.环境搭建 准备工具如下:下载 python[python 开发环境](http://python.org/getit/) 下载setuptools: [python 的基础包工具](http:// ...
- Python学习之旅(三十六)
Python基础知识(35):电子邮件(Ⅱ) 收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上 收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3 Pytho ...
- 如果报错,使用 journalctl -f -t etcd 和 journalctl -u etcd 来定位问题。
如果报错,使用 journalctl -f -t etcd 和 journalctl -u etcd 来定位问题.
- 关于0x3f3f3f3f
发现有人把无穷大设成0x3f3f3f3f,好像还真不是随便设的. 0x3f3f3f3f比10^9大一点,比一般数据范围大: 乘2之后比2147483467小,满足正无穷加正无穷还是正无穷: 每个字节都 ...
- 01day
01 cpu 内存 硬盘 操作系统 CPU:中央处理器,相当于人大脑. (运行速度飞机) 内存:临时存储数据. 8g,16g, (高铁) 1,成本高. 2,断电即消 ...
- Mybatis 使用了哪些设计模式?
https://mp.weixin.qq.com/s/ZTh4a-YST5RdIipHykWpPQ