我会详细讲解 “OpenCV模板匹配matchTemplate的实现”的完整攻略,下面是具体的步骤:
1. 准备工作
首先,我们需要引入OpenCV库,并导入需要的头文件。在C++代码中,我们可以使用以下代码实现引入:
#include <opencv2/opencv.hpp>
using namespace cv;
2. 读取图像
我们需要先读取需要进行模板匹配的原始图像和模板图像,并对其进行灰度转换。在读取图像的过程中,我们可以使用以下代码:
//读取原始图像和模板图像
Mat img = imread("原始图像.jpg");
Mat tpl = imread("模板图像.jpg");
//将图像转为灰度图像
Mat img_gray, tpl_gray;
cvtColor(img, img_gray, COLOR_BGR2GRAY);
cvtColor(tpl, tpl_gray, COLOR_BGR2GRAY);
3. 执行模板匹配
在将图像转为灰度图像的基础上,我们可以使用matchTemplate()函数对原始图像和模板图像进行模板匹配。其函数参数如下:
void matchTemplate(InputArray image, InputArray templ, OutputArray result, int method, InputArray mask=noArray());
其中,参数image、templ均为输入参数,分别为原始图像和模板图像;参数result为输出参数,用于保存匹配结果;参数method是匹配算法,如下表所示:
常数名称 | 意义 |
---|---|
TM_SQDIFF | 平方差匹配法 |
TM_SQDIFF_NORMED | 归一化平方差匹配法 |
TM_CCOEFF | 相关系数匹配法 |
TM_CCOEFF_NORMED | 归一化相关系数匹配法 |
TM_CCORR | 相关匹配法 |
TM_CCORR_NORMED | 归一化相关匹配法 |
其中,平方差匹配法(TM_SQDIFF)一般用于基准图像较小,需要在目标图像中寻找匹配区域的情况。而相关系数匹配法(TM_CCOEFF)一般用于基准图像较大,需要在目标图像中寻找相似度最高的区域的情况。
以下代码以归一化相关系数匹配法为例:
Mat match_img; //用于保存匹配结果
matchTemplate(img_gray, tpl_gray, match_img, TM_CCOEFF_NORMED);
4. 获取匹配结果
matchTemplate()函数将匹配结果保存在match_img中,接下来我们需要在match_img中寻找到相似度最高的区域。可以使用以下代码:
double min_val, max_val; //用于保存匹配值的最小值和最大值
Point min_loc, max_loc; //用于保存匹配值的最小位置和最大位置
minMaxLoc(match_img, &min_val, &max_val, &min_loc, &max_loc); //求得最大匹配值的位置
5. 显示结果
最后,将匹配结果显示出来。可以使用以下代码:
//在原始图像中,标出匹配的区域
rectangle(img, max_loc, Point(max_loc.x + tpl.cols, max_loc.y + tpl.rows), Scalar(0,0,255), 2, 8, 0);
//显示匹配结果
imshow("Match result", img);
waitKey(0);
至此,我们就完成了OpenCV模板匹配matchTemplate的实现过程。以下是两个可供参考的示例:
示例1:基于平方差匹配的模板匹配
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
//读取原始图像和模板图像
Mat img = imread("original.jpg");
Mat tpl = imread("template.jpg");
//将图像转为灰度图像
Mat img_gray, tpl_gray;
cvtColor(img, img_gray, COLOR_BGR2GRAY);
cvtColor(tpl, tpl_gray, COLOR_BGR2GRAY);
//执行模板匹配
Mat match_img;
matchTemplate(img_gray, tpl_gray, match_img, TM_SQDIFF);
//获取匹配结果
double min_val, max_val;
Point min_loc, max_loc;
minMaxLoc(match_img, &min_val, &max_val, &min_loc, &max_loc);
//在原始图像中,标出匹配的区域
rectangle(img, min_loc, Point(min_loc.x + tpl.cols, min_loc.y + tpl.rows), Scalar(0,0,255), 2, 8, 0);
//显示匹配结果
imshow("Match result", img);
waitKey(0);
return 0;
}
示例2:基于相关系数匹配的模板匹配
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
//读取原始图像和模板图像
Mat img = imread("original.jpg");
Mat tpl = imread("template.jpg");
//将图像转为灰度图像
Mat img_gray, tpl_gray;
cvtColor(img, img_gray, COLOR_BGR2GRAY);
cvtColor(tpl, tpl_gray, COLOR_BGR2GRAY);
//执行模板匹配
Mat match_img;
matchTemplate(img_gray, tpl_gray, match_img, TM_CCOEFF_NORMED);
//获取匹配结果
double min_val, max_val;
Point min_loc, max_loc;
minMaxLoc(match_img, &min_val, &max_val, &min_loc, &max_loc);
//在原始图像中,标出匹配的区域
rectangle(img, max_loc, Point(max_loc.x + tpl.cols, max_loc.y + tpl.rows), Scalar(0,0,255), 2, 8, 0);
//显示匹配结果
imshow("Match result", img);
waitKey(0);
return 0;
}
希望以上讲解能够对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:OpenCV模板匹配matchTemplate的实现 - Python技术站