如何用opencv findcontours()函数计算出子轮廓面积,用c++
时间: 2024-03-26 19:38:47 浏览: 170
可以通过以下步骤计算出子轮廓的面积:
1. 使用 `findContours()` 函数找到轮廓并存储在一个 `vector<vector<Point>>` 中,其中每个元素表示一个轮廓。
2. 对于每个轮廓,使用 `drawContours()` 函数将其绘制到一个黑色图像上,可以使用 `cv::Scalar(255,255,255)` 参数使轮廓填充为白色。
3. 使用 `countNonZero()` 函数计算轮廓内非零像素的数量,即为子轮廓的面积。
以下是示例代码:
```cpp
// 读取图像
cv::Mat image = cv::imread("image.png", cv::IMREAD_GRAYSCALE);
// 二值化图像
cv::Mat binary;
cv::threshold(image, binary, 128, 255, cv::THRESH_BINARY);
// 查找轮廓
std::vector<std::vector<cv::Point>> contours;
cv::findContours(binary, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 创建黑色图像
cv::Mat mask = cv::Mat::zeros(image.size(), CV_8UC1);
// 绘制轮廓并计算面积
for (int i = 0; i < contours.size(); i++) {
// 绘制轮廓
cv::drawContours(mask, contours, i, cv::Scalar(255,255,255), cv::FILLED);
// 计算子轮廓面积
int area = cv::countNonZero(mask);
std::cout << "Contour " << i << " area = " << area << std::endl;
// 清空图像,准备下一次绘制
mask.setTo(0);
}
```
这段代码会输出每个轮廓的面积。需要注意的是,如果轮廓包含空洞,则需要使用 `cv::RETR_TREE` 标志查找轮廓,并使用 `drawContours()` 函数绘制所有子轮廓,然后计算每个子轮廓的面积。
阅读全文