连通区域的边界点程序

    技术2022-05-11  12

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

     

    在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;


    最新回复(0)