opencv 模板匹配与滑动窗口(单匹配) (多匹配)
1单匹配:
测试图片:
code:
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h> /*
模板匹配法 --图片查找
滑动窗口的原理
用等大小的模板窗口在范围中进行滑动 然后查找匹配
*/ int main(int argc, char* argv[]){ IplImage*src,*templat,*result,*show;
int srcW,templatW,srcH,templatH,resultW,resultH;
//加载源图像
src = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png" , CV_LOAD_IMAGE_GRAYSCALE); //用于显示结果
show = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png"); //加载模板图像
templat = cvLoadImage("C:\\Users\\zxl\\Desktop\\1.png" , CV_LOAD_IMAGE_GRAYSCALE); if(!src || !templat){
printf("打开图片失败");
return 0;
} srcW = src->width;
srcH = src->height; templatW = templat->width;
templatH = templat->height; if(srcW<templatW || srcH<templatH){
printf("模板不能比原图小");
return 0;
} //计算结果矩阵的大小
resultW = srcW - templatW + 1;
resultH = srcH - templatH + 1; //创建存放结果的空间
result = cvCreateImage(cvSize(resultW,resultH),32,1); double minVal,maxVal;
CvPoint minLoc,maxLoc; //调用模板匹配函数
cvMatchTemplate(src,templat,result,CV_TM_SQDIFF); //查找最相似的值及其所在坐标
cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL); printf("minVal %f maxVal %f\n ",minVal,maxVal); //绘制结果
cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1); //显示结果
cvNamedWindow("show");
cvNamedWindow("tem");
cvShowImage("show",show);
cvShowImage("tem" , templat);
cvWaitKey(0); return 0; }
2多匹配:
code:
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h> /*
模板匹配法 --图片查找
滑动窗口的原理
用等大小的模板窗口在范围中进行滑动 然后查找匹配
*/ CvPoint getNextMinLoc(IplImage* result , int templatWidth,int templatHeight,double maxValIn , CvPoint lastLoc){ int y,x;
int startY,startX,endY,endX; //计算大矩形的左上角坐标
startY = lastLoc.y - templatHeight;
startX = lastLoc.x - templatWidth; //计算大矩形的右下角的坐标 大矩形的定义 可以看视频的演示
endY = lastLoc.y + templatHeight;
endX = lastLoc.x + templatWidth; //不允许矩形越界
startY = startY < 0 ? 0 : startY;
startX = startX < 0 ? 0 : startX;
endY = endY > result->height-1 ? result->height-1 : endY;
endX = endX > result->width - 1 ? result->width - 1 : endX; //将大矩形内部 赋值为最大值 使得 以后找的最小值 不会位于该区域 避免找到重叠的目标
for(y=startY;y<endY;y++){
for(x=startX;x<endX;x++){
cvSetReal2D(result,y,x,maxValIn);
}
} double minVal,maxVal;
CvPoint minLoc,maxLoc; //查找result中的最小值 及其所在坐标
cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL); return minLoc; } int main(int argc, char* argv[]){ IplImage*src,*templat,*result,*show;
int srcW,templatW,srcH,templatH,resultW,resultH; //加载源图像
src = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png" , CV_LOAD_IMAGE_GRAYSCALE); //加载用于显示结果的图像
show = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.png"); //加载模板图像
templat = cvLoadImage("C:\\Users\\zxl\\Desktop\\1.png" , CV_LOAD_IMAGE_GRAYSCALE); if(!src || !templat){
printf("打开图片失败");
return 0;
} srcW = src->width;
srcH = src->height; templatW = templat->width;
templatH = templat->height; if(srcW<templatW || srcH<templatH){
printf("模板不能比原图小");
return 0;
} //计算结果矩阵的宽度和高度
resultW = srcW - templatW + 1;
resultH = srcH - templatH + 1; //创建存放结果的空间
result = cvCreateImage(cvSize(resultW,resultH),32,1); double minVal,maxVal;
CvPoint minLoc,maxLoc; //进行模板匹配
cvMatchTemplate(src,templat,result,CV_TM_SQDIFF); //第一次查找最小值 即找到第一个最像的目标
cvMinMaxLoc(result,&minVal,&maxVal,&minLoc,&maxLoc,NULL);
//绘制第一个查找结果到图像上
cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1); //查找第二个结果
minLoc = getNextMinLoc( result , templat->width,templat->height, maxVal , minLoc);
//绘制第二个结果
cvRectangle(show,minLoc,cvPoint(minLoc.x+templat->width,minLoc.y+templat->height),CV_RGB(0,255,0),1); //显示结果
cvNamedWindow("show");
cvShowImage("show",show);
cvWaitKey(0); return 0;
}
opencv 模板匹配与滑动窗口(单匹配) (多匹配)的更多相关文章
- python opencv3 FLANN单应性匹配
git:https://github.com/linyi0604/Computer-Vision 匹配准确率非常高. 单应性指的是图像在投影发生了 畸变后仍然能够有较高的检测和匹配准确率 # codi ...
- LeetCode 滑动窗口题型整理
一.滑动窗口题型模板 /* * 滑动窗口类型: 模板 */ public List<Integer> slideWindowMode(String s, String t) { // 1 ...
- 滑动窗口(Sliding Window)技巧总结
什么是滑动窗口(Sliding Window) The Sliding Problem contains a sliding window which is a sub – list that run ...
- Atitit opencv模板匹配attilax总结
Atitit opencv模板匹配attilax总结 找一幅图像的匹配的模板,可以在一段视频里寻找出我们感兴趣的东西,比如条形码的识别就可能需要这样类似的一个工作提取出条形码区域(当然这样的方法并不鲁 ...
- OpenCV——模板匹配
minMaxLoc函数: void minMaxLoc( const Mat& src, double* minVal, double* maxVal=0, Point* minLoc=0, ...
- Atitit opencv 模板匹配
Atitit opencv 模板匹配 1.1. 图片1 1.2. Atitit opencv 模板匹配 6中匹配算法貌似效果区别不大1 1.3. 对模板缩放的影响 一般的缩放可以,太大了就歇菜了.. ...
- SpringCloud系列九:SpringCloudConfig 基础配置(SpringCloudConfig 的基本概念、配置 SpringCloudConfig 服务端、抓取配置文件信息、客户端使用 SpringCloudConfig 进行配置、单仓库目录匹配、应用仓库自动选择、仓库匹配模式)
1.概念:SpringCloudConfig 基础配置 2.具体内容 通过名词就可以发现,SpringCloudConfig 核心作用一定就在于进行配置文件的管理上.也就是说为了更好的进行所有微服务的 ...
- 关于双端队列 deque 模板 && 滑动窗口 (自出)
嗯... deque 即为双端队列,是c++语言中STL库中提供的一个东西,其功能比队列更强大,可以从队列的头与尾进行操作... 但是它的操作与队列十分相似,详见代码1: 1 #include < ...
- 图像滑动窗口 利用opencv和matlab
1.利用opencv实现图像滑动窗口操作 功能:利用opencv实现图像滑动窗口操作(即利用已知尺寸的窗口遍历整幅图像,形成许多子图像) vs2015+opencv3.1 2016.10 函数实现 ...
随机推荐
- 二维树状数组(水题) POJ1195
前段时间遇到线段树过不了,树状数组却过了的题.(其实线段树过得了的) 回忆了下树状数组. 主要原理,还是二进制位数,每一项的和表示其为它的前((最后一位1及其后)的二进制数)和,可从二进制图来看.(用 ...
- Akka的Actor模型及使用实例
本文的绝大部分内容转载自rerun.me这一blog,老外写的东西就是好啊. ACTORS介绍 Anyone who has done multithreading in the past won't ...
- bzoj1054: [HAOI2008]移动玩具
hash+bfs:要注意特殊情况.(似乎连sort.lower_bound都不用数据小直接判重了... #include<cstdio> #include<cstring> # ...
- 移动APP服务端API设计应该考虑到的问题
2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站那样所取代, 不但如此,越来越多的传统应用.网站也都开始制作自己的移动APP,也就是我们常说的IOS客户端.android客户端. ...
- oracle 回收站管理
oracle10g,在pl/sql中选中删除后会出现类似:BIN$nJ5JuP9cQmqPaArFei384g==$0的表. 1.查看回收站 select * from user_recyclebin ...
- Vim学习总结
Vim 目前还没感觉到比在Mac下使用Sublime Text高效到哪 安装 sudo apt-get install vim 常用配置 在Linux环境下Vim的初始化配置文件为.vimrc,通常有 ...
- Android 使用Instrumentation进行界面的单元测试
如果我们要对一个Activity界面上的一个按钮的点击事件进行单元测试,则可使用ActivityInstrumentationTestCase2类来进行测试. 首先我们定义一个测试类: public ...
- OracleBulkCopy的批量数据导入
private void button1_Click(object sender, EventArgs e) { OpenFileDialog afd = new OpenFileDialog(); ...
- SQL Server 高性能写入的一些总结(转)
1.1.1 摘要 在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起这一问题原因可以很多,有可能是代码不够高效.有可能是硬件或网络问题,也有可能是数据库设计的问题. 本篇博文将针对一些常用的数据库性 ...
- maven学习系列教程,第一课(web项目的搭建)
1.现在一般eclipse都已经装好了maven板块,无需自行下载安装,所以我们的第一步就是新建一个maven project 2地址使用默认的就行 3这边筛选一下,选择webapp 4. 5.建好后 ...