Programming/OpenCV

[Function] Convex Hull 최외곽선 검출하기

매직블럭 2013. 4. 2. 19:12

 

convex hull 이란?

여러개의 점들중에 최외곽의 점들을 이어놓은 집합? 연결된 선? 공간? 을 의미한다

convexhull 영역 내부에 모든 점이 존재하고 외부에는 점이 존재하지 않아야 한다.

 

 

  1. CvMemStorage* storage_hull = cvCreateMemStorage(0);
  2.  
  3. IplImage* cnt_img = cvCreateImage(cvGetSize(image), IPL_DEPTH_8U, 1);
  4. cvZero( cnt_img );
  5.  
  6. CvPoint pt0;
  7. CvSeq* ptseq = cvCreateSeq(CV_SEQ_KIND_GENERIC|CV_32SC2,sizeof(CvContour),sizeof(CvPoint), storage_hull);
  8. CvSeq* hull;
  9. int         hullcount = 0;
  10. int         count_ = 0;
  11.  
  12. for(int i=0; i<image->height; i++)
  13. {
  14.         for(int j=0; j<image->width; j++)
  15.         {
  16.                 if((unsigned char)image->imageData[i*image->widthStep+j*3]==255)
  17.                 {
  18.                         pt0.x = j;
  19.                         pt0.y = i;
  20.                         cvSeqPush(ptseq, &pt0);
  21.                 }
  22.         }
  23. }
  24.  
  25. if(ptseq->total != 0)
  26. {
  27.         hull = cvConvexHull2(ptseq, 0, CV_COUNTER_CLOCKWISE, 0);
  28.         hullcount = hull->total;
  29.         cvZero(cnt_img);
  30.  
  31.         pt0 = **CV_GET_SEQ_ELEM(CvPoint*, hull, hullcount - 1);
  32.         for(int i=0; i<hullcount; i++)
  33.         {
  34.                 CvPoint pt = **CV_GET_SEQ_ELEM(CvPoint*, hull, i);
  35.                 cvLine(image, pt0, pt, CV_RGB(0, 255, 0));
  36.                 //cvLine(image, CvPoint(cvPoint(center_x,center_y)), pt, CV_RGB(255, 0, 0));
  37.                 pt0 = pt;
  38.         }
  39.  
  40. }


소스코드 보기좋게 수정하였습니다. ( 14.04.08 )