1.源码实现
#include <cstdio>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
void MatchingMethod(Mat &img, Mat &temp, Mat &result, const int match_method)
{
//将被显示的原图像
Mat img_display;
img.copyTo(img_display);
//创建输出结果的矩阵
int result_cols = img.cols - temp.cols + 1;
int result_rows = img.rows - temp.rows + 1;
//进行匹配和标准化
matchTemplate(img, temp, result, match_method);
normalize(result, result, 0, 1, NORM_MINMAX, -1, Mat());
//通过函数 minMaxLoc 定位最匹配的位置
Point minLoc, maxLoc, matchLoc;
double minVal, maxVal;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, Mat());
//对于方法 SQDIFF 和 SQDIFF_NORMED, 越小的数值代表更高的匹配结果. 而对于其他方法, 数值越大匹配越好
if(match_method == CV_TM_SQDIFF || match_method == CV_TM_SQDIFF_NORMED)
{
matchLoc = minLoc;
}
else
{
matchLoc = maxLoc;
}
//看看最终结果
rectangle(img_display, matchLoc, Point(matchLoc.x + temp.cols , matchLoc.y + temp.rows), Scalar(0, 0, 255), 2, 8, 0);
rectangle(result, matchLoc, Point(matchLoc.x + temp.cols , matchLoc.y + temp.rows), Scalar::all(0), 2, 8, 0);
//cout << img_display << endl;
imwrite("matchresult.jpg", img_display);
}
int main(int argc, char **argv)
{
if(argc <= 2)
{
return -1;
}
//载入原图像和模板块
Mat img = imread(argv[1], 1);
Mat temp = imread(argv[2], 1);
Mat result;
//设置方法Method: 0: SQDIFF 1: SQDIFF NORMED 2: TM CCORR 3: TM CCORR NORMED 4: TM COEFF 5: TM COEFF NORMED
int method = 1;
MatchingMethod(img, temp, result, method);
return 0;
}
2.编译源码
$ g++ -o test test.cpp -std=c++11 -I/usr/local/include/opencv4 -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_ml -Wl,-rpath=/usr/local/lib
3.运行及其结果
3.jpg6.jpg
matchresult.jpg
网友评论