下面是一个基于 PCL 库计算点 'PointXYZRGB' p 在半径 r 内的特征值的 C++ 代码示例:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/features/normal_3d.h>
#include <pcl/features/principal_curvatures.h>

int main()
{
    // 读取点云数据
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>());
    pcl::io::loadPCDFile<pcl::PointXYZRGB>('point_cloud.pcd', *cloud);

    // 计算法线
    pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;
    ne.setInputCloud(cloud);
    pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>());
    ne.setSearchMethod(tree);
    pcl::PointCloud<pcl::Normal>::Ptr cloud_normals(new pcl::PointCloud<pcl::Normal>());
    ne.setRadiusSearch(0.1); // 设置搜索半径
    ne.compute(*cloud_normals);

    // 计算主曲率
    pcl::PrincipalCurvaturesEstimation<pcl::PointXYZRGB, pcl::Normal, pcl::PrincipalCurvatures> pc;
    pc.setInputCloud(cloud);
    pc.setInputNormals(cloud_normals);
    pcl::PointCloud<pcl::PrincipalCurvatures>::Ptr cloud_curvatures(new pcl::PointCloud<pcl::PrincipalCurvatures>());
    pc.setRadiusSearch(0.1); // 设置搜索半径
    pc.compute(*cloud_curvatures);

    // 获取特定点的特征值
    int point_index = 100; // 假设我们要获取第100个点的特征值
    float radius = 0.1; // 搜索半径
    pcl::PointXYZRGB p = cloud->points[point_index];
    pcl::Normal n = cloud_normals->points[point_index];
    pcl::PrincipalCurvatures curvatures = cloud_curvatures->points[point_index];

    // 计算点 p 在半径 r 内的特征值
    std::vector<int> indices;
    std::vector<float> distances;
    tree->radiusSearch(p, radius, indices, distances);

    // 输出特征值
    for (int i = 0; i < indices.size(); i++) {
        int index = indices[i];
        pcl::PointXYZRGB q = cloud->points[index];
        pcl::Normal q_n = cloud_normals->points[index];
        pcl::PrincipalCurvatures q_curvatures = cloud_curvatures->points[index];

        std::cout << "Point: (" << q.x << ", " << q.y << ", " << q.z << ")" << std::endl;
        std::cout << "Normal: (" << q_n.normal_x << ", " << q_n.normal_y << ", " << q_n.normal_z << ")" << std::endl;
        std::cout << "Curvatures: " << q_curvatures.pc1 << ", " << q_curvatures.pc2 << std::endl;
        std::cout << std::endl;
    }

    return 0;
}

请注意,上述代码假设点云数据保存在名为 'point_cloud.pcd' 的文件中。你需要根据你的实际情况修改文件名和路径。此外,代码中的搜索半径也需要根据你的需求进行调整。

PCL库点云特征值计算:半径内特征提取 C++ 代码示例

原文地址: https://www.cveoy.top/t/topic/qwrt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录