c++如何使用opencv中的matchtemplate函数
时间: 2024-10-16 19:16:41 浏览: 27
基于OpenCV的的图像旋转匹配算法模板(C++实现)
在C++中使用OpenCV的`matchTemplate`函数主要是为了在图像中查找模板是否匹配。这个函数通常用于模板匹配任务,比如人脸识别、物体检测等。以下是一个简单的步骤说明:
1. **包含头文件**:
首先需要在你的代码中包含`opencv2/core.hpp` 和 `opencv2/imgproc.hpp`,因为`matchTemplate`函数位于`imgproc`模块。
```cpp
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc.hpp>
```
2. **加载图像和模板**:
使用`imread`函数加载待搜索的原始图像(source)和模板(template)。
```cpp
cv::Mat src = cv::imread("original_image.jpg");
cv::Mat template_ = cv::imread("template_image.jpg", cv::IMREAD_GRAYSCALE);
```
3. **预处理**:
如果需要,对图像进行灰度化、平滑、二值化等预处理操作。
4. **计算模板匹配**:
调用`matchTemplate`函数,它返回一个与源图像大小相同的矩阵,其中每个元素表示对应位置上模板与源图像相似度。高分表示匹配较好。
```cpp
cv::Mat result;
cv::matchTemplate(src, template_, result, cv::TM_CCOEFF_NORMED); // 使用归一化的相关系数模板匹配
```
5. **设定阈值和查找峰值**:
设置一个阈值,通常通过非极大值抑制找出最佳匹配区域。
6. **绘制边界框**:
找到最高匹配点,然后可以使用`minMaxLoc`或自定义逻辑来获取边界框并显示结果。
```cpp
cv::Point matchLoc;
double min_val, max_val;
cv::Point minLoc, maxLoc;
cv::minMaxLoc(result, &min_val, &max_val, &minLoc, &maxLoc);
cv::rectangle(src, maxLoc, (maxLoc + template_.size()), Scalar(0, 255, 0), 2); // 绘制绿色矩形
```
7. **显示结果**:
最后,使用`imshow`函数显示原图和匹配结果。
```cpp
cv::imshow("Match Template Result", src);
cv::waitKey(0);
```
阅读全文