连通区域的边界点程序

如果你从图象上扣取一块区域,边界点的算法,如果自己写,一般思路就是一行一行扫描.找到同行或者同列的最大点和最小点.这个点按照顺序连接起来就是边界点了.

 

在opencv里面可以写个很简单的函数

CvContour header;
CvSeqBlock block;
CvMat* vector = cvCreateMat( 1, m, CV_32SC2 );//m是点的个数

for(int i=0;i<m;i++)

{

   CV_MAT_ELEM( *vector, CvPoint, 0, i) = cvPoint(x,y);//cvPoint(x,y)就是图象中的区域的坐标(x,y)

}

CvMemStorage *storage = cvCreateMemStorage(0);
 CvSeq *seq=cvCreateSeq(CV_SEQ_ELTYPE_POINT|CV_SEQ_KIND_MASK|CV_32SC2,sizeof(CvSeq),sizeof(CvPoint),storage);
 for(i=0;i<m;i++)
 {
  CvPoint pt=CV_MAT_ELEM( *vector, CvPoint, 0, i );
  
  cvSeqPush(seq,&pt);
 }

IplImage *pContourImg=cvCreateImage(cvSize(100,100),8,3);
 cvZero(pContourImg);

 

 seq=cvPointSeqFromMat(CV_SEQ_KIND_CURVE+CV_SEQ_FLAG_CLOSED,
    vector, &header, &block);
 seq=cvApproxPoly(seq,sizeof(CvContour),storage,CV_POLY_APPROX_DP, 3, 1 );
 CvTreeNodeIterator iterator;
 cvInitTreeNodeIterator( &iterator, seq, 1 );
 while( (seq = (CvSeq*)cvNextTreeNode( &iterator )) != 0 )
 {
  CvSeqReader reader;
  int i, count = seq->total;
  cvStartReadSeq( seq, &reader, 0 );
  
  if( CV_IS_SEQ_CHAIN_CONTOUR( seq ))
  {
  }
  else if(CV_IS_SEQ_POLYLINE( seq ))
  {
   CvPoint pt1, pt2;
   for( i = 0; i < count; i++ )
   {
    CV_READ_SEQ_ELEM( pt1, reader );
    cvLine(pContourImg,pt1,cvPoint(pt1.x+1,pt1.y+1),CV_RGB(255,0,0),3,8,0);//这里就是一个连通区域的边界点,可以在图片上画出边界点
   }
  }
 }

cvReleaseImage(&pContourImg);
 pContourImg=NULL;

 cvReleaseMemStorage(&storage);
 storage=NULL;

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值