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