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