【OpenCV3】模板匹配——cv::matchTemplate()详解
模板匹配通常被用于目標檢測、相似度分析中,opencv2和opencv3中提供了一個專門用于模板匹配的函數——cv::matchTemplate(),下面就對該函數進行詳細的介紹。
先從一個實際的例子入手,如下分別是一幅測試圖片和一個右眼的模板圖片(這里為了方便,是直接從原圖上切下來的),通過模板匹配的方法找到測試圖片眼睛的位置。
測試代碼如下:
#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; }
從測試代碼中可以看出cv::matchTemplate()的具體調用方法如下:
void cv::matchTemplate(cv::InputArray image, // 用于搜索的輸入圖像, 8U 或 32F, 大小 W-Hcv::InputArray templ, // 用于匹配的模板,和image類型相同, 大小 w-hcv::OutputArray result, // 匹配結果圖像, 類型 32F, 大小 (W-w+1)-(H-h+1)int method // 用于比較的方法);
該函數第一個參數是源圖像,第二個參數是模板圖像,第三個參數是匹配的結果圖像,第四個參數是用于指定比較的方法。
下面重點介紹一下第四個參數,opencv中支持的比較方法有六種,分別如下:
1、cv::TM_SQDIFF:該方法使用平方差進行匹配,因此最佳的匹配結果在結果為0處,值越大匹配結果越差。
2、cv::TM_SQDIFF_NORMED:該方法使用歸一化的平方差進行匹配,最佳匹配也在結果為0處。
3、cv::TM_CCORR:相關性匹配方法,該方法使用源圖像與模板圖像的卷積結果進行匹配,因此,最佳匹配位置在值最大處,值越小匹配結果越差。
4、cv::TM_CCORR_NORMED:歸一化的相關性匹配方法,與相關性匹配方法類似,最佳匹配位置也是在值最大處。
5、cv::TM_CCOEFF:相關性系數匹配方法,該方法使用源圖像與其均值的差、模板與其均值的差二者之間的相關性進行匹配,最佳匹配結果在值等于1處,最差匹配結果在值等于-1處,值等于0直接表示二者不相關。
6、cv::TM_CCOEFF_NORMED:歸一化的相關性系數匹配方法,正值表示匹配的結果較好,負值則表示匹配的效果較差,也是值越大,匹配效果也好。
匹配方法的選取根據實際情況而定,這里我們選擇的方法是cv::TM_CCOEFF_NORMED,源圖像和匹配的相似度圖如下:
因此,我們若想找到最佳匹配位置,只需要找到匹配結果圖像的最大值點即可,這里我們使用cv::minMaxLoc()函數(具體請參考cv::Mat中最值和均值的求解)來找這個最大值點。找到結果后,將其繪制到原圖像上,效果如下圖所示(圓等圖形的繪制請參考OpenCV3中的繪圖詳解),這里注意匹配結果圖像與原圖像之間的大小關系,他們之間差了一個模板大小。
2017.04.06
總結
以上是生活随笔為你收集整理的【OpenCV3】模板匹配——cv::matchTemplate()详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【OpenCV3】图像翻转——cv::f
- 下一篇: 【OpenCV3】直线拟合——cv::f