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 函数实现 ...
随机推荐
- 数据库锁机制(一)——概述
注:内容为自己的推理认知+网络,如有错误和不合理之处,敬请指出. 在多线程环境中我用使用线程锁处理并发问题,而在数据库系统中,并发问题可以细化到事务级别,而DBMS对此的处理方案就是使用锁. 为了适应 ...
- PhoneGap 安装体验
npm -v #显示版本,检查npm 是否正确安装. npm install express #安装express模块 npm install -g express #加上 -g 启用global安装 ...
- UVA 11396 Claw Decomposition(二分图)
以“爪”形为单元,问所给出的无向图中能否被完全分割成一个个单元. 分析图的性质,由于已知每个点的度是3,所以“爪”之间是相互交错的,即把一个“爪”分为中心点和边缘点,中心点被完全占据,而边缘点被三个“ ...
- BZOJ 3166 Alo
处理出每个数最靠近它的左右两个比它大的数. 然后可持久化trie. #include<iostream> #include<cstdio> #include<cstrin ...
- Android PRODUCT_COPY_FILES 自动拷贝文件
/********************************************************************** * Android PRODUCT_COPY_FILES ...
- UVA 658 It's not a Bug, it's a Feature! (最短路,经典)
题意:有n个bug,有m个补丁,每个补丁有一定的要求(比如某个bug必须存在,某个必须不存在,某些无所谓等等),打完出来后bug还可能变多了呢.但是打补丁是需要时间的,每个补丁耗时不同,那么问题来了: ...
- Oracle 课程八之跟踪事件set event
一.Oracle跟踪文件 Oracle跟踪文件分为三种类型: 一种是后台报警日志文件,记录数据库在启动.关闭和运行期间后台进程的活动情况,如表空间创建.回滚段创建.某些alter命令.日志切换.错误消 ...
- ASP.NET 经典60道面试题
转:http://bbs.chinaunix.net/thread-4065577-1-1.html ASP.NET 经典60道面试题 1. 简述 private. protected. public ...
- shell小技巧
# awk '{a[$1]++;a[$2]++}END{for (i in a)print i "\t" a[i]}' list | grep -w 2 | awk '{print ...
- Android UI详解之Fragment加载
使用Fragment的原因: 1. Activity间的切换不流畅 2. 模块化Activity,方便做局部动画(有时为了到达这一点要把多个布局放到一个activity里面,现在可以用多Fragmen ...