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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM