KdTree

 1 #include <pcl/point_cloud.h>
 2 #include <pcl/kdtree/kdtree_flann.h>
 3 
 4 #include <iostream>
 5 #include <vector>
 6 #include <ctime>
 7 
 8 int
 9 main (int argc, char** argv)
10 {
11   srand (time (NULL));
12 
13   pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
14 
15   // Generate pointcloud data
16   cloud->width = 1000;
17   cloud->height = 1;
18   cloud->points.resize (cloud->width * cloud->height);
19 
20   for (size_t i = 0; i < cloud->points.size (); ++i)
21   {
22     cloud->points[i].x = 1024.0f * rand () / (RAND_MAX + 1.0f);
23     cloud->points[i].y = 1024.0f * rand () / (RAND_MAX + 1.0f);
24     cloud->points[i].z = 1024.0f * rand () / (RAND_MAX + 1.0f);
25   }
26 
27   pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
28 
29   kdtree.setInputCloud (cloud);
30 
31   pcl::PointXYZ searchPoint;
32 
33   searchPoint.x = 1024.0f * rand () / (RAND_MAX + 1.0f);
34   searchPoint.y = 1024.0f * rand () / (RAND_MAX + 1.0f);
35   searchPoint.z = 1024.0f * rand () / (RAND_MAX + 1.0f);
36 
37   // K nearest neighbor search
38 
39   int K = 10;
40 
41   std::vector<int> pointIdxNKNSearch(K);
42   std::vector<float> pointNKNSquaredDistance(K);
43 
44   std::cout << "K nearest neighbor search at (" << searchPoint.x 
45             << " " << searchPoint.y 
46             << " " << searchPoint.z
47             << ") with K=" << K << std::endl;
48 
49   if ( kdtree.nearestKSearch (searchPoint, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0 )
50   {
51     for (size_t i = 0; i < pointIdxNKNSearch.size (); ++i)
52       std::cout << "    "  <<   cloud->points[ pointIdxNKNSearch[i] ].x 
53                 << " " << cloud->points[ pointIdxNKNSearch[i] ].y 
54                 << " " << cloud->points[ pointIdxNKNSearch[i] ].z 
55                 << " (squared distance: " << pointNKNSquaredDistance[i] << ")" << std::endl;
56   }
57 
58   // Neighbors within radius search
59 
60   std::vector<int> pointIdxRadiusSearch;
61   std::vector<float> pointRadiusSquaredDistance;
62 
63   float radius = 256.0f * rand () / (RAND_MAX + 1.0f);
64 
65   std::cout << "Neighbors within radius search at (" << searchPoint.x 
66             << " " << searchPoint.y 
67             << " " << searchPoint.z
68             << ") with radius=" << radius << std::endl;
69 
70 
71   if ( kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0 )
72   {
73     for (size_t i = 0; i < pointIdxRadiusSearch.size (); ++i)
74       std::cout << "    "  <<   cloud->points[ pointIdxRadiusSearch[i] ].x 
75                 << " " << cloud->points[ pointIdxRadiusSearch[i] ].y 
76                 << " " << cloud->points[ pointIdxRadiusSearch[i] ].z 
77                 << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
78   }
79 
80 
81   return 0;
82 }
View Code
原文地址:https://www.cnblogs.com/larry-xia/p/11010402.html