У меня есть список контуров для рисования. Некоторые из этих контуров пересекаются.
Когда я хочу нарисовать их с помощью 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
и в чем разница — называть его одним для всех областей и каждый раз называть его для каждой области?
Я думаю, что когда вы проходите contourIdx
как отрицательный, я думаю, drawContour
Функция просто рисует контуры без заливки, как вы указали CV_FILLED
, Явно зацикливаясь на каждом контуре, вы получите результат, который вы получили.
Я наконец-то открыл проблему в репозитории opencv github: https://github.com/Itseez/opencv/issues/5256.