mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
106 lines
2.5 KiB
106 lines
2.5 KiB
#ifdef _CH_ |
|
#pragma package <opencv> |
|
#endif |
|
|
|
#define CV_NO_BACKWARD_COMPATIBILITY |
|
|
|
#ifndef _EiC |
|
#include "cv.h" |
|
#include "highgui.h" |
|
#include <stdlib.h> |
|
#endif |
|
|
|
#define ARRAY 1 |
|
|
|
int main( int argc, char** argv ) |
|
{ |
|
IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 ); |
|
#if !ARRAY |
|
CvMemStorage* storage = cvCreateMemStorage(0); |
|
#endif |
|
|
|
cvNamedWindow( "hull", 1 ); |
|
|
|
for(;;) |
|
{ |
|
char key; |
|
int i, count = rand()%100 + 1, hullcount; |
|
CvPoint pt0; |
|
#if !ARRAY |
|
CvSeq* ptseq = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2, sizeof(CvContour), |
|
sizeof(CvPoint), storage ); |
|
CvSeq* hull; |
|
|
|
for( i = 0; i < count; i++ ) |
|
{ |
|
pt0.x = rand() % (img->width/2) + img->width/4; |
|
pt0.y = rand() % (img->height/2) + img->height/4; |
|
cvSeqPush( ptseq, &pt0 ); |
|
} |
|
hull = cvConvexHull2( ptseq, 0, CV_CLOCKWISE, 0 ); |
|
hullcount = hull->total; |
|
#else |
|
CvPoint* points = (CvPoint*)malloc( count * sizeof(points[0])); |
|
int* hull = (int*)malloc( count * sizeof(hull[0])); |
|
CvMat pointMat = cvMat( 1, count, CV_32SC2, points ); |
|
CvMat hullMat = cvMat( 1, count, CV_32SC1, hull ); |
|
|
|
for( i = 0; i < count; i++ ) |
|
{ |
|
pt0.x = rand() % (img->width/2) + img->width/4; |
|
pt0.y = rand() % (img->height/2) + img->height/4; |
|
points[i] = pt0; |
|
} |
|
cvConvexHull2( &pointMat, &hullMat, CV_CLOCKWISE, 0 ); |
|
hullcount = hullMat.cols; |
|
#endif |
|
cvZero( img ); |
|
for( i = 0; i < count; i++ ) |
|
{ |
|
#if !ARRAY |
|
pt0 = *CV_GET_SEQ_ELEM( CvPoint, ptseq, i ); |
|
#else |
|
pt0 = points[i]; |
|
#endif |
|
cvCircle( img, pt0, 2, CV_RGB( 255, 0, 0 ), CV_FILLED, CV_AA, 0 ); |
|
} |
|
|
|
#if !ARRAY |
|
pt0 = **CV_GET_SEQ_ELEM( CvPoint*, hull, hullcount - 1 ); |
|
#else |
|
pt0 = points[hull[hullcount-1]]; |
|
#endif |
|
|
|
for( i = 0; i < hullcount; i++ ) |
|
{ |
|
#if !ARRAY |
|
CvPoint pt = **CV_GET_SEQ_ELEM( CvPoint*, hull, i ); |
|
#else |
|
CvPoint pt = points[hull[i]]; |
|
#endif |
|
cvLine( img, pt0, pt, CV_RGB( 0, 255, 0 ), 1, CV_AA, 0 ); |
|
pt0 = pt; |
|
} |
|
|
|
cvShowImage( "hull", img ); |
|
|
|
key = (char) cvWaitKey(0); |
|
if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC' |
|
break; |
|
|
|
#if !ARRAY |
|
cvClearMemStorage( storage ); |
|
#else |
|
free( points ); |
|
free( hull ); |
|
#endif |
|
} |
|
|
|
cvDestroyWindow( "hull" ); |
|
return 0; |
|
} |
|
|
|
#ifdef _EiC |
|
main(1,"convexhull.c"); |
|
#endif |
|
|
|
|