这里是一个简单的pcl1.8.1 3D KdTree的实现。需要注意的是,这个实现仅仅是为了展示如何在pcl1.8.1中使用KdTree。实际的应用中,你可能需要根据自己的数据进行一些修改。

#include <pcl/kdtree/kdtree.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <iostream>

int main()
{
    // 创建一个点云
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    cloud->width = 8;
    cloud->height = 1;
    cloud->points.resize(cloud->width * cloud->height);

    for (size_t i = 0; i < cloud->points.size(); ++i)
    {
        cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);
        cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);
    }

    // 创建kd树
    pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
    kdtree.setInputCloud(cloud);

    // 搜索最近邻
    pcl::PointXYZ searchPoint;
    searchPoint.x = 1024 * rand() / (RAND_MAX + 1.0f);
    searchPoint.y = 1024 * rand() / (RAND_MAX + 1.0f);
    searchPoint.z = 1024 * rand() / (RAND_MAX + 1.0f);

    int K = 3;
    std::vector<int> pointIdxNKNSearch(K);
    std::vector<float> pointNKNSquaredDistance(K);

    std::cout << "K nearest neighbor search at (" << searchPoint.x 
              << " " << searchPoint.y 
              << " " << searchPoint.z
              << ") with K=" << K << std::endl;

    if (kdtree.nearestKSearch(searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)
    {
        for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i)
            std::cout << "    " << cloud->points[pointIdxNKNSearch[i]].x 
                      << " " << cloud->points[pointIdxNKNSearch[i]].y 
                      << " " << cloud->points[pointIdxNKNSearch[i]].z 
                      << " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;
    }

    // 搜索半径内的点
    float radius = 256.0f * rand() / (RAND_MAX + 1.0f);
    std::vector<int> pointIdxRadiusSearch;
    std::vector<float> pointRadiusSquaredDistance;

    std::cout << "Neighbors within radius search at (" << searchPoint.x 
              << " " << searchPoint.y 
              << " " << searchPoint.z
              << ") with radius=" << radius << std::endl;

    if (kdtree.radiusSearch(searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0)
    {
        for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i)
            std::cout << "    " << cloud->points[pointIdxRadiusSearch[i]].x 
                      << " " << cloud->points[pointIdxRadiusSearch[i]].y 
                      << " " << cloud->points[pointIdxRadiusSearch[i]].z 
                      << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
    }

    return 0;
}

这个程序中,我们首先创建了一个点云,并使用这些点创建了一个KdTree。然后我们随机选择了一个点,搜索最近的三个点和距离这个点半径为随机半径的所有点。最后,我们将搜索结果打印出来

帮我写一个pcl181可以运行的3维kdtree

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

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