pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率

题图就是计算出来的法线和激光点云咯

PCL的CUDA代码的确好但是没有教程,鄙人抛砖引玉,丢一篇如何使用PCL计算点云的曲率和法线的GPU样例上来。由于本人使用了cv库对曲率进行了可视化,所以带有CV的头文件,如果不需要可视化,CV是可以不配置的。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include
#include
#include
bool getModelCurvatures(pcl::PointCloud::Ptr cloud,int k, vector& tempCV)
{

	if (cloud->size()==0)
	{
		return false;
	}

	pcl::gpu::NormalEstimation::PointCloud gpuCloud;
	
	pcl::KdTreeFLANN::Ptr kdtree(new pcl::KdTreeFLANN);
	kdtree->setInputCloud(cloud);

	size_t cloud_size = cloud->points.size();

	std::vector dists;
	std::vector> neighbors_all;
	std::vector sizes;
	neighbors_all.resize(cloud_size);
	sizes.resize(cloud_size);
#pragma omp parallel for
	for (int64 i = 0; i < cloud_size; ++i)
	{
		kdtree->nearestKSearch(cloud->points[i], k, neighbors_all[i], dists);
		sizes[i]=(int)neighbors_all[i].size();
	}
	int max_nn_size = *max_element(sizes.begin(), sizes.end());
	vector temp_neighbors_all(max_nn_size * cloud->size());
	pcl::gpu::PtrStep ps(&temp_neighbors_all[0], max_nn_size * pcl::gpu::PtrStep::elem_size);
	for (size_t i = 0; i < cloud->size(); ++i)
		std::copy(neighbors_all[i].begin(), neighbors_all[i].end(), ps.ptr(i));

	pcl::gpu::NeighborIndices indices;
	gpuCloud.upload(cloud->points);
	indices.upload(temp_neighbors_all, sizes, max_nn_size);

	pcl::gpu::NormalEstimation::Normals normals;
	pcl::gpu::NormalEstimation::computeNormals(gpuCloud, indices, normals);
	pcl::gpu::NormalEstimation::flipNormalTowardsViewpoint(gpuCloud, 0.f, 0.f, 0.f, normals);
	
	vector downloaded;
	normals.download(downloaded);
	tempCV.resize(downloaded.size());
	for (size_t i = 0; i < downloaded.size(); ++i)
	{

		tempCV[i].index = i;
		tempCV[i].curvature = downloaded[i].data[3];
	}
	return true;
}

这个函数显而易见是用来计算曲率的,对大量点云,曲率计算效果会强很多,同时该函数会计算法线,在点数2千万时,在release下计算法线和曲率需要一个小时,通过使用GPU可以降到20秒。

今天的更新有点短,丢几张铁路的曲率图作为结束吧

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第1张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第2张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第3张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第4张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第5张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第6张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第7张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第8张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第9张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第10张图片

pcl 使用gpu计算法向量_PCL GPU实现计算法线和曲率_第11张图片

你可能感兴趣的:(pcl,使用gpu计算法向量)