测试环境:

pcl==1.12.1

python-pcl==0.3.1

python==3.7

代码:

# -*- coding: utf-8 -*-
# Spatial Partitioning and Search Operations with Octrees
# http://pointclouds.org/documentation/tutorials/octree.php#octree-search

import pcl
import numpy as np
import random


def main():
    # pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
    cloud = pcl.PointCloud()

    ##
    # // Generate pointcloud data
    # cloud->width = 1000;
    # 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.0f * rand () / (RAND_MAX + 1.0f);
    #     cloud->points[i].y = 1024.0f * rand () / (RAND_MAX + 1.0f);
    #     cloud->points[i].z = 1024.0f * rand () / (RAND_MAX + 1.0f);
    # }
    #
    points = np.zeros((1000, 3), dtype=np.float32)
    RAND_MAX = 1024.0
    for i in range(0, 1000):
        points[i][0] = 1024 * random.random() / RAND_MAX
        points[i][1] = 1024 * random.random() / RAND_MAX
        points[i][2] = 1024 * random.random() / RAND_MAX

    cloud.from_array(points)

    # pcl::octree::OctreePointCloudSearch<pcl::PointXYZ> octree (resolution);
    # octree.setInputCloud (cloud);
    # octree.addPointsFromInputCloud ();

    # resolution = 128.0
    # x,y,z Area Filter
    resolution = 0.2
    octree = cloud.make_octreeSearch(resolution)
    octree.add_points_from_input_cloud()

    # pcl::PointXYZ searchPoint;
    # searchPoint.x = 1024.0f * rand () / (RAND_MAX + 1.0f);
    # searchPoint.y = 1024.0f * rand () / (RAND_MAX + 1.0f);
    # searchPoint.z = 1024.0f * rand () / (RAND_MAX + 1.0f);
    searchPoint = pcl.PointCloud()
    searchPoints = np.zeros((1, 3), dtype=np.float32)
    # searchPoints[0][0] = 1024 * random.random () / (RAND_MAX + 1.0)
    # searchPoints[0][1] = 1024 * random.random () / (RAND_MAX + 1.0)
    # searchPoints[0][2] = 1024 * random.random () / (RAND_MAX + 1.0)
    searchPoints[0][0] = 1024 * random.random() / (RAND_MAX + 1.0)
    searchPoints[0][1] = 1024 * random.random() / (RAND_MAX + 1.0)
    searchPoints[0][2] = 1024 * random.random() / (RAND_MAX + 1.0)

    searchPoint.from_array(searchPoints)

    ##
    # // Neighbors within voxel search
    # std::vector<int> pointIdxVec;
    #
    #   if (octree.voxelSearch (searchPoint, pointIdxVec))
    #   {
    #     std::cout << "Neighbors within voxel search at (" << searchPoint.x
    #      << " " << searchPoint.y
    #      << " " << searchPoint.z << ")"
    #      << std::endl;
    #
    #     for (size_t i = 0; i < pointIdxVec.size (); ++i)
    #    std::cout << "    " << cloud->points[pointIdxVec[i]].x
    #        << " " << cloud->points[pointIdxVec[i]].y
    #        << " " << cloud->points[pointIdxVec[i]].z << std::endl;
    #   }
    ind = octree.VoxelSearch(searchPoint)

    print('Neighbors within voxel search at (' + str(searchPoint[0][0]) + ' ' + str(
        searchPoint[0][1]) + ' ' + str(searchPoint[0][2]) + ')')
    # for i in range(0, ind.size):
    for i in range(0, ind.size):
        print('index = ' + str(ind[i]))
        print('(' + str(cloud[ind[i]][0]) + ' ' +
              str(cloud[ind[i]][1]) + ' ' + str(cloud[ind[i]][2]))

    ##
    # // K nearest neighbor search
    # std::vector<int> pointIdxNKNSearch;
    # std::vector<float> pointNKNSquaredDistance;
    #
    # std::cout << "K nearest neighbor search at (" << searchPoint.x
    #           << " " << searchPoint.y
    #           << " " << searchPoint.z
    #           << ") with K=" << K << std::endl;
    K = 10
    print('K nearest neighbor search at (' + str(searchPoint[0][0]) + ' ' + str(
        searchPoint[0][1]) + ' ' + str(searchPoint[0][2]) + ') with K=' + str(K))

    # if (octree.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;
    # }
    # // Neighbors within radius search
    [ind, sqdist] = octree.nearest_k_search_for_cloud(searchPoint, K)
    # if nearest_k_search_for_cloud
    for i in range(0, ind.size):
        print('(' + str(cloud[ind[0][i]][0]) + ' ' + str(cloud[ind[0][i]][1]) + ' ' + str(
            cloud[ind[0][i]][2]) + ' (squared distance: ' + str(sqdist[0][i]) + ')')

    ##
    # std::vector<int> pointIdxRadiusSearch;
    # std::vector<float> pointRadiusSquaredDistance;
    # float radius = 256.0f * rand () / (RAND_MAX + 1.0f);
    # std::cout << "Neighbors within radius search at (" << searchPoint.x
    #     << " " << searchPoint.y
    #     << " " << searchPoint.z
    #     << ") with radius=" << radius << std::endl;
    #
    radius = 256.0 * random.random() / (RAND_MAX + 1.0)
    print('Neighbors within radius search at (' + str(searchPoint[0][0]) + ' ' + str(
        searchPoint[0][1]) + ' ' + str(searchPoint[0][2]) + ') with radius=' + str(radius))

    # if (octree.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;
    # }
    ###
    # [ind, sqdist] = octree.radius_search_for_cloud (searchPoint, radius)
    # Exception ignored in: 'pcl._pcl.to_point_t'
    # [ind, sqdist] = octree.radius_search (searchPoint, radius, 10)
    searchPoints = (searchPoint[0][0], searchPoint[0][1], searchPoint[0][2])
    [ind, sqdist] = octree.radius_search(searchPoints, radius, 10)

    # Function radius_search
    for i in range(0, ind.size):
        print('(' + str(cloud[ind[i]][0]) + ' ' + str(cloud[ind[i]][1]) + ' ' +
              str(cloud[ind[i]][2]) + ' (squared distance: ' + str(sqdist[i]) + ')')

    # Function radius_search_for_cloud
    # for i in range(0, ind.size):
    #    print ('(' + str(cloud[ind[0][i]][0]) + ' ' + str(cloud[ind[0][i]][1]) + ' ' + str(cloud[ind[0][i]][2]) + ' (squared distance: ' + str(sqdist[0][i]) + ')')


