OPENCV3 模版匹配

2021-08-20 11:12:54 字數 4286 閱讀 6283

一、引言

模板匹配的作用在影象識別領域作用可大了。那什麼是模板匹配?

模板匹配,就是在一幅影象中尋找另一幅模板影象最匹配(也就是最相似)的部分的技術。

說的有點抽象,下面給個例子說明就很明白了。

在上面這幅全明星照中,我們想找出姚明頭像的位置,並把它標記出來,可以做到嗎?

可以,這就是模板匹配的要做的事情。

其實模板匹配實現的思想也是很簡單很暴力的,就是拿著模板(姚明頭像)在原圖(全明星照)中從左上至右下依次滑動,直到遇到某個區域的和模版非常相似,那麼我們就認為該區域與模板匹配了。

二:用於模版匹配的函式

void matchtemplate( inputarray image,inputarray templ, outputarray result, int method, inputarray mask = noarray() );
@param image:搜尋物件影象 it must be 8-bit or 32-bit floating-point.

@param templ:模版,和image具有相同的資料型別,並且小於image

@param result:比較結果,必須是單通單32位浮點數

@param method:匹配方法,總共有六種,下面先貼上原始碼說明

@param mask:和templ具有相同的資料型別和大小,預設不設定

//! type of the template matching operation

enum templatematchmodes (t(x',y')-i(x+x',y+y'))^2\f]

tm_sqdiff_normed = 1, //!< \f[r(x,y)= \frac (t(x',y')-i(x+x',y+y'))^2}t(x',y')^2 \cdot \sum_ i(x+x',y+y')^2}}\f]

tm_ccorr = 2, //!< \f[r(x,y)= \sum _ (t(x',y') \cdot i(x+x',y+y'))\f]

tm_ccorr_normed = 3, //!< \f[r(x,y)= \frac (t(x',y') \cdot i(x+x',y+y'))}t(x',y')^2 \cdot \sum_ i(x+x',y+y')^2}}\f]

tm_ccoeff = 4, //!< \f[r(x,y)= \sum _ (t'(x',y') \cdot i'(x+x',y+y'))\f]

//!< where

//!< \f[\begin t'(x',y')=t(x',y') - 1/(w \cdot h) \cdot \sum _ t(x'',y'') \\ i'(x+x',y+y')=i(x+x',y+y') - 1/(w \cdot h) \cdot \sum _ i(x+x'',y+y'') \end\f]

tm_ccoeff_normed = 5 //!< \f[r(x,y)= \frac (t'(x',y') \cdot i'(x+x',y+y')) }t'(x',y')^2 \cdot \sum_ i'(x+x',y+y')^2} }\f]

};

cv_tm_sqdiff 平方差匹配法:該方法採用平方差來進行匹配;最好的匹配值為0;匹配越差,匹配值越大。

(尾部帶有normed的是歸一化的方法,目的是為了減小光線 的影響)

cv_tm_sqdiff_normed 歸一化平方差匹配法

cv_tm_ccorr_normed 歸一化相關匹配法

cv_tm_ccoeff_normed 歸一化相關係數匹配法

三:模板匹配的工作方式:

大致過程是這樣的:通過在輸入影象image上滑**像塊,對實際的影象塊和模板影象templ進行匹配。 

假設我們有一張100x100的輸入影象image,有一張10x10的模板影象templ,查詢的過程是這樣的: 

(1)從輸入影象image的左上角(0,0)開始,切割一塊(0,0)至(10,10)的臨時影象; 

(2)用臨時影象和模板影象templ進行對比,對比結果記為c,儲存在結果影象result的(0,0)處,即result在(0,0)處的畫素值; 

(3)向右滑動切割影象塊,重複(1)~(2)的步驟,並記錄到結果影象result中;直到輸入影象image的右下角。 

可以看出,如果原圖的尺寸為w*h,模版的尺寸為w*h,那麼result的尺寸為(w-w+1)*(h-h+1)

可見,直方圖反向投影對比的是直方圖,而模板匹配對比的是影象的畫素值;模板匹配比直方圖反向投影速度要快一些,但是有人認為直方圖反向投影的魯棒性會更好。

既然 result儲存了匹配結果,那麼我們如何通過result來獲得最佳匹配區域呢?這就來了opencv中定位極值的函式:

void minmaxloc(inputarray src, cv_out double* minval,

cv_out double* maxval = 0, cv_out point* minloc = 0,

cv_out point* maxloc = 0, inputarray mask = noarray());

@param src input single-channel array.輸入的原影象,單通道

@param minval pointer to the returned minimum value; null is used if not required. 返回最小值的指標,不需要設定為null即可

@param maxval pointer to the returned maximum value; null is used if not required.返回最大值的指標,不需要設定為null即可

@param minloc pointer to the returned minimum location (in 2d case); null is used if not required.返回最小值的位置的指標,不需要設定為null

@param maxloc pointer to the returned maximum location (in 2d case); null is used if not required.返回最大值的位置的指標,不需要設定為null

@param mask optional mask used to select a sub-array.

簡要說明: 

(1)minmaxloc尋找矩陣src中最小值minval及其位置minloc;最大值maxval及其位置maxloc。 

(2)以上引數,若不需要求解,可置為null即可。 

(3)引數mask不曉得用法,可以忽略不管。

minmaxloc(result,&min_val,&max_val,&min_loc,&max_loc); 從result中提取最大值以及最大值的位置(即在result中該最大值max_val的座標位置max_loc,即模板滑行時左上角的 座標,類似於圖中的座標(x,y)。)

由此得到:rect=cvrect(max_loc.x,max_loc.y,tmp->width,tmp->height);rect表示的矩形區域即是最佳的匹配區域。

四、範例(部分**)

imshow("模版", dst);

/******************確保模板大小小於roi********************/

opencv3程式設計入門

今天進行了簡單的影象修補 影象修補.cpp 先對影象進行破壞,然後進行修補 include stdafx.h include include include includeusing namespace std using namespace cv define win name1 原始圖 defi...

OpenCV3學習總結

影象處理技術一般包括影象壓縮,增強和復原,匹配 描述和識別3個部分。影象處理和計算機視覺的區別在於 影象處理側重於 處理 影象 如增強 還原 去噪 分割等 而計算機視覺重點在於使用計算機來模擬人的視覺。opencv由一系列c函式和c 類構成,擁有包括500多個c函式的跨平台的中高層api。openc...

OpenCV 3 的改動在哪?

本文原版是譯作 opencv 2 計算機視覺程式設計手冊 的附錄,經過刪減後在專欄中刊登。opencv 3 就要正式發布了,但是很多讀者還在用 opencv 2,甚至 opencv 1。你們一定想知道,是否有必要公升級到 3,以及如何提前進行準備。cmake 包含生成工程專案時 cmake 的依賴檔...