118 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifdef _CH_
 | |
| #pragma package <opencv>
 | |
| #endif
 | |
| 
 | |
| #ifndef _EiC
 | |
| #include "cv.h"
 | |
| #include "highgui.h"
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| #endif
 | |
| 
 | |
| #define ARRAY  1
 | |
| 
 | |
| void help()
 | |
| {
 | |
|     printf("\nThis program demonstrates finding the minimum enclosing box or circle of a set\n"
 | |
|         "of points using functions: minAreaRect() minEnclosingCircle().\n"
 | |
|         "Random points are generated and then enclosed.\n"
 | |
|         "Call:\n"
 | |
|         "./minarea\n");
 | |
| }
 | |
| 
 | |
| int main( int argc, char** argv )
 | |
| {
 | |
|     IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
 | |
| #if !ARRAY
 | |
|     CvMemStorage* storage = cvCreateMemStorage(0);
 | |
| #endif
 | |
|     help();
 | |
|     cvNamedWindow( "rect & circle", 1 );
 | |
| 
 | |
|     for(;;)
 | |
|     {
 | |
|         char key;
 | |
|         int i, count = rand()%100 + 1;
 | |
|         CvPoint pt0, pt;
 | |
|         CvBox2D box;
 | |
|         CvPoint2D32f box_vtx[4];
 | |
|         CvPoint2D32f center;
 | |
|         CvPoint icenter;
 | |
|         float radius;
 | |
| #if !ARRAY
 | |
|         CvSeq* ptseq = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2, sizeof(CvContour),
 | |
|                                      sizeof(CvPoint), storage );
 | |
|         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 );
 | |
|         }
 | |
| #ifndef _EiC /* unfortunately, here EiC crashes */
 | |
|         box = cvMinAreaRect2( ptseq, 0 );
 | |
| #endif
 | |
|         cvMinEnclosingCircle( ptseq, ¢er, &radius );
 | |
| #else
 | |
|         CvPoint* points = (CvPoint*)malloc( count * sizeof(points[0]));
 | |
|         CvMat pointMat = cvMat( 1, count, CV_32SC2, points );
 | |
| 
 | |
|         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;
 | |
|         }
 | |
| #ifndef _EiC
 | |
|         box = cvMinAreaRect2( &pointMat, 0 );
 | |
| #endif
 | |
|         cvMinEnclosingCircle( &pointMat, ¢er, &radius );
 | |
| #endif
 | |
|         cvBoxPoints( box, box_vtx );
 | |
|         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 );
 | |
|         }
 | |
| 
 | |
| #ifndef _EiC
 | |
|         pt0.x = cvRound(box_vtx[3].x);
 | |
|         pt0.y = cvRound(box_vtx[3].y);
 | |
|         for( i = 0; i < 4; i++ )
 | |
|         {
 | |
|             pt.x = cvRound(box_vtx[i].x);
 | |
|             pt.y = cvRound(box_vtx[i].y);
 | |
|             cvLine(img, pt0, pt, CV_RGB(0, 255, 0), 1, CV_AA, 0);
 | |
|             pt0 = pt;
 | |
|         }
 | |
| #endif
 | |
|         icenter.x = cvRound(center.x);
 | |
|         icenter.y = cvRound(center.y);
 | |
|         cvCircle( img, icenter, cvRound(radius), CV_RGB(255, 255, 0), 1, CV_AA, 0 );
 | |
| 
 | |
|         cvShowImage( "rect & circle", img );
 | |
| 
 | |
|         key = (char) cvWaitKey(0);
 | |
|         if( key == 27 || key == 'q' || key == 'Q' ) // 'ESC'
 | |
|             break;
 | |
| 
 | |
| #if !ARRAY
 | |
|         cvClearMemStorage( storage );
 | |
| #else
 | |
|         free( points );
 | |
| #endif
 | |
|     }
 | |
| 
 | |
|     cvDestroyWindow( "rect & circle" );
 | |
|     return 0;
 | |
| }
 | |
| 
 | |
| #ifdef _EiC
 | |
| main(1,"convexhull.c");
 | |
| #endif
 | |
| 
 | 