if __name__ == "__main__":
    # import cProfile
    # cProfile.run('main()', sort='time')
    main()

运行结果:

VoxelSearch at (0.37849587202072144 0.19727467000484467 0.3064234256744385)
Neighbors within voxel search at (0.37849587202072144 0.19727467000484467 0.3064234256744385)
index = 45
(0.4282791316509247 0.19563999772071838 0.22944234311580658
index = 364
(0.44496798515319824 0.04221676290035248 0.3575461804866791
index = 388
(0.48459964990615845 0.1802610605955124 0.2799946069717407
index = 907
(0.458575040102005 0.1072542816400528 0.24344711005687714
K nearest neighbor search at (0.37849587202072144 0.19727467000484467 0.3064234256744385) with K=10
(0.335491806268692 0.1623605340719223 0.26550593972206116 (squared distance: 0.0047425875)
(0.3500078320503235 0.19176329672336578 0.38017719984054565 (squared distance: 0.0062815626)
(0.30588388442993164 0.1718531847000122 0.34713444113731384 (squared distance: 0.0075761396)
(0.4282791316509247 0.19563999772071838 0.22944234311580658 (squared distance: 0.008407132)
(0.31789419054985046 0.1155492439866066 0.28539803624153137 (squared distance: 0.010793676)
(0.43619975447654724 0.267613023519516 0.3614135682582855 (squared distance: 0.0113011375)
(0.3559480905532837 0.2263394445180893 0.20286111533641815 (squared distance: 0.012078315)
(0.48459964990615845 0.1802610605955124 0.2799946069717407 (squared distance: 0.012245957)
(0.2636048495769501 0.16589123010635376 0.29033729434013367 (squared distance: 0.01444363)
(0.458575040102005 0.1072542816400528 0.24344711005687714 (squared distance: 0.018482361)
Neighbors within radius search at (0.37849587202072144 0.19727467000484467 0.3064234256744385) with radius=0.14303657495545388
(0.3559480905532837 0.2263394445180893 0.20286111533641815 (squared distance: 0.012078315)
(0.2636048495769501 0.16589123010635376 0.29033729434013367 (squared distance: 0.01444363)
(0.3500078320503235 0.19176329672336578 0.38017719984054565 (squared distance: 0.0062815626)
(0.30588388442993164 0.1718531847000122 0.34713444113731384 (squared distance: 0.0075761396)
(0.335491806268692 0.1623605340719223 0.26550593972206116 (squared distance: 0.0047425875)
(0.31789419054985046 0.1155492439866066 0.28539803624153137 (squared distance: 0.010793676)
(0.4282791316509247 0.19563999772071838 0.22944234311580658 (squared distance: 0.008407132)
(0.48459964990615845 0.1802610605955124 0.2799946069717407 (squared distance: 0.012245957)
(0.458575040102005 0.1072542816400528 0.24344711005687714 (squared distance: 0.018482361)
(0.43619975447654724 0.267613023519516 0.3614135682582855 (squared distance: 0.0113011375)