模板匹配的概念和原理
模板匹配就是在一幅圖像中尋找與模板圖像最匹配(相似)部分。
具體步驟為從左到右,從上向下計算模板圖像與圖像覆蓋區域的匹配度,匹配程度越大,兩者相同的可能性越大。
實現模板匹配:matchTemplate 函數
void matchTemplate(InputArray image, InputArray temp1, OutputArray result, int method);
- image,待搜索的圖像,且需為 8 位或 32 位浮點型圖像。
- temp1,搜索模板,需要和原圖片有一樣的數據類型,且尺寸不能大於源圖像。
- result,比較結果的映射圖像,其必須為單通道、32 位浮點型圖像,大小為 (image.cols - temp1.cols +1)×(image.rows - temp1.rows +1)
- method,匹配方法,有 6 種選項:
匹配方法 | 計算公式 |
平方差匹配法 TM_SQDIFF |
|
歸一化平方差匹配法 TM_SQDIFF_NORMED |
|
相關匹配法 TM_CCORR |
|
歸一化相關匹配法 TM_CCORR_NORMED |
|
系數匹配法 TM_CCOEFF |
其中 |
化相關系數匹配法 TM_CCOEFF_NORMED |
|
代碼示例:
#include<opencv.hpp> #include<iostream> #include<string>
using namespace std; using namespace cv; Mat src, temp; int method = 0; void ChangeMethod(int, void*) { switch (method){ case 0: method = TM_SQDIFF; break; case 1: method = TM_SQDIFF_NORMED; break; case 2: method = TM_CCORR; break; case 3: method = TM_CCORR_NORMED; break; case 4: method = TM_CCOEFF; break; case 5: method = TM_CCOEFF_NORMED; break; }
Mat result; matchTemplate(src, temp, result, method); imshow("result", result); Mat dst = src.clone(); double mxValue, mnValue; Point mxPoint, mnPoint; minMaxLoc(result, &mnValue, &mxValue, &mnPoint, &mxPoint);
//https://www.cnblogs.com/bjxqmy/p/12386274.html if (method == TM_SQDIFF || method == TM_SQDIFF_NORMED) { rectangle(dst, mnPoint, Point(mnPoint.x + temp.cols, mnPoint.y + temp.rows), Scalar(0, 0, 255)); } else{ rectangle(dst, mxPoint, Point(mxPoint.x + temp.cols, mxPoint.y + temp.rows), Scalar(0, 0, 255)); } imshow("dst", dst); } int main() { src = imread("C:/Users/齊明洋/Desktop/1.jpg"); temp = imread("C:/Users/齊明洋/Desktop/a.jpg"); imshow("src", src); imshow("temp", temp); namedWindow("dst"); createTrackbar("method", "dst", &method, 5, ChangeMethod); ChangeMethod(0, 0); waitKey(0); }
效果演示:
原圖和模板:
TM_SQDIFF 方法
TM_SQDIFF_NORMED 方法
TM_CCORR 方法
TM_CCORR_NORMED 方法
TM_CCOEFF 方法
TM_CCOEFF_NORMED 方法
https://www.cnblogs.com/fuzhuoxin/p/12158777.html