模板匹配opencv

2021-08-13 15:37:15 字數 3033 閱讀 4614

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

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

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

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

其實模板匹配實現的思想也是很簡單很暴力的,就是拿著模板(姚明頭像)在原圖(全明星照)中從左上至右下依次滑動,直到遇到某個區域的相似度低於我們設定的閾值,那麼我們就認為該區域與模板匹配了,也就是我們找到了姚明的位置,並把它標記出來。

opencv中是通過mtachtemplate函式完成。

#include

#include

#include

#include

#include

using

namespace

std;

using

namespace cv;

intmain

()

結果看來,大姚的頭像位置確實被綠框標記出來了!很準!

我還在程式中特意列印出匹配度的最小值,因為我們知道這個演算法是數值越小匹配度越高,由輸出的結果看來這個數值還真的很小,說明匹配度真的相當高!

既然我們可以取得匹配度的數值,那我們是不是也可以利用該數值進行閾值對比呢?比如我想把在閾值範圍之內的頭像都標記出來。可以這麼做:

//閾值判別,小於0.01才認為匹配成功,才將頭像框出來

if (minval < 0.001)

同理,如果是數值越大表明匹配度越大的演算法,就使用maxval來對比就可以了。

上面的模板匹配我們使用了標準平方差匹配 cv_tm_sqdiff_normed演算法,看起來效果還不錯,那還有其他演算法嗎?

問得好。opencv通過函式 matchtemplate 實現了模板匹配演算法。可用的方法有6個:

通常,隨著從簡單的測量(平方差)到更複雜的測量(相關係數),我們可獲得越來越準確的匹配(同時也意味著越來越大的計算代價)。

最好的辦法是對所有這些設定多做一些測試實驗,以便為自己的應用選擇同時兼顧速度和精度的最佳方案。

你想採用哪種演算法,只需要將對應的傳進函式matchtemplate裡就可以了。

下面給出利用trackbar顯示出多種模板那匹配演算法的**。

#include

#include

#include

#include

using

namespace cv;

using

namespace

std;

mat g_srcimage, g_tempalteimage, g_resultimage;

int g_nmatchmethod;

int g_nmaxtrackbarnum = 5;

void

on_matching

(int, void*)

else

rectangle(srcimage, matchlocation, point(matchlocation.x + g_tempalteimage.cols, matchlocation.y + g_tempalteimage.rows), scalar(0, 0, 255), 2, 8, 0);

rectangle(g_resultimage, matchlocation, point(matchlocation.x + g_tempalteimage.cols, matchlocation.y + g_tempalteimage.rows), scalar(0, 0, 255), 2, 8, 0);

imshow("原始圖", srcimage);

imshow("效果圖", g_resultimage);

}int

main

() g_tempalteimage = imread("76.png");

if (!g_tempalteimage.data)

namedwindow("原始圖", cv_window_autosize);

namedwindow("效果圖", cv_window_autosize);

createtrackbar("方法", "原始圖", &g_nmatchmethod, g_nmaxtrackbarnum, on_matching);

當然也會有一些演算法匹配失敗的.

實驗證明,該段程式效果很不錯,但注意的是,模板配在原圖摳出模板圖的形式下準確率才比較高,不然的話可能準確度就不太高了。

那麼模板匹配能在哪些專案有應用呢?我說一下我的經驗。

最近我在參與實驗室的乙個專案,做的是發票的分類,分類的方法我首先採用的是模板匹配,也就是從一類發票中摳出一些特徵區域,以此作為模板,自己設定閾值,低於閾值就是算是跟該類發票匹配了,就可以 對其進行分類。在我的測試看來,準確率還可以,不過也隱藏這乙個比較大的隱患就是,一旦發票種類多了,比如100種,那麼檢測時間就會指數上公升,這是不可取的。

OpenCV模板匹配

include include opencv2 opencv.hpp using namespace std using namespace cv int main int argc,char argv load reference image img imread argv 1 always ch...

opencv模板匹配

模板匹配是一種用於在源影象s中尋找定位給定目標影象t 即模板影象 的技術。其原理很簡單,就是通過一些相似度準則來衡量兩個影象塊之間的相似度similarity s,t 2.用途 模板匹配方法常用於一些平面影象處理中,例如印刷中的數字 工業零器件等小尺寸目標影象識別分類。3.方法 模板匹配中,源影象和...

opencv 模板匹配

模板匹配的工作方式 模板匹配的工作方式跟直方圖的反向投影基本一樣,大致過程是這樣的 通過在輸入影象上滑 像塊對實際的影象塊和輸入影象進行匹配。假設我們有一張100x100的輸入影象,有一張10x10的模板影象,查詢的過程是這樣的 1 從輸入影象的左上角 0,0 開始,切割一塊 0,0 至 10,10...