将模板图片中的角点在原图中标记出来流程:
第一步:读入原图像;
第二步:在原图像上创建ROI区域作为我们的模板;
第三部:提取角点信息,并在模板图像和原图像上进行显示。
代码:
#include<iostream>
#include<opencv2/imgproc.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/core.hpp>
using namespace std;
using namespace cv;
int main()
{
//读入图像
Mat src = imread("C:\\Users\\H\\Desktop\\14.png");
if (src.empty())
{
cout << "请检查图像是否存在..." << endl;
return -1;
}
cout << "src.cols:" << src.cols << endl;
cout << "src.rows: " << src.rows << endl;
//namedWindow("src");
//imshow("src", src);
//创建模板
Point pt(334, 168);
int w = 300;
int h = 300;
Mat ROI = src(Rect(pt.x, pt.y, w, h));
//namedWindow("ROI");
//imshow("ROI", ROI);
//imwrite("C:\\Users\\H\\Desktop\\4.png",ROI);
Mat grayROI;
cvtColor(ROI, grayROI, COLOR_BGR2GRAY);
//提取角点
//创建存储角点容器
vector<Point2f>ROIcorners;
int maxCorners = 3;
double qualityLevel = 0.1;
double minDistance = 1;
goodFeaturesToTrack(grayROI, ROIcorners, maxCorners, qualityLevel, minDistance);
//在模板图像上绘制出提取出得角点信息
for (size_t i = 0; i < ROIcorners.size(); i++)
{
circle(ROI, ROIcorners[i], 5, Scalar(255, 0, 0), -1, 8);
}
//显示模板图像上角点信息
cout << "ROIcorners[0]: " << ROIcorners[0] << endl;
cout << "ROIcorners[1]: " << ROIcorners[1] << endl;
cout << "ROIcorners[2]: " << ROIcorners[2] << endl;
namedWindow("ROI corners");
imshow("ROI corners",ROI);
cout << "**************************" << endl;
// 在原图上绘制提取出的角点信息
// 相对坐标转换
for (size_t i = 0; i < ROIcorners.size(); i++)
{
circle(src, Point(ROIcorners[i].x+pt.x,ROIcorners[i].y+pt.y), 5, Scalar(0, 0, 255),-1,8);
}
cout << "Srccorners[0]: " << Point(ROIcorners[0].x + pt.x, ROIcorners[0].y + pt.y) << endl;
cout << "Srccorners[1]: " << Point(ROIcorners[1].x + pt.x, ROIcorners[1].y + pt.y) << endl;
cout << "Srccorners[2]: " << Point(ROIcorners[2].x + pt.x, ROIcorners[2].y + pt.y) << endl;
namedWindow("src corners");
imshow("src corners", src);
// 进行模板匹配
int res_cols = src.cols - ROI.cols + 1;
int res_rows = src.rows - ROI.rows + 1;
Mat res = Mat(res_cols, res_rows, CV_32FC1);
matchTemplate(src, ROI, res, TM_CCOEFF_NORMED);
double minval, maxval;
Point minloc, maxloc, matchloc;
//在模板中找出匹配的最大最小值以及最大最小值对应位置
minMaxLoc(res, &minval, &maxval, &minloc, &maxloc, Mat());
matchloc = maxloc;
// 在匹配结果中绘制矩形
Mat rect;
cvtColor(src, rect, COLOR_BGR2RGB);
rectangle(rect, Rect(matchloc.x, matchloc.y, ROI.cols, ROI.rows), Scalar(0, 0, 255), 3);
namedWindow("rect");
imshow("rect", rect);
waitKey(0);
return 0;
}
将模板中角点在原图中绘制结果:
模板匹配结果