您的位置:首页 > 其它

模板匹配

2017-10-12 21:47 148 查看
日常opencv,这里用了女神的图片
// 模板匹配.cpp: 用一个模板滑动窗口去匹配某张图片的区域
//

#include "stdafx.h"
#include<iostream>
#include<highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
using namespace std;

#define WIN_NAME1 "【原始窗口】"
#define WIN_NAME2 "【效果窗口】"

Mat g_srcImage;
Mat g_templateImage;
Mat resultImage;
int g_nMaxTrackbarNum = 5;
int g_nMatchMethod;

void on_Matching(int, void *)
{
Mat srcImage;
g_srcImage.copyTo(srcImage);

//初始化用于结果输出的矩阵
int resultImage_rows = srcImage.rows + 1 - g_templateImage.rows;
int resultImage_cols = srcImage.cols + 1 - g_templateImage.cols;
resultImage.create(resultImage_rows, resultImage_cols, CV_32F);

//进行匹配和标准化
matchTemplate(g_srcImage, g_templateImage, resultImage, g_nMatchMethod);
normalize(resultImage, resultImage, 0, 1, NORM_MINMAX, -1, Mat());

//通过函数minMax()寻找最匹配的位置
double minValue; double maxValue; Point minLocation;  Point maxLocation;
Point matchLocation;
minMaxLoc(resultImage, &minValue, &maxValue, &minLocation, &maxLocation);

if (g_nMatchMethod == TM_SQDIFF || g_nMatchMethod == TM_SQDIFF_NORMED)
matchLocation = minLocation;
else
matchLocation = maxLocation;
rectangle(srcImage,matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows),Scalar(0, 250, 250),2,LINE_AA,0);
rectangle(resultImage, matchLocation, Point(matchLocation.x + g_templateImage.cols, matchLocation.y + g_templateImage.rows), Scalar(0, 250, 250), 2, LINE_AA, 0);

//展示两张图片
imshow(WIN_NAME1,srcImage);
imshow(WIN_NAME2, resultImage);
}

int main()
{
g_srcImage = imread("1.jpg", 1);  g_templateImage = imread("2.jpg", 1);

namedWindow(WIN_NAME1, WINDOW_AUTOSIZE);
namedWindow(WIN_NAME2, WINDOW_AUTOSIZE);

createTrackbar("方法", WIN_NAME1, &g_nMatchMethod,g_nMaxTrackbarNum, on_Matching);
on_Matching(0, 0);
waitKey(0);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: