二値画像の輪郭を1つ1つ取り出す
出典: Wikimura
カメラ校正が必要になったので、二値画像から輪郭抽出をしてキャリブレーションパターンを取り出そうと思う。 そのための練習プログラム。
#include <cv.h>
#include <highgui.h>
#define IMAGE_FILE "Contour/artificial-2.png"
#define HOLE_COLOR CV_RGB( 255, 0, 0)
#define OUTLINE_COLOR CV_RGB( 0, 255, 0)
int main (int argc, char *argv[])
{
IplImage *src, *dst, *tmp, *background;
CvMemStorage *storage = cvCreateMemStorage(0);
CvSeq *contours, *contour;
CvTreeNodeIterator iterator;
int found = 0;
if( ( src = cvLoadImage( IMAGE_FILE, CV_LOAD_IMAGE_GRAYSCALE)) == 0)
return -1;
tmp = cvCreateImage( cvGetSize( src), IPL_DEPTH_8U, 1);
dst = cvCreateImage( cvGetSize( src), IPL_DEPTH_8U, 3);
background = cvCreateImage( cvGetSize( src), IPL_DEPTH_8U, 3);
cvCopy( src, tmp);
cvCvtColor( src, background, CV_GRAY2BGR);
cvNamedWindow( "Source", CV_WINDOW_AUTOSIZE);
cvNamedWindow( "Contour", CV_WINDOW_AUTOSIZE);
found = cvFindContours( tmp, storage, &contours, sizeof( CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);
cvShowImage("Source", src);
// 輪郭を1つ1つ表示する
cvInitTreeNodeIterator( &iterator, (void*)contours, 10);
while( (contour = ( CvSeq*)cvNextTreeNode( &iterator)) != NULL)
{
cvCopy( background, dst);
cvDrawContours( dst, contour, HOLE_COLOR, OUTLINE_COLOR, 0, 2, CV_AA, cvPoint( 0, 0));
contour->
cvShowImage( "Contour", dst);
cvWaitKey(0);
}
cvDestroyAllWindows();
cvReleaseImage( &src);
cvReleaseImage( &dst);
cvReleaseImage( &tmp);
cvReleaseImage( &background);
cvReleaseMemStorage( &storage);
return 0;
}

