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

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

以下为轮廓点的结构体、轮廓信息的结构体和统计轮廓信息的函数,代码如下:
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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值