日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv 模板匹配_详细剖析模板匹配

發(fā)布時(shí)間:2024/7/23 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv 模板匹配_详细剖析模板匹配 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

點(diǎn)擊上方“新機(jī)器視覺”,選擇加"星標(biāo)"或“置頂”

重磅干貨,第一時(shí)間送達(dá)

模板匹配介紹

我們需要2幅圖像:

原圖像 (I):?在這幅圖像里,我們希望找到一塊和模板匹配的區(qū)域

模板 (T):?將和原圖像比照的圖像塊

  • 模板匹配就是在整個(gè)圖像區(qū)域發(fā)現(xiàn)與給定子圖像匹配的小塊區(qū)域。

  • 所以模板匹配首先需要一個(gè)模板圖像T(給定的子圖像)

  • 另外需要一個(gè)待檢測(cè)的圖像-源圖像S

  • 工作方法,在帶檢測(cè)圖像上,從左到右,從上向下計(jì)算模板圖像與重疊子圖像的匹配度,匹配程度越大,兩者相同的可能性越大。

模板匹配原理

我們的目標(biāo)是檢測(cè)最匹配模板的原圖像的區(qū)域:

為了確定匹配模板區(qū)域, 我們不得不滑動(dòng)模板圖像和原圖像進(jìn)行比較 :

對(duì)于 模板(T) 覆蓋在 原圖像 (I) 上的每個(gè)位置,你把度量值保存 到 結(jié)果圖像矩陣 ( R ) 中. 在 R 中的每個(gè)位置 (x,y) 都包含匹配度量值:

上圖(右)就是?TM_CCORR_NORMED?方法處理后的結(jié)果圖像 R . 最白的位置代表最高的匹配. 正如您所見, 黑色框住的位置很可能是結(jié)果圖像矩陣中的最大數(shù)值, 所以這個(gè)區(qū)域 (以這個(gè)點(diǎn)為頂點(diǎn),長(zhǎng)寬和模板圖像一樣大小的矩陣) 被認(rèn)為是匹配的.

實(shí)際上, 我們使用函數(shù)?minMaxLoc?來定位在矩陣 R 中的最大值點(diǎn) (或者最小值, 根據(jù)函數(shù)輸入的匹配參數(shù)) .

void?minMaxLoc(InputArray src,?double* minVal,?double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, InputArray mask=noArray())
  • src:輸入圖像。

  • minVal:在矩陣 src中存儲(chǔ)的最小值,可輸入NULL表示不需要。

  • maxVal :在矩陣 src中存儲(chǔ)的最大值,可輸入NULL表示不需要。

  • minLoc:在結(jié)果矩陣中最小值的坐標(biāo),可輸入NULL表示不需要,Point類型。

  • maxLoc:在結(jié)果矩陣中最大值的坐標(biāo),可輸入NULL表示不需要,Point類型。

  • mask:可選的掩模

模板匹配介紹 – 匹配算法介紹:

OpenCV中提供了六種常見的匹配算法如下:

  • 計(jì)算平方不同 :計(jì)算出來的值越小,越相關(guān)?TM_SQDIFF = 0

  • 計(jì)算相關(guān)性:計(jì)算出來的值越大,越相關(guān)?TM_CCORR = 2

  • 計(jì)算相關(guān)系數(shù):計(jì)算出來的值越大,越相關(guān)?TM_CCOEFF = 4

  • 計(jì)算歸一化平方不同 :計(jì)算出來的值越接近0,越相關(guān)?TM_SQDIFF_NORMED = 1

  • 計(jì)算歸一化相關(guān)性:計(jì)算出來的值越接近1,越相關(guān)?TM_CCORR_NORMED = 3

  • 計(jì)算歸一化相關(guān)系數(shù):計(jì)算出來的值越接近1,越相關(guān)?TM_CCOEFF_NORMED = 5

總結(jié)如下:

相關(guān)API介紹cv::matchTemplate

