Input Image -- https://i.stack.imgur.com/hIqEd.png Output Image with Convex Hull of contours drawn -- https://i.stack.imgur.com/pEKPP.png
Also any help on how to get one contour will be much appreciated?
Input Image -- https://i.stack.imgur.com/hIqEd.png Output Image with Convex Hull of contours drawn -- https://i.stack.imgur.com/pEKPP.png
Also any help on how to get one contour will be much appreciated?
The trick to retrieve the image as one contour seems to be processing the image with Canny
before executing cvFindContours
.
IplImage* src = cvLoadImage(argv[1], CV_LOAD_IMAGE_GRAYSCALE);
IplImage* cc_img = cvCreateImage( cvGetSize(src), src->depth, 3 );
cvSetZero(cc_img);
CvScalar(ext_color);
CvMemStorage *mem;
mem = cvCreateMemStorage(0);
CvSeq *contours = 0;
// edges returned by Canny might have small gaps between them, which causes some problems during contour detection
// Simplest way to solve this s to "dilate" the image.
cvCanny(src, src, 10, 50, 3);
cvShowImage("Tutorial", src);
cvWaitKey(0);
int n = cvFindContours( src, mem, &contours, sizeof(CvContour), CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0));
CvSeq* ptr = 0;
for (ptr = contours; ptr != NULL; ptr = ptr->h_next)
{
ext_color = CV_RGB( rand()&255, rand()&255, rand()&255 ); //randomly coloring different contours
cvDrawContours(cc_img, ptr, ext_color, CV_RGB(0,0,0), -1, CV_FILLED, 8, cvPoint(0,0));
}
cvNamedWindow("Tutorial");
cvShowImage("Tutorial", cc_img);
//cvSaveImage("out.png", cc_img);
cvWaitKey(0);
Outputs: