opencv+C++进⾏简单图像模板匹配
1.在原图上裁剪⼀块作为模板图像,如果图像不是裁剪的,⼤⼩有变化的话,会影响匹配结果。
2.运⾏代码
/*
简单图像模板匹配
*/
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <algorithm>
#include <cstdlib>
using namespace std;
using namespace cv;
int match_method = 1;
/*
// match_method参数设置,模板匹配⽅法:
// 0,平⽅差匹配,最⼩值,值越接近0,匹配效果越好
// 1,归⼀化平⽅差匹配,最⼩值,值越接近0,匹配效果越好
/
/ 2,相关性匹配⽅法,该⽅法使⽤源图像与模板图像的卷积结果进⾏匹配,因此,最佳匹配位置在值最⼤处,值越⼩匹配结果越差
// 3,归⼀化的相关性匹配⽅法,与相关性匹配⽅法类似,最佳匹配位置也是在值最⼤处
// 4,相关性系数匹配⽅法,该⽅法使⽤源图像与其均值的差、模板与其均值的差⼆者之间的相关性进⾏匹配,最佳匹配结果在值等于1处,最差匹配结果在值等于-1处// 5,归⼀化的相关性系数匹配⽅法,正值表⽰匹配的结果较好,负值则表⽰匹配的效果较差,也是值越⼤,匹配效果也好。
*/
Mat img_display_0;
Mat img;
Mat templ;
double minVal, maxVal;
void MatchingMethod_0(Mat templ_0, void*)
{
// 创建输出结果的矩阵
int result_cols = ls - ls + 1; //计算⽤于储存匹配结果的输出图像矩阵的⼤⼩。
int result_rows = ws - ws + 1;
Mat result_0;
ate(result_cols, result_rows, CV_32FC1);//被创建矩阵的列数,⾏数,以CV_32FC1形式储存。
// 进⾏匹配和标准化
matchTemplate(img, templ_0, result_0, match_method); //待匹配图像,模版图像,输出结果图像,匹配⽅法(由滑块数值给定。)
normalize(result_0, result_0, 0, 1, NORM_MINMAX, -1, Mat());//输⼊数组,输出数组,range normali
ze的最⼩值,range normalize的最⼤值,归⼀化类型,当type // 通过函数 minMaxLoc 定位最匹配的位置;
Point minLoc; Point maxLoc;
Point matchLoc;
minMaxLoc(result_0, &minVal, &maxVal, &minLoc, &maxLoc, Mat());//⽤于检测矩阵中最⼤值和最⼩值的位置
// 对于⽅法 SQDIFF 和 SQDIFF_NORMED, 越⼩的数值代表更⾼的匹配结果. ⽽对于其他⽅法, 数值越⼤匹配越好
if (match_method == 0 || match_method == 1)
{
matchLoc = minLoc;rectangle函数opencv
}
else
{
matchLoc = maxLoc;
}
//框出最终结果
rectangle(img_display_0, matchLoc, Point(matchLoc.x + ls, matchLoc.y + ws), Scalar(0, 255, 0), 2, 8, 0); //将得到的结果⽤矩形框起来 rectangle(result_0, matchLoc, Point(matchLoc.x + ls, matchLoc.y + ws), Scalar(0, 255, 0), 2, 8, 0);
imwrite("C:\\Users\\JSM-SQ\\Desktop\\图框TIF\\result.jpg", img_display_0);
return;
}
int main(int argc, char** argv)
{
img = imread("C:\\Users\\JSM-SQ\\Desktop\\图框TIF\\test_tar.jpg");//载⼊待匹配图像
templ = imread("C:\\Users\\JSM-SQ\\Desktop\\图框TIF\\test_templ.jpg");
MatchingMethod_0(templ, 0);
return 0;
}
3.结果图像
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论