OpenCV模板匹配
阿新 • • 發佈:2018-12-14
這個比較好玩,先來兩張照片
原圖:
模板:
效果:
原理:
假設有100*100畫素的一張原圖,模板大小5*5畫素,從(0,0)開始,根據不同的方法匹配模板大小即(0,0)到(5,5)空間,把用方法得到的值算作(0,0)這個畫素的特徵值,接下來重新從(0,1),按照這樣從左到右,從上到下。
API:
CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ, OutputArray result, int method, InputArray mask = noArray() );
imag:原影象
temp1:模板影象
result:使用method得到的結果,也就是畫素特徵值集合。
method:方法:有以下6種
差值平方和匹配 CV_TM_SQDIFF標準化差值平方和匹配 CV_TM_SQDIFF_NORMED相關匹配 CV_TM_CCORR標準相關匹配 CV_TM_CCORR_NORMED相關匹配 CV_TM_CCOEFF標準相關匹配
其中CV_TM_SQDIFF和 CV_TM_SQDIFF_NORMED值越小說明匹配度越高,取值為0~1
#include <iostream> #include <opencv.hpp> using namespace cv; using namespace std; char *name="Window"; int current=CV_TM_CCOEFF;//5 int max_value=5; void cal_back(int ,void *); Mat src,mould; int main() { src=imread("E:\\opencv\\yibu.jpg"); mould=imread("E:\\opencv\\templt.jpg"); namedWindow(name); createTrackbar("method",name,¤t,max_value,cal_back); cal_back(0,0); waitKey(0); return 0; } void cal_back(int ,void *) { Mat dst; int width=src.cols-mould.cols+1; int height=src.rows-mould.rows+1; Mat result; result.create(width,height,CV_32FC1); matchTemplate(src,mould,result,current,Mat()); normalize(result,result,0,1,NORM_MINMAX); Point minloc; Point maxloc; double mymin,mymax; minMaxLoc(result,&mymin,&mymax,&minloc,&maxloc,Mat()); cout<<"mymin"<<mymin; cout<<"mymax"<<mymax; src.copyTo(dst); Point temploc; if(current==CV_TM_SQDIFF||current==CV_TM_SQDIFF_NORMED) { temploc=minloc; }else{ temploc=maxloc; } rectangle(dst,Rect(temploc.x,temploc.y,mould.cols,mould.rows), Scalar(0,0,255),2,LINE_AA); rectangle(result,Rect(temploc.x,temploc.y,mould.cols,mould.rows), Scalar(0,0,255),2,LINE_AA); imshow(name,result); imshow("dst",dst); imwrite("dst.jpg",dst); }