我有一个要绘制的轮廓列表。这些轮廓中的一些相交。

当我想用OpenCV绘制它们时,我只需要使用cv::drawContours函数。

但是,这种行为很奇怪。

这是官方documentation的报价

C++: void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )
Parameters:
contourIdx – Parameter indicating a contour to draw. If it is negative, all the contours are drawn.

因此,从文档中,如果我想绘制所有用黑色填充的区域,则只需执行以下操作:
cv::drawContours(this->mask.raw,
                 this->areas, -1,
                 cv::Scalar(0,0,0),
                 cv::FILLED);

但是,这给了我以下输出:

c++ - OpenCV drawContours奇怪的行为-LMLPHP

在这里,我们可以清楚地看到我的所有区域都不是黑色的。

但是,如果我遍历我的区域列表并为每个区域调用cv::drawContours:
unsigned int i = 0;
for (const auto& area : this->areas)
  cv::drawContours(this->mask.raw,
                   this->areas, i++,
                   cv::Scalar(0,0,0),
                   cv::FILLED);

我得到的输出与第一个输出完全不同:

c++ - OpenCV drawContours奇怪的行为-LMLPHP

我错过了文档中的某些内容吗?有人可以向我解释cv::drawContours的行为,对所有区域都调用ojit_code,对每个区域每次调用都有什么区别?

最佳答案

我认为当您将contourIdx传递为Negative时,我认为drawContour函数只是绘制轮廓而不会像CV_FILLED所示那样填充。通过显式循环每个轮廓,您将获得与您一样的结果。

09-06 23:46