opencv——模板匹配

<p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">模板匹配是通過在輸入圖像上滑動模板圖像塊對實際的圖像塊和輸入圖像進行匹配,<span style="color: rgb(255, 0, 0);">應用場景:比如要在一堆圖像中尋找指定人臉,就可以利用此算法在圖像中找到此人臉的最佳匹配,確定相似度。</span>並且可以利用函數cvMinMaxLoc()找到最佳匹配的位置。對於特定的應用來說,如視頻中應用自動部分檢測或跟蹤(視頻中的車牌識別),可以試試所有這些方法,找到最合適的method,這裏要考慮算法的性能。</p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">-----------------------------------------------------------------------------------------------</p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><h3 style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px;">MatchTemplate</h3><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;"></p><p style="margin-top: 0px; margin-bottom: 0px; padding-top: 0px; padding-bottom: 0px; font-family: Arial; font-size: 14px; line-height: 26px;">比較模板和重疊的圖像區域</p><pre style="white-space: pre-wrap; word-wrap: break-word; font-size: 14px; line-height: 26px; background-color: rgb(255, 255, 255);">void cvMatchTemplate( const CvArr* image, const CvArr* templ,
                      CvArr* result, int method );
image
欲搜索的圖像。它應該是單通道、8-比特或32-比特 浮點數圖像
templ
搜索模板,不能大於輸入圖像,且與輸入圖像具有一樣的數據類型
result
比較結果的映射圖像。單通道、32-比特浮點數. 如果圖像是 W×H 而 templ 是 w×h ,則 result 一定是 (W-w+1)×(H-h+1).
method
指定匹配方法:

函數 cvMatchTemplate 與函數 cvCalcBackProjectPatch 類似。它滑動過整個圖像 image, 用指定方法比較 templ 與圖像尺寸爲 w×h 的重疊區域,並且將比較結果存到 result 中。 下面是不同的比較方法,可以使用其中的一種 (I 表示圖像,T - 模板, R - 結果. 模板與圖像重疊區域 x'=0..w-1, y'=0..h-1 之間求和): 


-----------------------------------------------------------------------------------------------




#include <opencv2\opencv.hpp>
#include <stdio.h>

int main(int argc,char arg[])
{
	//讀取源圖像
IplImage *s = cvLoadImage("2.jpg");
IplImage *src = cvCreateImage(cvGetSize(s),8,1);
    //讀取模板圖像
IplImage *temp = cvLoadImage("6.jpg");
IplImage *temp1 = cvCreateImage(cvGetSize(temp),8,1);
   //分別轉換源圖像和模板圖像
cvCvtColor(s,src,CV_RGB2GRAY);
cvCvtColor(temp,temp1,CV_RGB2GRAY);
  // 創建圖像數組
IplImage *ftmp[6];
int i;
int iwidth = src->width-temp1->width+1;
int iheight = src->height-temp1->height+1;
for ( i = 0 ;i<6;++i)
{
	//令圖像數組的圖像大小爲源圖像的大小-模板圖像
ftmp[i] = cvCreateImage(cvSize(iwidth,iheight),32,1);
//模板匹配,
//分別將各種方式的匹配結果放入數組中
cvMatchTemplate(src,temp1,ftmp[i],i);
//cvNormalize的使用使結果具有一致性,
//CV_MINMAX標誌告訴函數對浮點圖像進行平移和縮放,使得所有返回結果都在0到1之間
cvNormalize(ftmp[i],ftmp[i],1,0,CV_MINMAX);
}

//顯示結果
cvNamedWindow("Template",0);
cvShowImage("Template",temp1);
cvNamedWindow("Image",0);
cvShowImage("Image",src);
cvNamedWindow("1",0);
cvShowImage("1",ftmp[0]);
cvNamedWindow("2",0);
cvShowImage("2",ftmp[1]);
cvNamedWindow("3",0);
cvShowImage("3",ftmp[2]);
cvNamedWindow("4",0);
cvShowImage("4",ftmp[3]);
cvNamedWindow("5",0);
cvShowImage("5",ftmp[4]);
cvNamedWindow("6",0);
cvShowImage("6",ftmp[5]);

cvWaitKey(0);
//釋放圖像和消除窗口
cvReleaseImage(&temp1);
cvDestroyWindow("Template");
cvReleaseImage(&src);
cvDestroyWindow("Image");
cvReleaseImage(&ftmp[0]);
cvDestroyWindow("1");
cvReleaseImage(&ftmp[1]);
cvDestroyWindow("2");
cvReleaseImage(&ftmp[2]);
cvDestroyWindow("3");
cvReleaseImage(&ftmp[3]);
cvDestroyWindow("4");
cvReleaseImage(&ftmp[4]);
cvDestroyWindow("5");
cvReleaseImage(&ftmp[5]);
cvDestroyWindow("6");
return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章