cv::findContours 查找 圆圈的两个轮廓
时间: 2023-08-02 14:08:24 浏览: 181
首先需要明确的是,圆形只有一个轮廓,因为它没有内部空洞。如果您是想查找圆形的边界,可以使用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::boundingRect()` 函数可以获取每个轮廓的外接矩形。该函数的参数是一个轮廓的点集,返回值是该轮廓的外接矩形。例如:
```cpp
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(image, contours, hierarchy, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
for (size_t i = 0; i < contours.size(); i++) {
cv::Rect bounding_rect = cv::boundingRect(contours[i]);
// 处理每个轮廓的外接矩形
}
```
在上面的代码中,`cv::boundingRect()` 函数获取每个轮廓的外接矩形,保存在 `bounding_rect` 变量中。你可以进一步处理每个轮廓的外接矩形,例如在图像上绘制矩形或者计算矩形面积等。
阅读全文