pcl_range_image + greedy_projection

        深度图像的研究重点主要集中在以下几个方面,深度图像的分割技术 ,深度图像的边缘检测技术 ,基于不同视点的多幅深度图像的配准技术,基于深度数据的三维重建技术,基于三维深度图像的三维目标识别技术,深度图像的多分辨率建模和几何压缩技术等等,在PCL 中深度图像与点云最主要的区别在于其近邻的检索方式的不同,并且可以互相转换。


壹、range_image_creation

代码及详解参考:https://blog.csdn.net/shuiyixin/article/details/89057463

https://www.cnblogs.com/li-yao7758258/p/6474699.html


贰、range_image_border_extraction 深度图边界

参考:http://www.pclcn.org/study/shownews.php?lang=cn&id=207

从点云创建深度图像

  float noise_level = 0.0;
  float min_range = 0.0f;
  int border_size = 1;
  boost::shared_ptr<pcl::RangeImage> range_image_ptr (new pcl::RangeImage);
  pcl::RangeImage& range_image = *range_image_ptr;   
  range_image.createFromPointCloud (point_cloud, angular_resolution, pcl::deg2rad (360.0f), pcl::deg2rad (180.0f), scene_sensor_pose, coordinate_frame, noise_level, min_range, border_size);
  range_image.integrateFarRanges (far_ranges);
  if (setUnseenToMaxRange)
    range_image.setUnseenToMaxRange ();

提取边界

  pcl::RangeImageBorderExtractor border_extractor (&range_image);
  pcl::PointCloud<pcl::BorderDescription> border_descriptions;
  border_extractor.compute (border_descriptions);

   result:读取点云,如果没有输入点云则创建点云

(1)桌子深度 +边界        (2)创建的点云+边界


叁、greedy_projection 贪婪投影


肆、曲面重建_贪婪三角形投影

参考:https://blog.csdn.net/aishuirenjia/article/details/102719133?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

估计法向量

// 估计法向量
	pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
	pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
	//创建kdtree用于法向计算时近邻搜索
	pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
	tree->setInputCloud(cloud);//为kdtree输入点云
	n.setInputCloud(cloud);//为法向量估计对象输入点云
	n.setSearchMethod(tree);//设置法向估计时的搜索方式
	n.setKSearch(20);//设置k近邻搜索的点数
	n.compute(*normals); //计算法线,结果存储在normals中
	//* normals 不能同时包含点的法向量和表面的曲率

原始点云和法向量拼接

    pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
    pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
    //* cloud_with_normals = cloud + normals

贪婪三角投影 重建

	//创建另一个搜索树用于重建
	pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
	tree2->setInputCloud(cloud_with_normals);

	//初始化GreedyProjectionTriangulation对象,并设置参数
	pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
	//创建多变形网格,用于存储结果
	pcl::PolygonMesh triangles;

	//设置GreedyProjectionTriangulation对象的参数
	  //第一个参数影响很大
	gp3.setSearchRadius(1.5f); //设置连接点之间的最大距离(最大边长)用于确定k近邻的球半径【默认值 0】
	gp3.setMu(2.5f); //设置最近邻距离的乘子,以得到每个点的最终搜索半径【默认值 0】
	gp3.setMaximumNearestNeighbors(100); //设置搜索的最近邻点的最大数量
	gp3.setMaximumSurfaceAngle(M_PI / 4); // 45 degrees(pi)最大平面角
	gp3.setMinimumAngle(M_PI / 18); // 10 degrees 每个三角的最小角度
	gp3.setMaximumAngle(2 * M_PI / 3); // 120 degrees 每个三角的最大角度
	gp3.setNormalConsistency(false); //如果法向量一致,设置为true

	//设置搜索方法和输入点云
	gp3.setInputCloud(cloud_with_normals);
	gp3.setSearchMethod(tree2);

	//执行重构,结果保存在triangles中
	gp3.reconstruct(triangles);

	//保存网格图
	pcl::io::savePLYFile("greedy_tri_recon_result.ply", triangles);

结果


其他,http://www.pclcn.org/study/shownews.php?lang=cn&id=495 draco项目

猜你喜欢

转载自blog.csdn.net/yamgyutou/article/details/104974860
pcl