请给出c++代码使用opencv进行模版匹配的例子
时间: 2023-08-31 16:25:09 浏览: 127
### 回答1:
#include <iostream>
#include <opencv2/opencv.hpp> using namespace std;
using namespace cv; int main(int argc, char const *argv[])
{
Mat image = imread("template.jpg");
Mat src = imread("sample.jpg");
Mat result;
matchTemplate(src, image, result, TM_CCOEFF);
double minVal; double maxVal; Point minLoc; Point maxLoc;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);
rectangle(src, maxLoc, Point(maxLoc.x + image.cols, maxLoc.y + image.rows), Scalar(0, 0, 255), 2, 8, 0);
imshow("src", src);
waitKey(0);
return 0;
}
### 回答2:
#include <opencv2/opencv.hpp>
#include <iostream>
int main()
{
// 读取源图片和模板图片
cv::Mat srcImage = cv::imread("source_image.jpg");
cv::Mat templateImage = cv::imread("template_image.jpg");
// 创建结果矩阵
int resultWidth = srcImage.cols - templateImage.cols + 1;
int resultHeight = srcImage.rows - templateImage.rows + 1;
cv::Mat resultImage(resultHeight, resultWidth, CV_32FC1);
// 进行模板匹配操作
cv::matchTemplate(srcImage, templateImage, resultImage, cv::TM_CCOEFF_NORMED);
// 归一化结果矩阵
cv::normalize(resultImage, resultImage, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());
// 在结果矩阵中找到匹配程度最高的位置
double minValue;
double maxValue;
cv::Point minLoc;
cv::Point maxLoc;
cv::minMaxLoc(resultImage, &minValue, &maxValue, &minLoc, &maxLoc, cv::Mat());
// 绘制矩形框标注匹配结果
cv::rectangle(srcImage, maxLoc, cv::Point(maxLoc.x + templateImage.cols, maxLoc.y + templateImage.rows), cv::Scalar(0, 0, 255), 2, 8, 0);
// 显示原始图像和匹配结果
cv::namedWindow("Source Image", cv::WINDOW_NORMAL);
cv::imshow("Source Image", srcImage);
cv::namedWindow("Match Result", cv::WINDOW_NORMAL);
cv::imshow("Match Result", resultImage);
cv::waitKey(0);
return 0;
}
### 回答3:
以下是一个使用OpenCV进行模板匹配的C代码示例:
```c
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 加载原始图像和模板图像
Mat img = imread("原始图像.jpg", CV_LOAD_IMAGE_COLOR);
Mat templ = imread("模板图像.jpg", CV_LOAD_IMAGE_COLOR);
if (img.empty() || templ.empty())
{
cout << "无法读取图像文件" << endl;
return -1;
}
// 进行模板匹配
Mat result;
matchTemplate(img, templ, result, TM_CCOEFF_NORMED);
// 寻找匹配位置和最大匹配值
double minVal, maxVal;
Point minLoc, maxLoc;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);
// 绘制匹配结果
rectangle(img, maxLoc, Point(maxLoc.x + templ.cols, maxLoc.y + templ.rows), Scalar(0, 255, 0), 2);
// 显示结果
namedWindow("匹配结果", CV_WINDOW_NORMAL);
imshow("匹配结果", img);
waitKey(0);
return 0;
}
```
在这个例子中,首先我们使用`imread`函数加载了原始图像和模板图像。然后,我们调用`matchTemplate`函数来进行模板匹配,并将结果保存在`result`矩阵中。接下来,我们使用`minMaxLoc`函数找到最大匹配值和位置。最后,我们使用`rectangle`函数在原始图像上绘制一个矩形来标示匹配位置,并通过`imshow`函数显示结果。
需要注意的是,示例中的图像路径需要根据实际情况进行修改,并且需要确保OpenCV库已经正确地安装和配置。
阅读全文