matchTemplate(
InputArray image,// 源圖像,必須是8-bit或者32-bit浮點(diǎn)數(shù)圖像
InputArray templ,// 模板圖像,類型與輸入圖像一致
OutputArray result,// 輸出結(jié)果,必須是單通道32位浮點(diǎn)數(shù),假設(shè)源圖像WxH,模板圖像wxh, 則結(jié)果必須為W-w+1, H-h+1的大小。
int?method,//使用的匹配方法
InputArray mask=noArray()//(optional)
)

程序代碼

#include?
#include?
using?namespace?std;
using?namespace?cv;

// 定義一些全局變量, 例如原圖像(img), 模板圖像(templ) 和結(jié)果圖像(result) ,?
// 還有匹配方法以及窗口名稱:
Mat img, templ, result;
char* image_window =?"Source Image";
char* result_window =?"Result window";

int?match_method = TM_SQDIFF;
int?max_Trackbar =?5;

void?MatchingMethod(?int,?void* );

int?main(?int?argc,?char** argv ){
?// 1. 載入原圖像和模板塊
?img = imread("E:/Experiment/OpenCV/Pictures/TargetSearch.jpg");
?templ = imread("E:/Experiment/OpenCV/Pictures/Target.jpg");
?imshow("模板圖像",templ);

?// 創(chuàng)建窗口
?namedWindow( image_window, CV_WINDOW_AUTOSIZE );
?namedWindow( result_window, CV_WINDOW_AUTOSIZE );

?// 2. 創(chuàng)建滑動(dòng)條并輸入將被使用的匹配方法. 一旦滑動(dòng)條發(fā)生改變,回調(diào)函數(shù) MatchingMethod 就會(huì)被調(diào)用.
?char* trackbar_label =?"模板匹配方式";
?createTrackbar( trackbar_label, image_window, &match_method, max_Trackbar, MatchingMethod );

?MatchingMethod(?0,?0?);

?waitKey(0);
?return?0;
}

void?MatchingMethod(?int,?void* ){
?// 將被顯示的原圖像
?Mat img_display;
?img.copyTo( img_display );

?// 創(chuàng)建輸出結(jié)果的矩陣
?int?result_cols = ?img.cols - templ.cols +?1;
?int?result_rows = img.rows - templ.rows +?1;
?// 創(chuàng)建了一幅用來存放匹配結(jié)果的輸出圖像矩陣. 仔細(xì)看看輸出矩陣的大小(它包含了所有可能的匹配位置)
?result.create( result_cols, result_rows, CV_32FC1 );

?// 執(zhí)行模板匹配操作,并對(duì)結(jié)果進(jìn)行歸一化:
?matchTemplate( img, templ, result, match_method );
?normalize( result, result,?0,?1, NORM_MINMAX,?-1, Mat() );

?// 通過函數(shù) minMaxLoc 定位最匹配的位置
?double?minVal, maxVal;?
?Point minLoc, maxLoc;
?Point matchLoc;
?
?//通過使用函數(shù) minMaxLoc ,我們確定結(jié)果矩陣 R 的最大值和最小值的位置.
?minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() );//尋找result中最大值,最小值,及它們所在的位置

?// 對(duì)于方法 SQDIFF 和 SQDIFF_NORMED, 越小的數(shù)值代表更高的匹配結(jié)果. 而對(duì)于其他方法, 數(shù)值越大匹配越好
?if( match_method ?== CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED ){?
? ?matchLoc = minLoc;?
?}else{?
? ?matchLoc = maxLoc;?
?}

?// 繪制矩形
?rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0),?2,?8,?0?);
?rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0),?2,?8,?0?);

?imshow( image_window, img_display );
?imshow( result_window, result );

?return;
}

運(yùn)行結(jié)果

本文主要借鑒”Madcola“和”Micheal超“兩位大神的文章。兩位大神的博客主頁是:

https://www.cnblogs.com/skyfsm/(Madcola)

https://blog.csdn.net/qq_42887760(Micheal超)

轉(zhuǎn)自:小白學(xué)視覺

?End?

聲明:部分內(nèi)容來源于網(wǎng)絡(luò),僅供讀者學(xué)術(shù)交流之目的。文章版權(quán)歸原作者所有。如有不妥,請(qǐng)聯(lián)系刪除。

總結(jié)

以上是生活随笔為你收集整理的opencv 模板匹配_详细剖析模板匹配的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。