OpenCV中的模板匹配
生活随笔
收集整理的這篇文章主要介紹了
OpenCV中的模板匹配
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
OpenCV中的模板匹配
在該demo中選取了兩張猴哥的照片,一張用來獲得模板,另外一張用模板去匹配。
下圖為選取模板的圖像:
以下為選取的匹配模板:
根據該模板在下面的圖中找到猴哥的臉:
該demo要實現的功能已經說完。
下面就是實現過程中的一些細節。
首先來說,模板匹配的原理:模板匹配就是兩幅圖像,將小的圖像像個滑塊一樣在大的上面逐像素滑動,并且沒滑動一次計算出此次小圖像覆蓋下的區域像素和該滑塊中像素的差值,當然了這個差值不一定是直接減,也可以是別的計算方法,來衡量像素之間的差異。最后將所有的衡量結果,取出其中最符合的那個像素點然后利用滑塊的大小將識別的區域利用圓框進行框選出來。
編寫demo過程中的幾個API和重要的操作:
首先是在一幅大的圖片中得到一個小的圖片:
匹配函數:
matchTemplate(要匹配的大圖像,模板圖像,輸出結果圖像,匹配計算的方法CV_TM_SQDIFF(平方差));匹配結束之后我們需要在結果矩陣中找到我們需要的最小或者做大值以及它們的位置,OpenCV給我們提供了相應的API函數供我們去使用。
minMaxLoc(輸入矩陣,&最小值,&最大值,&最小值的位置Point()&最大值的位置Point()Mat(); );例如我們使用平方差的方式,我們需要找到矩陣中的最小值,所以我們可以得到Point(xmin,ymin)Point(x_{min},y_{min})Point(xmin?,ymin?)然后我們根據該點在圖像上圈出最匹配的區域。
#include "opencv2/opencv.hpp" #include <vector>using namespace std; using namespace cv;int main(int argc, char *argv[]) {Mat src,src1,dst,temp;src = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/src1.png");src1 = imread("/home/dynamicw/Project/C++_Project/opencvtest/src/lesson01/source/src2.png");imshow("src",src);imwrite("t1.png",src(Rect(0,0,src.cols/2,src.rows)));Rect rect(250,250,200,200);temp = src(rect); imshow("template",temp);matchTemplate(src1,temp,dst,CV_TM_SQDIFF);normalize(dst,dst,0,1,NORM_MINMAX,-1,Mat());double minVal,maxVal;Point minLoc,maxLoc;Point matchLoc;minMaxLoc(dst,&minVal,&maxVal,&minLoc,&maxLoc,Mat());matchLoc = minLoc;rectangle(src1,matchLoc,Point(matchLoc.x + temp.cols,matchLoc.y + temp.rows),Scalar(0,0,255),2,8);imshow("BackProj",src1);waitKey(0);return 0; }最后執行的結果,與我們的預期完全一致:
總結
以上是生活随笔為你收集整理的OpenCV中的模板匹配的全部內容,希望文章能夠幫你解決所遇到的問題。