OpenCV drawContours странное поведение

У меня есть список контуров для рисования. Некоторые из этих контуров пересекаются.

Когда я хочу нарисовать их с помощью 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 и в чем разница — называть его одним для всех областей и каждый раз называть его для каждой области?

2

Решение

Я думаю, что когда вы проходите contourIdx как отрицательный, я думаю, drawContour Функция просто рисует контуры без заливки, как вы указали CV_FILLED, Явно зацикливаясь на каждом контуре, вы получите результат, который вы получили.

0

Другие решения

Я наконец-то открыл проблему в репозитории opencv github: https://github.com/Itseez/opencv/issues/5256.

0