cv::findContours 查找 圆圈的两个轮廓
时间: 2023-08-02 22:08:24 浏览: 131
首先需要明确的是,圆形只有一个轮廓,因为它没有内部空洞。如果您是想查找圆形的边界,可以使用cv::findContours函数。以下是一个示例代码:
```c++
cv::Mat img; // 二值化图像
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(img, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 遍历轮廓
for (int i = 0; i < contours.size(); i++) {
double area = cv::contourArea(contours[i]);
// 如果轮廓面积太小,则跳过
if (area < 100) continue;
// 计算轮廓的最小外接圆
cv::Point2f center;
float radius;
cv::minEnclosingCircle(contours[i], center, radius);
// 绘制圆形
cv::circle(img, center, radius, cv::Scalar(255, 255, 255), 2);
}
```
注意,上述代码仅适用于查找单个圆形的情况,如果图像中有多个圆形,则需要对每个圆形的轮廓进行处理。
相关问题
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函数绘制内外轮廓。
cv::findContours();得到子轮廓
cv::findContours() 是 OpenCV 库中的一个函数,用于在二值图像中查找轮廓。它可以帮助我们找到图像中的所有轮廓,并将其存储为一个轮廓向量。
使用 cv::findContours() 函数可以得到子轮廓的步骤如下:
1. 首先,需要创建一个二值图像,可以通过阈值化、边缘检测等方法得到。
2. 然后,创建一个空的轮廓向量,用于存储找到的轮廓。
3. 调用 cv::findContours() 函数,传入二值图像和轮廓向量作为参数。
4. 在函数调用后,轮廓向量将被填充上找到的轮廓信息。
5. 可以通过遍历轮廓向量来访问每个子轮廓的信息。
以下是一个示例代码,展示了如何使用 cv::findContours() 函数来获取子轮廓:
```cpp
cv::Mat binaryImage; // 二值图像
std::vector<std::vector<cv::Point>> contours; // 轮廓向量
// 阈值化或边缘检测等操作得到二值图像
cv::findContours(binaryImage, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 遍历轮廓向量,访问每个子轮廓的信息
for (int i = 0; i < contours.size(); i++) {
std::vector<cv::Point> contour = contours[i];
// 处理子轮廓的代码
}
```