边界追踪中有关轮廓信息统计的函数
以下为轮廓点的结构体、轮廓信息的结构体和统计轮廓信息的函数,代码如下:
typedef struct Contours
{//轮廓点结构体,通过malloc来分配
int height;//bmp Y坐标
int width;//bmp X坐标
int stateFlag;//点类型标志位
} contour;
typedef struct ContourInfo
{//轮廓信息结构体,通过malloc来分配
int position;//记录单个轮廓在轮廓点序列中的起始位置
int count;//记录单个轮廓的点个数
} contourInfo;
contourInfo* contourInformation( contour* _rContours )
{
int i = 0, j = 0;//i为轮廓点计数器,j为轮廓个数计数器
int n = 0;//每个轮廓点数量单独计数的计数器
int contour_Count = 30;//初始分配的轮廓数量为30个
int temp_Point_Count = 0;//用于临时保存轮廓空间点中第一个点的状态位中保存的轮廓点的总数量
contourInfo* contour_Info = NULL;//用于返回的轮廓信息
contourInfo* contour_Info_Temp = NULL;//用于轮廓数不足时分配新的轮廓空间
temp_Point_Count = _rContours[0].stateFlag;//保存轮廓点的总数量
_rContours[0].stateFlag = 1;//暂时把轮廓空间点的第一个点的状态位置1
contour_Info = ( contourInfo*)malloc( contour_Count * sizeof( contourInfo) );//先分配10个轮廓的信息空间
while ( _rContours[i].height > 0 )
{
if ( 1 == _rContours[i].stateFlag )
{
n = 1;//每个轮廓的第一个点
contour_Info[j].position = i;//记录第j个轮廓首点在整个轮廓空间点的位置
i ++;
while ( 0 == _rContours[i].stateFlag )
{
n ++;
i ++;
}
n ++;//在stateFlag等于2的时候跳出,所以还加上一个点
contour_Info[j].count = n;//将该轮廓点的数量保存
i ++;//将全局点计数器移动到下一个轮廓的起始位置
j ++;//为下一个轮廓位移出新空间
if ( j > contour_Count-1 )
{
//若轮廓数量超出范围,则加入额外轮廓空间
contour_Info_Temp = ( contourInfo *)malloc( contour_Count * sizeof( contourInfo) );
memcpy( contour_Info_Temp, contour_Info, contour_Count * sizeof( contourInfo) );
contour_Info = ( contourInfo *)malloc( (contour_Count + 10) * sizeof( contourInfo) );//多分配10个轮廓
memcpy( contour_Info, contour_Info_Temp, contour_Count * sizeof( contourInfo) );
contour_Count += 10;
free( contour_Info_Temp );
}
}
}
_rContours[0].stateFlag = temp_Point_Count;//还原轮廓点总数量到第一个点的标志位
return contour_Info;
}