cv2.findContours 找外圈的轮廓
时间: 2024-04-26 12:17:44 浏览: 272
cv2.findContours是OpenCV库中的一个函数,用于在图像中查找轮廓。它可以帮助我们找到图像中物体的边界,并将其表示为一系列的点集。
使用cv2.findContours函数需要传入一个二值化的图像作为输入参数。该函数会返回一个包含所有轮廓的列表,每个轮廓都是一个点集。
以下是cv2.findContours函数的基本用法:
contours, hierarchy = cv2.findContours(image, mode, method)
其中,参数image是输入的二值化图像,mode是轮廓检索模式,method是轮廓近似方法。
常用的轮廓检索模式有两种:
- cv2.RETR_EXTERNAL:只检测外部轮廓
- cv2.RETR_TREE:检测所有轮廓,并建立轮廓之间的层级关系
常用的轮廓近似方法有三种:
- cv2.CHAIN_APPROX_NONE:存储所有的轮廓点
- cv2.CHAIN_APPROX_SIMPLE:压缩水平、垂直和对角线方向上的冗余点,只保留端点
- cv2.CHAIN_APPROX_TC89_L1和cv2.CHAIN_APPROX_TC89_KCOS:应用Teh-Chin链逼近算法
返回值contours是一个包含所有轮廓的列表,每个轮廓都是一个点集。hierarchy是一个包含轮廓层级关系的数组。
相关问题
cv::findContours 查找 中心为空的圆圈的两个轮廓
中心为空的圆圈通常指的是环形,它有两个轮廓:内轮廓和外轮廓。如果您想查找中心为空的圆圈的两个轮廓,可以使用cv::findContours函数,并指定RETR_LIST模式。以下是一个示例代码:
```c++
cv::Mat img; // 二值化图像
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(img, contours, hierarchy, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
// 遍历轮廓
for (int i = 0; i < contours.size(); i++) {
double area = cv::contourArea(contours[i]);
// 如果轮廓面积太小,则跳过
if (area < 100) continue;
// 判断轮廓是否为环形
std::vector<cv::Point> hull;
cv::convexHull(contours[i], hull);
double hull_area = cv::contourArea(hull);
if (std::abs(hull_area - area) > 1e-3) continue;
// 计算内外轮廓
std::vector<std::vector<cv::Point>> inner_contours, outer_contours;
cv::Mat mask = cv::Mat::zeros(img.size(), CV_8UC1);
cv::drawContours(mask, contours, i, cv::Scalar(255), cv::FILLED);
cv::findContours(mask, inner_contours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
cv::drawContours(mask, inner_contours, -1, cv::Scalar(0), cv::FILLED);
cv::findContours(mask, outer_contours, cv::RETR_LIST, cv::CHAIN_APPROX_SIMPLE);
// 绘制内外轮廓
cv::drawContours(img, inner_contours, -1, cv::Scalar(255), 2);
cv::drawContours(img, outer_contours, -1, cv::Scalar(255), 2);
}
```
上述代码首先遍历所有轮廓,计算其面积并判断是否太小。然后使用cv::convexHull函数计算轮廓的凸包,并计算凸包面积。如果轮廓面积与凸包面积差异较大,则认为它不是环形。然后使用cv::drawContours函数生成轮廓掩码,并使用cv::findContours函数查找内外轮廓。最后使用cv::drawContours函数绘制内外轮廓。
opencvsharp联通区域提取如何提取内圈的矩形,滤掉外圈的矩形
在OpenCVSharp中,如果你想要从图像中提取出联通区域的内圈矩形,并滤掉外圈较大的矩形,你可以按照以下步骤操作:
1. **读取和预处理图像**:
首先,使用`cv2.imread()`函数加载图片,然后可以应用灰度化、二值化等处理以简化后续操作。
```csharp
using OpenCvSharp;
// ...
Mat srcImage = Cv2.ImRead("your_image.jpg", ImreadModes.Color);
Mat grayImage = new Mat();
Cv2.CvtColor(srcImage, grayImage, ColorConversionCodes.Bgr2Gray);
Mat binaryImage = new Mat();
Cv2.Threshold(grayImage, binaryImage, thresholdValue, 255, ThresholdTypes.Binary);
```
2. **连接组件分析(Connected Component Analysis, CCA)**:
使用`Cv2.FindContours()`找到所有的连通区域,包括内外圈。这里需要指定轮廓检测模式和链接算法。
```csharp
阅读全文