www.pudn.com > labe_forOpencv.rar > labe_forOpencv.cpp
//连通区域标C++记程序
//作者:胡柳
//本程序使用了opencv中图像数据结构:IplImage
//算法原理:首先进行第一次扫描,标记连通区域;
//然后对等价标记进行合并,
//最后进行第二次扫描,对等价标记进行重新标记。
//输入:mask为标记模板指针,img1为待标记二值图像指针
//返回值为连通区域数
int label( WORD *mask,IplImage *img1)
{
BYTE *pb1=(BYTE*)img1->imageData;
int height=img1->height;
int width=img1->width;
int k,j;
for( k=0; kcw)
{
delete col;
cw+=200;
goto loop;
}
}
else
{
if(mask[k*width+j-1]!=0)
mask[k*width+j]=mask[k*width+j-1];
if(mask[(k-1)*width+j-1]!=0)
if(mask[k*width+j]==0)
mask[k*width+j]=mask[(k-1)*width+j-1];
else
{
col[mask[k*width+j]*cw+mask[(k-1)*width+j-1]]=true;
col[mask[(k-1)*width+j-1]*cw+mask[k*width+j]]=true;
}
if(mask[(k-1)*width+j]!=0)
if(mask[k*width+j]==0)
mask[k*width+j]=mask[(k-1)*width+j];
else
{
col[mask[k*width+j]*cw+mask[(k-1)*width+j]]=true;
col[mask[(k-1)*width+j]*cw+mask[k*width+j]]=true;
}
if(mask[(k-1)*width+j+1]!=0)
if(mask[k*width+j]==0)
mask[k*width+j]=mask[(k-1)*width+j+1];
else
{
col[mask[k*width+j]*cw+mask[(k-1)*width+j+1]]=true;
col[mask[(k-1)*width+j+1]*cw+mask[k*width+j]]=true;
}
}
if(lab==1)
return 0;
//等价关系合并
bool *col2=new bool[lab*lab];
for(k=0; kcol3_s[j+1])
{
t=col3_s[j];
col3_s[j]=col3_s[j+1];
col3_s[j+1]=t;
}
}
WORD *ind=new WORD[lab];
ind[col3_s[1]]=1;
int c=2;
for(k=1;k