2 #pragma package <opencv>
5 #define CV_NO_BACKWARD_COMPATIBILITY
15 int main( int argc, char** argv )
17 IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
19 CvMemStorage* storage = cvCreateMemStorage(0);
22 cvNamedWindow( "hull", 1 );
27 int i, count = rand()%100 + 1, hullcount;
30 CvSeq* ptseq = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2, sizeof(CvContour),
31 sizeof(CvPoint), storage );
34 for( i = 0; i < count; i++ )
36 pt0.x = rand() % (img->width/2) + img->width/4;
37 pt0.y = rand() % (img->height/2) + img->height/4;
38 cvSeqPush( ptseq, &pt0 );
40 hull = cvConvexHull2( ptseq, 0, CV_CLOCKWISE, 0 );
41 hullcount = hull->total;
43 CvPoint* points = (CvPoint*)malloc( count * sizeof(points[0]));
44 int* hull = (int*)malloc( count * sizeof(hull[0]));
45 CvMat pointMat = cvMat( 1, count, CV_32SC2, points );
46 CvMat hullMat = cvMat( 1, count, CV_32SC1, hull );
48 for( i = 0; i < count; i++ )
50 pt0.x = rand() % (img->width/2) + img->width/4;
51 pt0.y = rand() % (img->height/2) + img->height/4;
54 cvConvexHull2( &pointMat, &hullMat, CV_CLOCKWISE, 0 );
55 hullcount = hullMat.cols;
58 for( i = 0; i < count; i++ )
61 pt0 = *CV_GET_SEQ_ELEM( CvPoint, ptseq, i );
65 cvCircle( img, pt0, 2, CV_RGB( 255, 0, 0 ), CV_FILLED, CV_AA, 0 );
69 pt0 = **CV_GET_SEQ_ELEM( CvPoint*, hull, hullcount - 1 );
71 pt0 = points[hull[hullcount-1]];
74 for( i = 0; i < hullcount; i++ )
77 CvPoint pt = **CV_GET_SEQ_ELEM( CvPoint*, hull, i );
79 CvPoint pt = points[hull[i]];
81 cvLine( img, pt0, pt, CV_RGB( 0, 255, 0 ), 1, CV_AA, 0 );
85 cvShowImage( "hull", img );
87 key = (char) cvWaitKey(0);
88 if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC'
92 cvClearMemStorage( storage );
99 cvDestroyWindow( "hull" );
104 main(1,"convexhull.c");