深度图像的研究重点主要集中在以下几个方面,深度图像的分割技术 ,深度图像的边缘检测技术 ,基于不同视点的多幅深度图像的配准技术,基于深度数据的三维重建技术,基于三维深度图像的三维目标识别技术,深度图像的多分辨率建模和几何压缩技术等等,在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 贪婪投影
肆、曲面重建_贪婪三角形投影
估计法向量
// 估计法向量
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项目