OpenCV drawContours 奇怪的行为
OpenCV drawContours strange behavior
我有一个要绘制的轮廓列表。其中一些等高线自相交。
当我想用 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);
但是,这给了我以下输出:
在这里,我们可以清楚地看到我所有的区域都没有填充黑色。
但是如果我遍历我的区域列表并为每个区域调用 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
的行为吗?对所有区域都调用它和对每个区域都调用它有什么不同?
我认为当您将 contourIdx
作为 Negative 传递时,我认为 drawContour
函数只是绘制等高线而不像您用 CV_FILLED
指示的那样进行填充。通过显式循环遍历每个轮廓,您将获得所得到的结果。
我终于在 opencv github 存储库上开了一个问题:https://github.com/Itseez/opencv/issues/5256。
我有一个要绘制的轮廓列表。其中一些等高线自相交。
当我想用 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);
但是,这给了我以下输出:
在这里,我们可以清楚地看到我所有的区域都没有填充黑色。
但是如果我遍历我的区域列表并为每个区域调用 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
的行为吗?对所有区域都调用它和对每个区域都调用它有什么不同?
我认为当您将 contourIdx
作为 Negative 传递时,我认为 drawContour
函数只是绘制等高线而不像您用 CV_FILLED
指示的那样进行填充。通过显式循环遍历每个轮廓,您将获得所得到的结果。
我终于在 opencv github 存储库上开了一个问题:https://github.com/Itseez/opencv/issues/5256。