opencv,c++版,如何识别轮廓中的孔洞,并将孔填充
时间: 2023-12-23 16:03:00 浏览: 81
在 OpenCV 中,可以使用 `cv::findContours()` 函数找到轮廓,然后使用 `cv::drawContours()` 函数绘制轮廓,并使用 `cv::fillPoly()` 函数填充孔洞。以下是示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img = imread("contour_image.png", IMREAD_GRAYSCALE);
if (img.empty())
{
cout << "Could not read the image" << endl;
return 1;
}
// 找到轮廓
vector<vector<Point>> contours;
findContours(img, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
// 绘制轮廓
Mat contourImg(img.size(), CV_8UC3, Scalar(0, 0, 0));
for (int i = 0; i < contours.size(); i++)
{
Scalar color(rand() & 255, rand() & 255, rand() & 255);
drawContours(contourImg, contours, i, color, 2);
}
// 填充孔洞
Mat filledImg(img.size(), CV_8UC3, Scalar(0, 0, 0));
for (int i = 0; i < contours.size(); i++)
{
fillPoly(filledImg, contours, i, Scalar(255, 255, 255));
}
namedWindow("Contours", WINDOW_NORMAL);
imshow("Contours", contourImg);
namedWindow("Filled Image", WINDOW_NORMAL);
imshow("Filled Image", filledImg);
waitKey(0);
return 0;
}
```
在这个示例中,我们首先读取了一个灰度图像,然后使用 `cv::findContours()` 函数找到轮廓。接下来,我们使用 `cv::drawContours()` 函数绘制轮廓,使用随机颜色。然后,我们创建了一个空的图像 `filledImg`,使用 `cv::fillPoly()` 函数填充孔洞。最后,我们显示了绘制轮廓后的图像和填充孔洞后的图像。
需要注意的是,这个示例代码中使用了随机颜色绘制轮廓,如果你想使用固定颜色,可以将 `Scalar` 替换为你需要的颜色。
阅读全文