C++OPENCV 判断多个轮廓a是否在轮廓b内
时间: 2023-12-21 16:04:21 浏览: 193
在OpenCV中,可以通过函数`pointPolygonTest()`来判断点是否在轮廓内部,因此可以通过遍历轮廓a中的每个点,判断它们是否都在轮廓b内部来判断轮廓a是否在轮廓b内部。具体的代码实现可以参考下面的示例:
```c++
bool isContourInContour(const std::vector<cv::Point>& contour_a, const std::vector<cv::Point>& contour_b)
{
for (const auto& point : contour_a)
{
double distance = cv::pointPolygonTest(contour_b, point, true);
if (distance < 0) // 如果点在轮廓外部
{
return false;
}
}
return true;
}
```
其中,`contour_a`和`contour_b`分别表示待判断的两个轮廓,函数返回值为`true`表示轮廓a在轮廓b内部,返回值为`false`则表示轮廓a不在轮廓b内部。需要注意的是,该函数只适用于判断一个轮廓是否完全包含另一个轮廓,对于部分重叠的情况需要进行特殊处理。
相关问题
基于c++ opencv填充轮廓内部
要在C++ OpenCV中填充轮廓内部,可以使用cv::fillPoly函数。以下是一个示例代码:
```
// 创建一个黑色的图像
cv::Mat image = cv::Mat::zeros(500, 500, CV_8UC3);
// 定义一个包含多边形顶点的vector
std::vector<std::vector<cv::Point>> contours;
contours.push_back({cv::Point(100, 100), cv::Point(300, 100), cv::Point(200, 300)});
// 在图像上绘制多边形
cv::drawContours(image, contours, 0, cv::Scalar(255, 255, 255), -1);
// 填充多边形内部
cv::fillPoly(image, contours, cv::Scalar(255, 0, 0));
// 显示图像
cv::imshow("Filled Contour", image);
cv::waitKey(0);
```
在上面的代码中,我们首先创建了一个黑色的图像,然后定义了一个包含一个多边形顶点的vector。接着,我们使用`cv::drawContours`函数在图像上绘制了多边形,并使用`cv::fillPoly`函数填充了多边形内部。最后,我们显示了填充后的图像。
注意,在使用`cv::fillPoly`函数时,需要提供包含多边形顶点的vector和填充颜色。如果要填充多个轮廓,请将轮廓添加到vector中,并在调用`cv::fillPoly`函数时传递整个vector。
opencv c++ 轮廓面积排序
在 OpenCV 的 C++ 中,轮廓(Contours)是图像分析的重要部分,用于识别物体的边界。如果你有一个包含多个轮廓的图像,有时需要对它们按照面积进行排序,以便进一步处理。可以使用 ` Moments` 结构和 `contourArea()` 函数来获取轮廓的面积,然后结合 `std::sort()` 或类似算法来进行排序。
首先,你需要计算每个轮廓的面积并存储在一个容器(如向量或数组)中:
```cpp
vector<cv::Moments> moments;
for (const auto& contour : contours) {
cv::Moments moment = cv::moments(contour);
if (moment.m00 > 0) { // 只保留非空轮廓
double area = moment.m00; // 轮廓面积
moments.push_back(moment);
}
}
// 现在 moments 向量包含了轮廓的面积及其对应信息
```
接着,你可以使用 `std::sort()` 或 `std::stable_sort()` 来根据面积降序排列轮廓,假设我们有一个名为 `areaComparator` 的比较函数:
```cpp
bool areaComparator(const cv::Moments& a, const cv::Moments& b) {
return a.m00 > b.m00;
}
std::sort(moments.begin(), moments.end(), areaComparator);
```
这样,`moments` 向量就会按面积从大到小排序。
阅读全文