2

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

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

但是,这种行为很奇怪。

这是官方文档的引用

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);

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

在此处输入图像描述

在这里,我们可以清楚地看到我的所有区域都没有被黑色填充。

但是,如果我遍历我的区域列表并调用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);

我得到了很好的输出,这与第一个完全不同:

在此处输入图像描述

我是否错过了文档中的某些内容?有人可以解释一下我的行为cv::drawContours以及将其称为所有区域的行为以及每次对每个区域都调用它有什么不同?

4

2 回答 2

0

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

于 2015-07-26T12:38:10.217 回答
0

我终于在 opencv github 存储库上打开了一个问题:https ://github.com/Itseez/opencv/issues/5256 。

于 2015-09-04T06:45:15.627 回答