woizzy 2023-02-19 15:39 采纳率: 45.5%
浏览 124
已结题

Intel 深度相机+PCL库处理点云问题

背景:
使用Intel Realsense深度相机(D415/D435)拍摄一个梯子,获取梯子的点云。对点云进行处理,以获取梯子的几何参数(如梯子的踏板长宽尺寸、相邻两梯子的高度差)。使用PCL库对点云进行处理,要从点云中获取参数,会使用点云滤波、点云分割、点云配准、点云PCA分析几何处理等。
三个大问题:
1、结合以上应用背景,要不要再RealSense中将深度图与彩色图对齐?还是直接通过深度图获取点云?
2、获取点云的函数根据学者给出的参考有直接使用RealSense API中的calculate()函数,或者rs::deproject_pixel_to_point函数,以及PCL库中将深度图转换为点云的方法,根据我给出后面点云要运用的情况应该该使用哪一个?使用这个方法要不要将深度图与彩色图进行对齐?
3、其次获取到的点云是包含背景信息以及噪声的,能不能使用滤波器进行滤波使得只获取到梯子的点云?能的话应该用哪些?不可以的是不是要配合点云分割进行处理?(比如总会有背景信息,用点云分割出梯子的踏板和梯子的支架进行后续处理)

(使用vs2019+C++,可以结合一些函数说明)

  • 写回答

10条回答 默认 最新

  • CodeBytes 2023-02-19 16:34
    关注

    该回答引用ChatGPT

    问题1

    1、在您的应用场景中,需要使用深度相机获取梯子的点云,并对点云进行处理以获取梯子的几何参数。因此,需要从深度图中获取点云,不需要将深度图与彩色图对齐。

    2、由于深度图像素和彩色图像素不一一对应,将深度图和彩色图对齐的过程需要进行复杂的计算,会导致处理时间增加,并且对于您的应用场景并没有直接的好处。

    3、因此,建议直接使用深度图像来获取点云,这样可以简化处理流程,并提高处理效率。在处理点云时,可以使用 PCL 库中的深度图像获取点云的相关 API,或者使用 Intel Realsense SDK 中的 API 来直接获取点云。

    4、在点云获取后,可以使用 PCL 库提供的点云滤波、点云分割、点云配准、点云PCA分析几何处理等算法来对点云进行处理,从而获取梯子的几何参数,比如梯子的踏板长宽尺寸、相邻两梯子的高度差等。

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
    问题2

    1、如果您需要获取点云,并对点云进行处理以获取梯子的几何参数,可以考虑使用 PCL 库提供的从深度图转换为点云的方法。

    2、PCL 库中提供了很多从深度图转换为点云的方法,例如使用 pcl::OrganizedFastMesh 类提供的 fromDepthImage 函数,可以直接从深度图像中生成点云。此外,还可以使用 pcl::PointCloud 类提供的 fromDepthImage 函数,也可以从深度图像中生成点云。这些函数都不需要将深度图和彩色图对齐,直接使用深度图像就可以生成点云。

    3、因此,在您的应用场景中,建议使用 PCL 库提供的从深度图转换为点云的方法来获取点云,并使用 PCL 库提供的滤波、分割、配准、PCA 分析等算法来对点云进行处理以获取梯子的几何参数。

    4、另外,如果您需要同时获取深度图像和彩色图像,并将它们对齐以进行后续处理,可以使用 RealSense SDK 中的 API 来获取对齐的深度图像和彩色图像。在这种情况下,可以使用 rs2::align 类来对齐深度图像和彩色图像。但是,在您的应用场景中,如果只需要获取点云,不需要同时获取深度图像和彩色图像,也不需要将深度图和彩色图对齐。

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
    问题3

    是的,获取到的点云数据可能包含噪声和背景信息,为了获取到正确的梯子信息,需要对点云进行滤波和分割处理。

    1、点云滤波
    点云滤波是一种预处理方法,可以将点云数据中的噪声和不必要的信息过滤掉,提高点云的质量。PCL 库提供了多种滤波器,可以根据具体情况选择合适的滤波器。例如,可以使用 pcl::StatisticalOutlierRemoval 滤波器来去除点云中的离群点(outlier),或者使用 pcl::PassThrough 滤波器来过滤掉不在指定范围内的点。

    2、点云分割
    点云分割是将点云数据分为不同的部分,每部分代表不同的物体或者特征。在您的应用场景中,可以使用点云分割来分离梯子和背景,或者分离梯子的踏板和梯子的支架等不同部分。PCL 库提供了多种点云分割算法,例如 pcl::EuclideanClusterExtraction 算法可以根据欧几里得距离将点云分成不同的聚类,而 pcl::ExtractIndices 算法可以从点云中提取指定的点云部分。

    3、在您的应用场景中,可以首先使用点云滤波器对原始点云进行去噪处理,然后使用点云分割器将梯子和背景分离,最后对分离出来的梯子点云数据进行处理以获取梯子的几何参数。

    下面是一个完整的示例代码,包括使用 pcl::StatisticalOutlierRemoval 滤波器进行去噪处理,并使用 pcl::ExtractIndices 算法将梯子和背景分离的代码:

    #include <pcl/io/pcd_io.h>
    #include <pcl/point_types.h>
    #include <pcl/filters/statistical_outlier_removal.h>
    #include <pcl/filters/extract_indices.h>
    #include <pcl/segmentation/sac_segmentation.h>
    #include <pcl/segmentation/extract_clusters.h>
    
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::IndicesPtr indices(new std::vector<int>);
    pcl::PassThrough<pcl::PointXYZ> pass;
    
    // 从PCD文件中加载点云数据
    pcl::io::loadPCDFile("input_cloud.pcd", *cloud);
    
    // 使用统计滤波器进行去噪处理
    pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;
    sor.setInputCloud(cloud);
    sor.setMeanK(50);
    sor.setStddevMulThresh(1.0);
    sor.filter(*cloud_filtered);
    
    // 定义点云分割器
    pcl::SACSegmentation<pcl::PointXYZ> seg;
    pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
    pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
    
    // 设置点云分割器的参数
    seg.setOptimizeCoefficients(true);
    seg.setModelType(pcl::SACMODEL_PLANE);
    seg.setMethodType(pcl::SAC_RANSAC);
    seg.setMaxIterations(1000);
    seg.setDistanceThreshold(0.01);
    
    // 进行点云分割
    seg.setInputCloud(cloud_filtered);
    seg.segment(*inliers, *coefficients);
    
    // 使用提取指定索引点云算法将梯子和背景分离
    pcl::ExtractIndices<pcl::PointXYZ> extract;
    extract.setInputCloud(cloud_filtered);
    extract.setIndices(inliers);
    extract.setNegative(true);
    extract.filter(*cloud_filtered);
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 2月28日
  • 已采纳回答 2月20日
  • 创建了问题 2月19日

悬赏问题

  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法