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;
}
