opencv模板匹配步驟及Code(轉載)

opencv模板匹配步驟及Code

首先介紹一下模板匹配的適用場景:
1、圖像檢索
2、目標跟蹤
簡單的說,模板匹配最主要的功能就是在一幅圖像中去尋找和另一幅模板圖像中相似度最高的部分,這就是模板匹配。
比如,在下面這圖片中:
待檢測圖片
我們要在上面這幅圖片中尋找下面這位女團成員的頭像:
模板圖像
使用模板匹配後的尋找結果如下圖所示:
匹配結果
接下來看一下opencv中的模板匹配的具體用法吧。
我將模板匹配的步驟分割如下:
步驟一:讀取圖片
code:

cv::Mat img1 = cv::imread("C:\\Users\\Administrator\\Desktop\\tmp.png");
cv::Mat img2 = cv::imread("C:\\Users\\Administrator\\Desktop\\tmp1.png");
  • 1
  • 2

步驟二:創建一個空畫布用來繪製匹配結果
code:

cv::Mat dstImg;
dstImg.create(img1.dims,img1.size,img1.type());
cv::imshow("createImg",dstImg);
  • 1
  • 2
  • 3

步驟三:匹配,最後一個參數爲匹配方式
code:

cv::matchTemplate(img1, img2, dstImg, 0);
  • 1

步驟四:歸一化圖像矩陣,可省略
code:

cv::normalize(dstImg, dstImg, 0, 1, 32);
  • 1

步驟五:獲取最大或最小匹配係數
code:

//首先是從得到的 輸出矩陣中得到 最大或最小值(平方差匹配方式是越小越好,所以在這種方式下,找到最小位置)
//找矩陣的最小位置的函數是 minMaxLoc函數
cv::Point minPoint;
cv::Point maxPoint;
double *minVal = 0;
double *maxVal = 0;
cv::minMaxLoc(dstImg, minVal, maxVal, &minPoint,&maxPoint);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

步驟六:開始正式繪製
code:

cv::rectangle(img1, minPoint, cv::Point(minPoint.x + img2.cols, minPoint.y + img2.rows),    cv::Scalar(0,255,0), 2, 8);
cv::imshow("【匹配後的圖像】", img1);

cv::rectangle(dstImg, minPoint, cv::Point(minPoint.x + img2.cols, minPoint.y + img2.rows), cv::Scalar(0,0,0), 2, 8);
cv::imshow("【匹配後的計算過程圖像】", dstImg);
cv::waitKey(0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

函數介紹

    void cv::matchTemplate(
        cv::InputArray image, // 用於搜索的輸入圖像
        cv::InputArray templ, // 用於匹配的模板,和image類型相同
        cv::OutputArray result, // 匹配結果圖像
        int method // 用於比較的方法
    )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

參數解釋:
InputArray Image: 待搜索的圖像,且圖像必須爲8-bit或32-bit的浮點型圖像
InputArray templ: 用於進行模板匹配的模板圖像,類型和原圖像一致,但是尺寸不能大於原圖像
OutputArray result: 模板搜索結果輸出圖像,必須爲單通道32-bit位浮點型圖像,如果圖像尺寸是WxH而template尺寸是wxh,則此參數result一定是(W-w+1)x(H-h+1)
int method: 模板匹配計算類型,共6種,將在下面進行簡單介紹
InputArray mask=noArray(): 圖像匹配時用的掩膜板,必須和模板圖像有相同的數據類型和尺寸

在OpenCV中提供了6種匹配度量方法。
(1).平方差匹配法CV_TM_SQDIFF
(2)歸一化平方差匹配法CV_TM_SQDIFF_NORMED
(3)相關匹配法CV_TM_CCORR
(4)歸一化相關匹配法CV_TM_CCORR_NORMED
(5)係數匹配法CV_TM_CCOEFF
(6)化相關係數匹配法CV_TMCCOEFF_NORMED
通常來講,隨着從簡單測量方法(平方差)到更復雜的測量方法(相關係數法),我們可以獲得越來越準確的匹配。然而這同時也會以越來越大的計算量爲代價。對於選取何種方法,針對不同的匹配情況進行對此分析比較,選取更適合自己應用場景同時兼顧速度和精度的最佳方案。
注意
值得注意的是對於方法SQDIFF和SQDIFF_NORMED兩種方法來講,越小的值就有着更高的匹配結果,而其餘的方法則是數值越大匹配效果越好。

void cv::minMaxLoc  (   InputArray      src,
        double *    minVal,
        double *    maxVal = 0,
        Point *     minLoc = 0,
        Point *     maxLoc = 0,
        InputArray      mask = noArray() 
    )
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

參數解釋:
InputArray src:輸入的單通道數組
*double minVal:**double類型指針,返回最小值,如果沒有定義返回NULL
double* maxVal:同上,返回最大值
Point* minLoc=0:Point類型的指針,在二維圖像中返回最小值的位置座標,如果沒有定義返回NULL
*Point maxLoc=0: **Point同上,返回最大位置座標
InputArray mask=noArray():可選掩膜

完整代碼:

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;

void main()
{
//步驟一:讀取圖片
    cv::Mat img1 = cv::imread("C:\\Users\\Administrator\\Desktop\\tmp.png");
    cv::Mat img2 = cv::imread("C:\\Users\\Administrator\\Desktop\\tmp1.png");
    cv::imshow("【被查找的圖像】", img1);
    cv::imshow("【模版圖像】", img2);

//步驟二:創建一個空畫布用來繪製匹配結果
    cv::Mat dstImg;
    dstImg.create(img1.dims,img1.size,img1.type());
    cv::imshow("createImg",dstImg);

//步驟三:匹配,最後一個參數爲匹配方式,共有6種,詳細請查閱函數介紹
    cv::matchTemplate(img1, img2, dstImg, 0);

//步驟四:歸一化圖像矩陣,可省略
    cv::normalize(dstImg, dstImg, 0, 1, 32);

//步驟五:獲取最大或最小匹配係數
//首先是從得到的 輸出矩陣中得到 最大或最小值(平方差匹配方式是越小越好,所以在這種方式下,找到最小位置)
//找矩陣的最小位置的函數是 minMaxLoc函數
    cv::Point minPoint;
    cv::Point maxPoint;
    double *minVal = 0;
    double *maxVal = 0;
    cv::minMaxLoc(dstImg, minVal, maxVal, &minPoint,&maxPoint);

//步驟六:開始正式繪製
    cv::rectangle(img1, minPoint, cv::Point(minPoint.x + img2.cols, minPoint.y + img2.rows), cv::Scalar(0,255,0), 2, 8);
    cv::imshow("【匹配後的圖像】", img1);
    cv::rectangle(dstImg, minPoint, cv::Point(minPoint.x + img2.cols, minPoint.y + img2.rows), cv::Scalar(0,0,0), 3, 8);
    cv::imshow("【匹配後的計算過程圖像】", dstImg);
    cv::waitKey(0);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章