给了两幅图像怎么使用openCV怎么以一幅图为基准找到另一附图的不同的地方
时间: 2024-02-09 09:13:39 浏览: 48
您可以通过以下步骤使用OpenCV在两幅图像中找到不同的地方:
1. 加载两幅图像。
```c++
cv::Mat img1 = cv::imread("image1.jpg");
cv::Mat img2 = cv::imread("image2.jpg");
```
2. 将两幅图像转换为灰度图。
```c++
cv::Mat gray1, gray2;
cv::cvtColor(img1, gray1, cv::COLOR_BGR2GRAY);
cv::cvtColor(img2, gray2, cv::COLOR_BGR2GRAY);
```
3. 计算两幅图像的差异。
```c++
cv::Mat diff;
cv::absdiff(gray1, gray2, diff);
```
4. 对差异图像进行二值化处理。
```c++
cv::Mat thresh;
cv::threshold(diff, thresh, 30, 255, cv::THRESH_BINARY);
```
5. 使用形态学算法对二值化图像进行处理,以去除噪声。
```c++
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
cv::morphologyEx(thresh, thresh, cv::MORPH_OPEN, kernel);
```
6. 使用轮廓检测算法找到差异区域的边缘。
```c++
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(thresh, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
```
7. 绘制矩形框来标记差异区域。
```c++
for (int i = 0; i < contours.size(); i++) {
cv::Rect rect = cv::boundingRect(contours[i]);
cv::rectangle(img2, rect, cv::Scalar(0, 0, 255), 2);
}
```
完整代码如下:
```c++
#include <opencv2/opencv.hpp>
int main() {
// 加载两幅图像
cv::Mat img1 = cv::imread("image1.jpg");
cv::Mat img2 = cv::imread("image2.jpg");
// 将两幅图像转换为灰度图
cv::Mat gray1, gray2;
cv::cvtColor(img1, gray1, cv::COLOR_BGR2GRAY);
cv::cvtColor(img2, gray2, cv::COLOR_BGR2GRAY);
// 计算两幅图像的差异
cv::Mat diff;
cv::absdiff(gray1, gray2, diff);
// 对差异图像进行二值化处理
cv::Mat thresh;
cv::threshold(diff, thresh, 30, 255, cv::THRESH_BINARY);
// 使用形态学算法对二值化图像进行处理,以去除噪声
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
cv::morphologyEx(thresh, thresh, cv::MORPH_OPEN, kernel);
// 使用轮廓检测算法找到差异区域的边缘
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(thresh, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 绘制矩形框来标记差异区域
for (int i = 0; i < contours.size(); i++) {
cv::Rect rect = cv::boundingRect(contours[i]);
cv::rectangle(img2, rect, cv::Scalar(0, 0, 255), 2);
}
// 显示结果图像
cv::imshow("Diff Image", img2);
cv::waitKey(0);
return 0;
}
```
在上述代码中,我们首先加载了两幅图像,然后将它们转换为灰度图,并计算出它们的差异。接下来,我们对差异图像进行二值化处理,并使用形态学算法去除噪声。然后,我们使用轮廓检测算法找到差异区域的边缘,并绘制矩形框来标记差异区域。最后,我们显示结果图像。