边界追踪中有关轮廓信息统计的函数

来源:互联网 发布:php会员订单系统源码 编辑:程序博客网 时间:2024/05/29 18:34

边界追踪中有关轮廓信息统计的函数

以下为轮廓点的结构体、轮廓信息的结构体和统计轮廓信息的函数,代码如下:
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;//暂时把轮廓空间点的第一个点的状态位置1contour_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;}



0 0