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 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
#include <pcl/io/pcd_io.h> //文件输入输出 #include <pcl/octree/octree_search.h> //octree相关定义 #include <pcl/visualization/cloud_viewer.h> //vtk可视化相关定义 #include <pcl/point_types.h> //点类型相关定义
#include <iostream> #include <vector>
int main() { pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>); if (pcl::io::loadPCDFile<pcl::PointXYZRGB>("rabbit.pcd", *cloud) == -1) { PCL_ERROR("Cloudn't read file!"); return -1; }
for (size_t i = 0; i < cloud->points.size(); ++i){ cloud->points[i].r = 255; cloud->points[i].g = 255; cloud->points[i].b = 255; }
float resolution = 0.03f; pcl::octree::OctreePointCloudSearch<pcl::PointXYZRGB> octree(resolution); octree.setInputCloud(cloud); octree.addPointsFromInputCloud();
pcl::PointXYZRGB searchPoint1 = cloud->points[1250]; std::vector<int> pointIdxVec; if (octree.voxelSearch(searchPoint1, pointIdxVec)) { std::cout << "Neighbors within voxel search at (" << searchPoint1.x << " " << searchPoint1.y << " " << searchPoint1.z << ")" << std::endl;
for (size_t i = 0; i < pointIdxVec.size(); ++i){ cloud->points[pointIdxVec[i]].r = 255; cloud->points[pointIdxVec[i]].g = 0; cloud->points[pointIdxVec[i]].b = 0; } }
pcl::PointXYZRGB searchPoint2 = cloud->points[3000]; int K = 200; std::vector<int> pointIdxNKNSearch; std::vector<float> pointNKNSquaredDistance;
std::cout << "K nearest neighbor search at (" << searchPoint2.x << " " << searchPoint2.y << " " << searchPoint2.z << ") with K=" << K << std::endl;
if (octree.nearestKSearch(searchPoint2, K, pointIdxNKNSearch, pointNKNSquaredDistance) > 0) { for (size_t i = 0; i < pointIdxNKNSearch.size(); ++i){ cloud->points[pointIdxNKNSearch[i]].r = 0; cloud->points[pointIdxNKNSearch[i]].g = 255; cloud->points[pointIdxNKNSearch[i]].b = 0; } } std::cout << "K = 200近邻点个数:" << pointIdxNKNSearch.size() << endl;
pcl::PointXYZRGB searchPoint3 = cloud->points[6500]; std::vector<int> pointIdxRadiusSearch; std::vector<float> pointRadiusSquaredDistance; float radius = 0.02;
std::cout << "Neighbors within radius search at (" << searchPoint3.x << " " << searchPoint3.y << " " << searchPoint3.z << ") with radius=" << radius << std::endl;
if (octree.radiusSearch(searchPoint3, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0) { for (size_t i = 0; i < pointIdxRadiusSearch.size(); ++i){ cloud->points[pointIdxRadiusSearch[i]].r = 0; cloud->points[pointIdxRadiusSearch[i]].g = 0; cloud->points[pointIdxRadiusSearch[i]].b = 255; } } std::cout << "半径0.02近邻点个数: " << pointIdxRadiusSearch.size() << endl;
pcl::visualization::CloudViewer viewer("cloud viewer"); viewer.showCloud(cloud);
system("pause"); return 0; }
|