imgproc模組 模板匹配

2021-08-02 20:32:07 字數 3542 閱讀 3326

1.目的

(1)使用opencv函式matchtemplate()在輸入影象中搜尋影象塊

(2)使用opencv函式minmaxloc()尋找陣列中的最大或者最小值

2.原理

[1]模板匹配

給定乙個影象塊,搜尋配對的影象塊,當模板是矩形時候,並不一定所有的矩形塊內容都是相關的,在這種情況下,可以利用掩碼分離有用資訊。

[2]工作原理

輸入:原影象,模板

目標:尋找最高的匹配塊

搜尋:比較模板和原影象,通過滑動形式配對模板。

搜尋過程是從左到右,從上到下,逐個畫素畫素遍歷的過程,通過計算每一次滑動過程的配對效果的好壞確定最佳匹配模組,並將度量結果儲存在結果矩陣r中。矩陣r中的每乙個位置(x,y)包含了配對度量。

如上圖所示,紅色圓圈中的亮點區域表示匹配高的區域,黑色的矩形框框表示匹配區域,實際過程中,我們通過minmaxloc函式在結果矩陣r中尋找最佳匹配。

ps:如果使用掩碼,則需要輸入原影象,模板,掩碼。掩碼的維度必須和模板一致,並且擁有cv_8u和cv_32f的深度以及和模板具有相同通道數。cv_8u的掩碼必須是二進位制值,cv_32f則是在[0,1]之間的小數,掩碼和模板對應相乘,獲得經過掩碼操作的模板。現在只有cv_tm_sqdiff和cv_tm_ccorr_normed支援掩碼操作。

[3]配對方法

<1>method=cv_tm_sqdiff:平方差匹配法

<2>method=cv_tm_sqdiff_normed:歸一化平方差匹配法

<3>method=cv_tm_ccorr:相關匹配法

<4>method=cv_tm_ccorr_normed:歸一化相關匹配法

<5>method=cv_tm_ccoeff:相關係數匹配法

<6>method=cv_tm_ccoeff_normed:歸一化相關係數匹配法

3.部分**解釋

(1)minmaxloc

/*

minmaxloc引數解釋

result:輸入陣列

minval:陣列最小值

maxval:陣列最大值

minloc:陣列最小值所在位置

maxloc:陣列最大值所在位置

mat():掩碼,沒定義則為無掩碼操作

*/minmaxloc(result, &minval, &maxval, &minloc, &maxloc, mat());

(2)matchtemplate

matchtemplate引數解釋

img:輸入影象

templ:模板

result:匹配結果,儲存匹配過程中的度量值metric value

type:匹配方法

*/matchtemplate(img, templ, result, type);

4.完整**

(1)commoninclude.h

#ifndef common_include

#define common_include

#include

#include

#include

#include

using

namespace

std;

using

namespace cv;

#endif

(2)matching.cpp

#include"commoninclude.h"

/*配對方法0,1,2,3,4,5

*/int type = 0;

int num_type = 5;

mat img, templ, mask, result;

char windowresultname = "matched";

char windoworiginname = "origin";

void matching(int, void*)else

//繪製匹配的區域

rectangle(display_img, matchloc, point(matchloc.x+templ.cols, matchloc.y+templ.rows), scalar(0,0,0), 2, 8);

rectangle(result, matchloc, point(matchloc.x+templ.cols, matchloc.y+templ.rows), scalar(0,0,0), 2, 8);

imshow(windoworiginname, img);

imshow(windowresultname,display_img);

imshow("result", result);

}int main(int argc, char**argv)

img = imread(argv[1]);

templ = imread(argv[2]);

//mask = imread(argv[3]);

if(!img.data || !templ.data)

namedwindow(windowresultname, cv_window_autosize);

const

char* trackbar_label = "method: \n 0: sqdiff \n 1: sqdiff normed \n 2: tm ccorr \n 3: tm ccorr normed \n 4: tm coeff \n 5: tm coeff normed";

createtrackbar(trackbar_label, windowresultname,&type, num_type, matching);

matching(0,0);

waitkey(0);

return(0);

}

參考文獻1.

imgproc模組 Remapping重對映

1.目的 1 如何使用opencv函式remap實現簡單的重對映 2.原理 把乙個影象中乙個位置的畫素放置到另乙個指定位置的過程,為了完成對映過程,有必要獲得一些插值為非整數畫素座標,因為源影象與目標影象的畫素座標不是一一對應的。我們通過重對映來表達每個畫素的位置 x,y g x,y f h x,y...

imgproc模組 Laplace邊緣檢測運算元

1.目的 1 如何使用opencv函式laplacian實現laplacian運算元的離散模擬 2.原理 在一階導數的極值位置,二階導數為0。所以我們也可以用這個特點來作為檢測影象邊緣的方法。laplacian運算元的定義 opencv函式 laplacian 實現了laplacian運算元。實際上...

imgproc模組 霍夫圓變換

1.目的 1 如何使用opencv的houghcircles在影象中檢測圓區域 2.原理 1 標準霍夫變換 霍夫圓變換可以根據霍夫線變換來實現 通過極座標來表示圓 a,b 表示圓心,r表示半徑,則圓表示為 x a rcos y b rsin 的值為0 360 一開始我們假設r是已知的,那麼我們就可以...