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