hull.cpp
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:2k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include <stdlib.h>
  4. #define ARRAY  0 /* switch between array/sequence method by replacing 0<=>1 */
  5. int main( int argc, char** argv )
  6. {
  7.     IplImage* img = cvCreateImage( cvSize( 500, 500 ), 8, 3 );
  8.     cvNamedWindow( "hull", 1 );
  9. #if !ARRAY
  10.         CvMemStorage* storage = cvCreateMemStorage();
  11. #endif
  12.     for(;;)
  13.     {
  14.         int i, count = rand()%100 + 1, hullcount;
  15.         CvPoint pt0;
  16. #if !ARRAY
  17.         CvSeq* ptseq = cvCreateSeq( CV_SEQ_KIND_GENERIC|CV_32SC2, sizeof(CvContour),
  18.                                      sizeof(CvPoint), storage );
  19.         CvSeq* hull;
  20.         for( i = 0; i < count; i++ )
  21.         {
  22.             pt0.x = rand() % (img->width/2) + img->width/4;
  23.             pt0.y = rand() % (img->height/2) + img->height/4;
  24.             cvSeqPush( ptseq, &pt0 );
  25.         }
  26.         hull = cvConvexHull2( ptseq, 0, CV_CLOCKWISE, 0 );
  27.         hullcount = hull->total;
  28. #else
  29.         CvPoint* points = (CvPoint*)malloc( count * sizeof(points[0]));
  30.         int* hull = (int*)malloc( count * sizeof(hull[0]));
  31.         CvMat point_mat = cvMat( 1, count, CV_32SC2, points );
  32.         CvMat hull_mat = cvMat( 1, count, CV_32SC1, hull );
  33.         for( i = 0; i < count; i++ )
  34.         {
  35.             pt0.x = rand() % (img->width/2) + img->width/4;
  36.             pt0.y = rand() % (img->height/2) + img->height/4;
  37.             points[i] = pt0;
  38.         }
  39.         cvConvexHull2( &point_mat, &hull_mat, CV_CLOCKWISE, 0 );
  40.         hullcount = hull_mat.cols;
  41. #endif
  42.         cvZero( img );
  43.         for( i = 0; i < count; i++ )
  44.         {
  45. #if !ARRAY
  46.             pt0 = *CV_GET_SEQ_ELEM( CvPoint, ptseq, i );
  47. #else
  48.             pt0 = points[i];
  49. #endif
  50.             cvCircle( img, pt0, 2, CV_RGB( 255, 0, 0 ), CV_FILLED );
  51.         }
  52. #if !ARRAY
  53.         pt0 = **CV_GET_SEQ_ELEM( CvPoint*, hull, hullcount - 1 );
  54. #else
  55.         pt0 = points[hull[hullcount-1]];
  56. #endif
  57.         for( i = 0; i < hullcount; i++ )
  58.         {
  59. #if !ARRAY
  60.             CvPoint pt = **CV_GET_SEQ_ELEM( CvPoint*, hull, i );
  61. #else
  62.             CvPoint pt = points[hull[i]];
  63. #endif
  64.             cvLine( img, pt0, pt, CV_RGB( 0, 255, 0 ));
  65.             pt0 = pt;
  66.         }
  67.         cvShowImage( "hull", img );
  68.         int key = cvWaitKey(0);
  69.         if( key == 27 ) // 'ESC'
  70.             break;
  71. #if !ARRAY
  72.         cvClearMemStorage( storage );
  73. #else
  74.         free( points );
  75.         free( hull );
  76. #endif
  77.     }
  78. }