/********************************************************************
创建日期: 2020/10/14
创建时间: 12:10
文件名字: C:\Users\17806\Desktop\靶标特征点提取\templateMatching\getPoints.cpp
--------------------------------------
文件功能:
--------------------------------------
作者: K&J
--------------------------------------
修改人:
--------------------------------------
版本号: V1.0.1
版权所有: K&J(康杰)
*********************************************************************/
//------------------------------------------------------------------//
// 头文件、宏、命名空间 //
//------------------------------------------------------------------//
#include <iostream>
#include <opencv2/opencv.hpp>
#include "GetAllMinLoc.h"
using namespace cv;
using namespace std;
//------------------------------------------------------------------//
// 全局变量声明 //
//------------------------------------------------------------------//

//------------------------------------------------------------------//
// 全局函数声明 //
//------------------------------------------------------------------//

//------------------------------------------------------------------//
// 主函数,程序入口 //
//------------------------------------------------------------------//
int main()
{
Mat img = imread("0.jpg");//从指定路径加载图像
Mat img_temp = imread("模板1.jpg");
if (!img.data || !img_temp.data)//加载图像失败
{
printf("Fault to load image!\n\r");
return -1;
}
namedWindow("【模板图像】", 0);
namedWindow("【待测图像】", 0);
namedWindow("【结果图像】", 0);
resizeWindow("【模板图像】", img.cols / 2, img.rows / 2);
resizeWindow("【待测图像】", img_temp.cols / 2, img_temp.rows / 2);
resizeWindow("【结果图像】", img.cols / 2, img.rows / 2);
imshow("【待测图像】", img);
imshow("【模板图像】", img_temp);

//调用函数检测
vector<Point> P;//存储所有检测目标的坐标
GetAllMinLoc(img, img_temp, 0.1, Scalar(0, 0, 0), &P);
//根据获取的全部坐标数据圈出待检测目标
for (int k = 0; k < P.size(); k++)
{
Point loc = P[k];
rectangle(img, Rect(loc.x, loc.y, img_temp.cols, img_temp.rows), Scalar(0, 0, 255), 2, 8);
}
imshow("【结果图像】", img);
waitKey(0);
return 0;

}
//------------------------------------------------------------------//
// 子函数实现 //
//------------------------------------------------------------------//
/*
*函数功能:基于matchTemplate函数检测原图像中所有的目标
*参数说明:
* image:输入原图像
* templ:输入的模板图像
* sim: 相似度,0~1之间,越接近0越相似
* mask: 覆盖区颜色,一般情况下直接取黑色即可Scalar(0,0,0)
* *all_min_loc:所有匹配到的目标的坐标
*/
#include "GetAllMinLoc.h"
void GetAllMinLoc(Mat image, Mat templ, double sim, Scalar mask, vector<Point>* all_min_loc)
{
bool test = true;
int i = 0;
int src_Width = image.cols, src_Height = image.rows;
int templ_Width = templ.cols, templ_Height = templ.rows;
double min_value, max_value;
Point min_Loc, max_Loc;
Mat img_result;
Mat img_clon = image.clone();
if (templ_Width > src_Width || templ_Height > src_Height)printf("模板尺寸大于原图像,请选择正确的模板\n");
while (1)
{
matchTemplate(img_clon, templ, img_result, TM_SQDIFF_NORMED);
minMaxLoc(img_result, &min_value, &max_value, &min_Loc, &max_Loc);
if (min_value < sim)//检测结果符合预期范围
{
all_min_loc->push_back(min_Loc);
rectangle(img_clon, Rect(min_Loc.x, min_Loc.y, templ_Width, templ_Height), mask, -1);//掩盖检测到的第一块区域
}
else break;
}
}

效果不是很好,而且速度很慢,受图片质量影响很大。

OpenCV-模板匹配_scala

OpenCV-模板匹配_scala_02

OpenCV-模板匹配_scala_03