opencv?C++模板匹配的簡單實(shí)現(xiàn)
一 簡單實(shí)現(xiàn)
#include <opencv2/opencv.hpp> #include<iostream> using namespace cv; using namespace std; int main() { Mat img = imread("52.jpg"); Mat templ = imread("templ.jpg"); Mat result; matchTemplate(img,templ,result,TM_CCOEFF_NORMED);//原圖,模板,匹配方法 double maxVal, minVal; Point maxLoc, minLoc; //尋找最大值,最小值 minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc); //繪制矩形,矩形的左上角是最大值的位置,右下角是在最大值上加上模板的行寬和和列高 rectangle(img,Point(maxLoc.x,maxLoc.y),Point(maxLoc.x+templ.cols,maxLoc.y+templ.rows),Scalar(0,0,255),2);//顏色紅色,粗度2 imshow("原圖", img); imshow("模板",templ); imshow("result",result); waitKey(0); return 0; }
結(jié)果如下,分別是模板圖,原圖(找到了與模板匹配的部分,并矩形框標(biāo)記,結(jié)果圖,暫時(shí)覺得有點(diǎn)問題的 )
二 函數(shù)及原理講解
1 matchTemplate()參數(shù)詳解
matchTemplate( InputArray image, InputArray templ,OutputArray result, int method );
image:待匹配的源圖像
templ:模板圖像
result:保存結(jié)果的矩陣,我們可以通過minMaxLoc() 確定結(jié)果矩陣的最大值和最小值的位置.
method :模板匹配的算法 有以下六種: enum { TM_SQDIFF=0, TM_SQDIFF_NORMED=1, TM_CCORR=2, TM_CCORR_NORMED=3, TM_CCOEFF=4, TM_CCOEFF_NORMED=5 };
TM_SQDIFF,TM_SQDIFF_NORMED匹配數(shù)值越低表示匹配效果越好,其它四種反之。
TM_SQDIFF_NORMED,TM_CCORR_NORMED,TM_CCOEFF_NORMED是標(biāo)準(zhǔn)化的匹配,得到的最大值,最小值范圍在0~1之間,其它則需要自己對結(jié)果矩陣歸一化。
不同的方法會得到差異很大的結(jié)果,可以通過測試選擇最合適的方法。
cv::TM_SQDIFF 判斷 minVal 越小,效果越好
計(jì)算模板與目標(biāo)圖像的方差,由于是像素值差值的平方的和,所以值越小匹配程度越高;
cv::TM_SQDIFF_NORMED 判斷 minVal 越接近0,效果越好
范化的cv::TM_SQDIFF,取值為0-1之間,完美匹配返回值為0;
cv::TM_CCORR 判斷 maxVal 越大,效果越好
使用dot product計(jì)算匹配度,越高匹配度就好;
cv::TM_CCORR_NORMED 判斷 maxVal 越接近1,效果越好
范化的cv::TM_CCORR,0-1之間,我用的這個;
cv::TM_CCOEFF 判斷 maxVal 越大,效果越好
采用模板與目標(biāo)圖像像素與各自圖像的平均值計(jì)算dot product,正值越大匹配度越高,負(fù)值越大圖像的區(qū)別越大,但如果圖像沒有明顯的特征(即圖像中的像素值與平均值接近)則返回值越接近0;
cv::TM_CCOEFF_NORMED 判斷 maxVal 越接近1,效果越好
范化的cv::TM_CCOEFF,-1 ~ 1之間。
2 minMaxLoc()函數(shù)
查找全局最小和最大稀疏數(shù)組元素并返回其值及其位置
void minMaxLoc(const SparseMat& a, double* minVal,double* maxVal, int* minIdx=0, int* maxIdx=0);
a: 匹配結(jié)果矩陣
&minVal 和 &maxVal: 在矩陣 result 中存儲的最小值和最大值
&minLoc 和 &maxLoc: 在結(jié)果矩陣中最小值和最大值的坐標(biāo).
到此這篇關(guān)于opencv C++模板匹配的文章就介紹到這了,更多相關(guān)opencv 模板匹配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言經(jīng)典算法例題求100-999之間的“水仙花數(shù)”
本文的主要內(nèi)容,設(shè)計(jì)一個程序,找出100-999之間的“水仙花數(shù)”,需要的朋友可以參考下2015-07-07c++中string類型和int類型相互轉(zhuǎn)換的幾種常用方法
我們在編寫程序時(shí),經(jīng)常涉及到int與string之間的類型轉(zhuǎn)換,本文主要介紹了c++中string類型和int類型相互轉(zhuǎn)換的幾種常用方法,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08C/C++?Qt?運(yùn)用JSON解析庫的實(shí)例代碼
這篇文章主要介紹了C/C++?Qt?運(yùn)用JSON解析庫的相關(guān)知識,通過代碼依次解析這個json文件中的每一個參數(shù),代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01C++實(shí)現(xiàn)LeetCode(94.二叉樹的中序遍歷)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(94.二叉樹的中序遍歷),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07