OpenCV4通过findContours找到指定轮廓后用drawContours填充制作掩膜,c++
时间: 2023-11-04 18:08:13 浏览: 85
OpenCV实现图像轮廓查找(C++实现).zip
使用OpenCV4中的`findContours`函数可以找到指定的轮廓,然后使用`drawContours`函数填充制作掩膜,具体步骤如下:
1. 首先读入需要处理的图像,转化为灰度图像。
```c++
Mat img = imread("image.jpg");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
```
2. 对灰度图像进行二值化处理,得到二值图像。
```c++
Mat binary;
threshold(gray, binary, 100, 255, THRESH_BINARY);
```
3. 使用`findContours`函数找到指定的轮廓,并存储在一个向量中。
```c++
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
```
4. 创建一个与原图像大小相同的掩膜,并使用`drawContours`函数填充指定轮廓。
```c++
Mat mask = Mat::zeros(img.size(), CV_8UC1);
Scalar color(255, 255, 255);
drawContours(mask, contours, 0, color, FILLED);
```
5. 最后将掩膜应用于原图像,得到指定轮廓部分的图像。
```c++
Mat result;
img.copyTo(result, mask);
```
完整代码如下:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat img = imread("image.jpg");
Mat gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
Mat binary;
threshold(gray, binary, 100, 255, THRESH_BINARY);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);
Mat mask = Mat::zeros(img.size(), CV_8UC1);
Scalar color(255, 255, 255);
drawContours(mask, contours, 0, color, FILLED);
Mat result;
img.copyTo(result, mask);
imshow("result", result);
waitKey(0);
return 0;
}
```
注意:上述代码仅针对单个轮廓进行操作。如果需要处理多个轮廓,需要在`findContours`函数中指定轮廓检测模式和轮廓逼近方法,并根据需要对轮廓进行筛选和分组。
阅读全文