opencv学习-模板匹配
Posted 殇堼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv学习-模板匹配相关的知识,希望对你有一定的参考价值。
模板匹配
minMaxLoc函数
功能:从一个矩阵中找出全局的最大值和最小值。
void minMaxLoc( const Mat& src, double* minVal, double* maxVal=0, Point* minLoc=0, Point* maxLoc=0, const Mat& mask=Mat() );
参数解释
参数1:InputArray类型的src,输入单通道数组(图像)。
参数2:double类型的minVal,返回最小值的指针。若无须返回,此值置为NULL。
参数3:double类型的maxVal,返回最大值的指针。若无须返回,此值置为NULL。
参数4:Point类型的minLoc,返回最小位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数5:Point类型的maxLoc,返回最大位置的指针(二维情况下)。若无须返回,此值置为NULL。
参数6:InputArray类型的mask,用于选择子阵列的可选掩膜。
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
Mat src; Mat templ; Mat result;
char* src_window = "【输入图像】";
char* result_window = "【结果窗口】";
int match_method;
int max_Trackbar = 5;
// 函数声明
void MatchingMethod(int, void*);
int main()
{
src = imread("D:/images/lena.png");
templ = imread("D:/images/template.png");
if (!src.data || !templ.data)
{
cout << "could not load image !";
return -1;
}
// 创建窗口
namedWindow(src_window, WINDOW_AUTOSIZE);
namedWindow(result_window, WINDOW_AUTOSIZE);
imshow(src_window, src);
// 创建滑动条
char* trackbar_label = "Method";
createTrackbar(trackbar_label, src_window, &match_method, max_Trackbar, MatchingMethod);
MatchingMethod(0, 0);
waitKey(0);
return 0;
}
void MatchingMethod(int, void*)
{
// 将被显示的原图像
Mat src_display;
src.copyTo(src_display);
// 创建输出结果的矩阵,32为浮点数
int result_cols = src.cols - templ.cols + 1;
int result_rows = src.rows - templ.rows + 1;
result.create(result_cols, result_rows, CV_32FC1);
// 进行匹配和标准化
matchTemplate(src, templ, result, match_method);
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());//归一化
// 通过函数 minMaxLoc 定位最匹配的位置
double minVal; double maxVal;
Point minLoc; Point maxLoc;
Point matchLoc;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
// 对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好
if (match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED)
{
matchLoc = minLoc;
}
else
{
matchLoc = maxLoc;
}
rectangle(src_display, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 0, 255), 2, 8, 0);
rectangle(result, matchLoc, Point(matchLoc.x + templ.cols, matchLoc.y + templ.rows), Scalar(0, 0, 255), 2, 8, 0);
imshow(src_window, src_display);
imshow(result_window, result);
return;
}
简化
#include<opencv2\\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat img, temp, output;
img = imread("D:/images/lena.png");
temp = imread("D:/images/template.png");
if (img.empty() || temp.empty()) {
print("请确认是图像输入是否存在");
return -1;
}
//模板匹配
matchTemplate(img, temp, output, TM_CCOEFF_NORMED);
//寻找匹配结果中的最大和最小值以及坐标位置
double minval, maxval;
Point minLoc, maxLoc;
minMaxLoc(output, &minval, &maxval, &minLoc, &maxLoc);
//绘制最佳匹配区域
rectangle(img,Rect(minLoc.x,maxLoc.y,temp.cols,temp.rows),Scalar(0,0,255),1,4);
imshow("原图",img);
imshow("模板", temp);
imshow("模板匹配后", output);
waitKey(0);
return 0;
}
以上是关于opencv学习-模板匹配的主要内容,如果未能解决你的问题,请参考以下文章