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