【OpenCV3】模板匹配——cv::matchTemplate()详解
模板匹配通常被用于目標(biāo)檢測(cè)、相似度分析中,opencv2和opencv3中提供了一個(gè)專門用于模板匹配的函數(shù)——cv::matchTemplate(),下面就對(duì)該函數(shù)進(jìn)行詳細(xì)的介紹。
先從一個(gè)實(shí)際的例子入手,如下分別是一幅測(cè)試圖片和一個(gè)右眼的模板圖片(這里為了方便,是直接從原圖上切下來的),通過模板匹配的方法找到測(cè)試圖片眼睛的位置。
測(cè)試代碼如下:
#include <opencv2/opencv.hpp>int main() {//加載源圖像和模板圖像cv::Mat image_source = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);cv::Mat image_template = cv::imread("template.jpg", cv::IMREAD_GRAYSCALE);cv::Mat image_matched;//模板匹配cv::matchTemplate(image_source, image_template, image_matched, cv::TM_CCOEFF_NORMED);double minVal, maxVal;cv::Point minLoc, maxLoc;//尋找最佳匹配位置cv::minMaxLoc(image_matched, &minVal, &maxVal, &minLoc, &maxLoc);cv::Mat image_color;cv::cvtColor(image_source, image_color, CV_GRAY2BGR);cv::circle(image_color,cv::Point(maxLoc.x + image_template.cols/2, maxLoc.y + image_template.rows/2),20, cv::Scalar(0, 0, 255), 2, 8, 0);cv::imshow("source image", image_source);cv::imshow("match result", image_matched);cv::imshow("target", image_color);cv::waitKey(0);return 0; }
從測(cè)試代碼中可以看出cv::matchTemplate()的具體調(diào)用方法如下:
void cv::matchTemplate(cv::InputArray image, // 用于搜索的輸入圖像, 8U 或 32F, 大小 W-Hcv::InputArray templ, // 用于匹配的模板,和image類型相同, 大小 w-hcv::OutputArray result, // 匹配結(jié)果圖像, 類型 32F, 大小 (W-w+1)-(H-h+1)int method // 用于比較的方法);
該函數(shù)第一個(gè)參數(shù)是源圖像,第二個(gè)參數(shù)是模板圖像,第三個(gè)參數(shù)是匹配的結(jié)果圖像,第四個(gè)參數(shù)是用于指定比較的方法。
下面重點(diǎn)介紹一下第四個(gè)參數(shù),opencv中支持的比較方法有六種,分別如下:
1、cv::TM_SQDIFF:該方法使用平方差進(jìn)行匹配,因此最佳的匹配結(jié)果在結(jié)果為0處,值越大匹配結(jié)果越差。
2、cv::TM_SQDIFF_NORMED:該方法使用歸一化的平方差進(jìn)行匹配,最佳匹配也在結(jié)果為0處。
3、cv::TM_CCORR:相關(guān)性匹配方法,該方法使用源圖像與模板圖像的卷積結(jié)果進(jìn)行匹配,因此,最佳匹配位置在值最大處,值越小匹配結(jié)果越差。
4、cv::TM_CCORR_NORMED:歸一化的相關(guān)性匹配方法,與相關(guān)性匹配方法類似,最佳匹配位置也是在值最大處。
5、cv::TM_CCOEFF:相關(guān)性系數(shù)匹配方法,該方法使用源圖像與其均值的差、模板與其均值的差二者之間的相關(guān)性進(jìn)行匹配,最佳匹配結(jié)果在值等于1處,最差匹配結(jié)果在值等于-1處,值等于0直接表示二者不相關(guān)。
6、cv::TM_CCOEFF_NORMED:歸一化的相關(guān)性系數(shù)匹配方法,正值表示匹配的結(jié)果較好,負(fù)值則表示匹配的效果較差,也是值越大,匹配效果也好。
匹配方法的選取根據(jù)實(shí)際情況而定,這里我們選擇的方法是cv::TM_CCOEFF_NORMED,源圖像和匹配的相似度圖如下:
因此,我們?nèi)粝胝业阶罴哑ヅ湮恢?#xff0c;只需要找到匹配結(jié)果圖像的最大值點(diǎn)即可,這里我們使用cv::minMaxLoc()函數(shù)(具體請(qǐng)參考cv::Mat中最值和均值的求解)來找這個(gè)最大值點(diǎn)。找到結(jié)果后,將其繪制到原圖像上,效果如下圖所示(圓等圖形的繪制請(qǐng)參考OpenCV3中的繪圖詳解),這里注意匹配結(jié)果圖像與原圖像之間的大小關(guān)系,他們之間差了一個(gè)模板大小。
2017.04.06
總結(jié)
以上是生活随笔為你收集整理的【OpenCV3】模板匹配——cv::matchTemplate()详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV3】图像翻转——cv::f
- 下一篇: 【OpenCV3】直线拟合——cv::f