2015-07-24 3 views
2

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

Когда я хочу нарисовать их с помощью 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); 

Однако, это дает мне поток вывода:

enter image description here

Здесь мы можем ясно видеть, что все мои области НЕ заполнены черным.

Но если цикл по моему списку областей и вызвать 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); 

я получил хороший вывод, который довольно сильно отличается от первого:

enter image description here

Have Я что-то пропустил из документации? Может ли кто-нибудь объяснить мне поведение cv::drawContours и каково другое - назвать его одним для всех областей и называть его каждый раз для каждой области?

ответ

0

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

Смежные вопросы