Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using hierarchy in findContours () in OpenCV?

When finding contours, I used the CV_RETR_CCOMP argument. This is supposed to create a two level hierarchy - the the first level are for outer contours, the second level are for boundaries of the holes. However, I have never used a hierarchy before so I am not familiar with this.

Could someone instruct my on how to access the boundaries of the holes only? I want to disregard the outer contours and only draw the hole boundaries. Code examples will be appreciated. I am using the C++ interface not the C, so please don't suggest C functions (i.e. use findContours () instead of cvFindContours ()).

like image 965
fdh Avatar asked Dec 11 '11 02:12

fdh


People also ask

What is hierarchy in contours OpenCV?

This way, contours in an image has some relationship to each other. And we can specify how one contour is connected to each other, like, is it child of some other contour, or is it a parent etc. Representation of this relationship is called the Hierarchy.

How does findContours work in OpenCV?

To put in simple words findContours detects change in the image color and marks it as contour. As an example, the image of number written on paper the number would be detected as contour. The part that you want to detect should be white like above numbers in 1st image.

What is findContours OpenCV Python?

Contours are defined as the line joining all the points along the boundary of an image that are having the same intensity. Contours come handy in shape analysis, finding the size of the object of interest, and object detection. OpenCV has findContour() function that helps in extracting the contours from the image.


1 Answers

The hierarchy returned by findContours has the following form: hierarchy[idx][{0,1,2,3}]={next contour (same level), previous contour (same level), child contour, parent contour}

CV_RETR_CCOMP, returns a hierarchy of outer contours and holes. This means elements 2 and 3 of hierarchy[idx] have at most one of these not equal to -1: that is, each element has either no parent or child, or a parent but no child, or a child but no parent.

An element with a parent but no child would be a boundary of a hole.

That means you basically go through hierarchy[idx] and draw anything with hierarchy[idx][3]>-1.

Something like (works in Python, but haven't tested the C++. Idea is fine though.):

findContours( image, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE );  if ( !contours.empty() && !hierarchy.empty() ) {      // loop through the contours/hierarchy     for ( int i=0; i<contours.size(); i++ ) {          // look for hierarchy[i][3]!=-1, ie hole boundaries         if ( hierarchy[i][3] != -1 ) {             // random colour             Scalar colour( (rand()&255), (rand()&255), (rand()&255) );             drawContours( outImage, contours, i, colour );         }     } } 
like image 157
mathematical.coffee Avatar answered Oct 13 '22 04:10

mathematical.coffee