aihot  2017-05-30 13:24:23  OpenCV |   查看评论   
  • //主要函数是       cvFindContours(tour_buf,storage,&contour,sizeof(CvContour),    
  •  
  • CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);   
  •  
  •  tour_buf 是需要查找轮廓的单通道灰度图像 ,storage 是临时存储区 ,   
  •  
  •  contour是存储轮廓点的CvSeq实例,   
  •  
  •  CV_RECT_EXTERNAL 只查找外围轮廓,还有CV_RECT_TREE    
  •  
  •     
  •  
  •  正确调用查找函数后,就是从contour提取轮廓点了   
  •  
  •  contour可能是空指针,提取前最好判断一下   
  •  
  •  在提取之前还可以调用一个函数:   
  •  
  •  contour = cvApproxPoly( contour, sizeof(CvContour), storage, CV_POLY_APPROX_DP, 3, 1 );   
  •  
  •  可能是拟合,有这一句找出的轮廓线更直。   
  •  
  •     
  •  
  •  contour里面包含了很多个轮廓,每个轮廓是单独存放的   
  •  
  •  要通过一个迭代器遍历里面每一个轮廓,教程里面都没提到,还是看了源代码学来的   
  •  
  •  CvTreeNodeIterator iterator;   
  •  
  •  cvInitTreeNodeIterator(&iterator,contour,3);   
  •  
  •  //把所有轮廓的点收集起来   
  •  
  •  CvSeq* allpointsSeq = cvCreateSeq(CV_SEQ_KIND_GENERIC|CV_32SC2, sizeof(CvContour),   
  •  
  •             sizeof(CvPoint), storage);   
  •  
  •  while( 0 != (contour = (CvSeq*)cvNextTreeNode(&iterator)) ){    
  •  
  •      //找到一个轮廓就可以用for循环提取里面的点了   
  •  
  •      //这里遍历CvSeq里面的元素的方法很怪异   
  •  
  •      onetourlength = contour->total;   
  •  
  •      //给点数组分配空间,记得释放   
  •  
  •      CvPoint *points = (CvPoint *)malloc(sizeof(CvPoint) * onetourlength);    
  •  
  •      //printf("seqlength:%d/n",seqlength);   
  •  
  •      CvSeqReader reader;   
  •  
  •      CvPoint pt = cvPoint(0,0);   
  •  
  •      cvStartReadSeq(contour,&reader);   
  •  
  •      //开始提取   
  •  
  •      for(int i = 0 ;i < onetourlength; i++){   
  •  
  •          CV_READ_SEQ_ELEM(pt,reader);   
  •  
  •          points[i] = pt;   
  •  
  •          cvSeqPush(allpointsSeq,&pt);   
  •  
  •      }     
  •  
  •      //把这个轮廓点找出后,就可以用这些点画个封闭线   
  •  
  •      cvPolyLine(image,&points,&onetourlength,1,0,CV_RGB(0,255,0),2,8,0);   
  •  
  •         
  •  
  •  }   
  •  
  •     
  •  
  •  //刚刚已经画出了找出的每个轮廓,还收集了所有轮廓点,   
  •  
  •  //因此还可以将这些点用一个围线包围起来,即把所有轮廓包围起来   
  •  
  •  //这里要用到新的函数   
  •  
  •  CvSeq* hull;   
  •  
  •  hull = cvConvexHull2(allpointsSeq,0,CV_CLOCKWISE,0);   
  •  
  •  cvConvexHull2返回一个hull对象,里面包含了围线的点   
  •  
  •  可以用上面的方法将点取出,然后画出来
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自OpenCV查找轮廓

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]