二値画像の輪郭を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;
}
個人用ツール