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 ()).
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.
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.
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.
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 ); } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With