#include <iostream>
#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/io/pcd_io.h>
#include <vector>
#include <cmath>
#include <ctime>
int main()
{
srand(time(NULL));
pcl::PointCloud<pcl::PointXYZ>::Ptr my_cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::io::loadPCDFile<pcl::PointXYZ> ("E:\\vs_code\\rabbit.pcd", *my_cloud);
pcl::KdTreeFLANN<pcl::PointXYZ> kdtree;
kdtree.setInputCloud(my_cloud);
pcl::PointXYZ min;
pcl::PointXYZ max;
pcl::PointXYZ searchPoint;
pcl::getMinMax3D(*my_cloud,min,max);
searchPoint.x = (min.x +max.x)/2;
searchPoint.y = (min.y +max.y)/2;
searchPoint.z = (min.x +max.z)/2;
//利用getMinMax函数得到点云的边界范围,作为搜寻点
std::cout<<searchPoint.x<<" "<<searchPoint.y<<" "<<searchPoint.z<<std::endl;
int K = 10;
//pointId用于存储点索引
std::vector<int> pointId(K);
//pointSquareDistance存储最近点距离的平方
std::vector<float> pointSquareDistance(K);
if(kdtree.nearestKSearch(searchPoint,K,pointId,pointSquareDistance)>0)
{
for(size_t i=0;i<pointId.size();++i)
std::cout<<my_cloud->points[ pointId[i]].x
<<" "<<my_cloud->points[ pointId[i]].y
<<" "<<my_cloud->points[ pointId[i]].z
<<" .the SquareDistance is "<<pointSquareDistance[i]<<std::endl;
}
//半径范围内搜索
double r = 0.01;
if(kdtree.radiusSearch(searchPoint,r,pointId,pointSquareDistance)>0)
{
for(size_t i=0;i<pointId.size();++i)
std::cout<<my_cloud->points[ pointId[i]].x
<<" "<<my_cloud->points[ pointId[i]].y
<<" "<<my_cloud->points[ pointId[i]].z
<<" .the SquareDistance is "<<pointSquareDistance[i]<<std::endl;
}
system("pause");
return 0 ;
}
为了在VS2010上写起来更方便一些,顺手安装了一个VAssist,就不用每个都自己ctrl+j来提示了
最后输出的结果:
主要是两个函数
kdtree.nearestKSearch(searchPoint,K,pointId,pointSquareDistance
kdtree.radiusSearch(searchPoint,r,pointId,pointSquareDistance)
懒得解释了