opencv 模板匹配
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv 模板匹配相关的知识,希望对你有一定的参考价值。
我的其他文章
AKAZE 局部特征匹配
级联分类器使用
等比例缩放图片
给图片加logo
鱼眼校正
智能答卷识别
opencv滤镜效果
灰度图像增强方式
更多文章正在写作过程中。
基础知识点
模板匹配意思就是找一副已经存在的图片,从其他图片中查找近似的图片,接下来我们准备两幅大图,一副小图
准备两幅大图,监控里面的截图并且时间不一样,角度也不一样
图片一
图片二
可以看出两幅图片是不一样的,由于摄像头角度偏摆,部分图片并不一样,角度也不一致
show me the code
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace cv;
int main()
{
Mat img,img2, templ, result,result2;
img = imread("./big.jpg");
img2 = imread("./big2.jpg");
templ = imread("./temp.jpg");
imshow("t1", templ);
int result_cols = img.cols - templ.cols + 1;
int result_rows = img.rows - templ.rows + 1;
result.create(result_cols, result_rows, CV_32FC1);
//matchTemplate(img, templ, result, TM_SQDIFF_NORMED);//这里我们使用的匹配算法是标准平方差匹配 method=CV_TM_SQDIFF_NORMED,数值越小匹配度越好
matchTemplate(img, templ, result, TM_CCOEFF_NORMED);//数值越小匹配度越好
matchTemplate(img2, templ, result2, TM_CCOEFF_NORMED);//数值越小匹配度越好
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
normalize(result2, result2, 0, 1, NORM_MINMAX, -1, Mat());
double minVal = -1;
double maxVal;
Point minLoc;
Point maxLoc;
Point matchLoc;
//cout << "匹配度:" << minVal << endl;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
cout << "匹配度 min:" << minVal<<" max:" <<maxVal<< endl;
//matchLoc = minLoc;
matchLoc = maxLoc;
rectangle(img, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, 8, 0);
imshow("img", img);
minMaxLoc(result2, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
cout << "匹配度 min:" << minVal << " max:" << maxVal << endl;
matchLoc = maxLoc;
rectangle(img2, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 255, 0), 2, 8, 0);
imshow("img2", img2);
waitKey(0);
return 0;
}
执行
结果如下:
从两幅图片中都找到了匹配。
以上是关于opencv 模板匹配的主要内容,如果未能解决你的问题,请参考以下文章