c++OpenCV实现边缘模板匹配算法匹配多个目标完整算法
时间: 2023-10-12 13:36:29 浏览: 108
基于OpenCV多目标的模板匹配算法
4星 · 用户满意度95%
下面是使用C++和OpenCV库实现边缘模板匹配算法匹配多个目标的完整代码,注释中有详细的说明:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 加载原始图像和模板图像
Mat img = imread("image.jpg");
Mat temp = imread("template.jpg");
// 将模板图像转换为灰度图像
Mat temp_gray;
cvtColor(temp, temp_gray, COLOR_BGR2GRAY);
// 使用Canny边缘检测算法检测模板图像的边缘
Mat edges;
Canny(temp_gray, edges, 50, 200);
// 在原始图像中搜索与模板图像匹配的边缘
Mat result;
matchTemplate(img, edges, result, TM_CCOEFF_NORMED);
// 使用阈值来确定匹配结果的位置
double threshold = 0.8;
Mat locations;
findNonZero(result > threshold, locations);
// 在原始图像中绘制矩形框来标记匹配的位置
for (int i = 0; i < locations.total(); i++)
{
Point loc = locations.at<Point>(i);
rectangle(img, loc, Point(loc.x + temp.cols, loc.y + temp.rows), Scalar(0, 0, 255), 2);
}
// 显示结果
namedWindow("Result", WINDOW_NORMAL);
imshow("Result", img);
waitKey(0);
destroyAllWindows();
return 0;
}
```
这段代码与之前的代码基本相同,只是在绘制矩形框时使用了`locations.at<Point>(i)`来获取匹配结果的位置。这样可以遍历所有的匹配结果,并在原始图像中绘制矩形框来标记它们。
需要注意的是,如果图像中有多个目标,可能会出现匹配结果重叠的情况。这时可以对匹配结果进行非极大值抑制(Non-Maximum Suppression,NMS),只保留得分最高的匹配结果。NMS的具体实现可以参考其他的开源代码。
阅读全文