虚拟网格索引点云的坡度滤波

虚拟网格索引点云的坡度滤波

虚拟网格的建立

虚拟网格将点云区域分成width×height个大小相等的虚拟网格,使每个网格都包含离散的点,并对每个激光脚点建立索引。下图为二维平面图。在这里插入图片描述
width和height的值是根据激光脚点的x、y值,以及网格的边长S来确定的,公式如下:
width=(xmax-xmin)/S+1
height=(ymax-ymin)/S+1

int width = (int)((Xmax - Xmin) / S) + 1;
int height = (int)((Ymax - Ymin) /S) + 1;

建立索引的具体计算方法如下所示:
col=INT(x-xmin)/S
row=INT(y-ymin)/S

for (int i = 0; i < data.size(); i++)
	{
		int col = (int)((data[i].x - Xmin) / S);
		int row = (int)((data[i].y - Ymin) / S);
		}

遍历所有激光脚点,寻找网格内高程最低的种子点:

    double *XPointGrid = new double[width*height];//动态申请内存
	double *YPointGrid = new double[width*height];//动态申请内存
	double *ZPointGrid = new double[width*height];//动态申请内存
	
	for (int i = 0; i < width*height; i++)
		ZPointGrid[i] = 0;
	for (int i = 0; i < data.size(); i++)
	{
		int col = (int)((data[i].x - Xmin) / grid);
		int row = (int)((data[i].y - Ymin) / grid);
		ZPointGrid[row*width + col] = Zmax;                 
	}

	for (int i = 0; i < data.size(); i++)//遍历每一个点
	{
		int col = (int)((data[i].x - Xmin) / grid);
		int row = (int)((data[i].y - Ymin) / grid);
		if (data[i].z < ZPointGrid[row*width + col])    
		{
			ZPointGrid[row*width + col] = data[i].z;
			XPointGrid[row*width + col] = data[i].x;
			YPointGrid[row*width + col] = data[i].y;
		}
	}

坡度滤波算法

滤波算法如下:

for (int i = 0; i < data.size(); i++)
	{
		int col = (int)((data[i].x - Xmin) / grid);
		int row = (int)((data[i].y - Ymin) / grid);
		double L = sqrt((data[i].x - XPointGrid[row*width + col])*(data[i].x - XPointGrid[row*width + col]) + (data[i].y - YPointGrid[row*width + col])*(data[i].y - YPointGrid[row*width + col]));
		double dis = (data[i].z - ZPointGrid[row*width + col]);
		double threshold = (dis / L);
		if ((threshold <= value)) 
		{
			cout<< data[i].x << " ," << data[i].y << " ," << data[i].z << endl;
		}
	}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值