-
Notifications
You must be signed in to change notification settings - Fork 0
/
002_基于KdTree邻近点提取.cpp
56 lines (48 loc) · 1.67 KB
/
002_基于KdTree邻近点提取.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<pcl/point_cloud.h>
#include<pcl/kdtree/kdtree_flann.h>
#include<vector>
#include<iostream>
#include<ctime>
int main()
{
srand(time(NULL));
time_t begin, end;
begin = clock();
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
cloud->height = 1;
cloud->width = 100000;
cloud->is_dense = true;
cloud->resize(cloud->width*cloud->height);
for (int i = 0; i < cloud->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);
}
// creats kdtree object
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
//set input point cloud
kdtree.setInputCloud(cloud);
// set target point
pcl::PointXYZ target;
target.x = 1024.0f*rand() / (RAND_MAX + 1.0f);
target.y = 1024.0f*rand() / (RAND_MAX + 1.0f);
target.z = 1024.0f*rand() / (RAND_MAX + 1.0f);
// set kdtree search
int K = 10;
std::vector<int> pointIdxNKNSearch(K);
std::vector<float> pointNKNSquaredDistance(K);
std::cout << "K nearset neighbor search at (" <<
target.x << " " << target.y << " " << target.z <<
"), with K = " << K << std::endl;
if (kdtree.nearestKSearch(target, 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;
}
end = clock();
double time = (end - begin) * 1000 / CLOCKS_PER_SEC;
std::cout << "time: " << time << "ms" << std::endl;
return 0;
}