kd树例程实现
写给第一次用pcl的朋友,帮着入个门。因为要用到kd树,所以用kd树做例子分享一下简易入门系列。
途径
配镜环境
生成
1.途径
我买的是《点云库pcl从入门到精通》这本书,写的挺好;还可以从官网的Tutorials里直接看,非常全面,初学者建议先看它。
官网地址:(http://www.pclcn.org/)
按步骤点就可以:
在里面找到相应需要的模块,直接复制代码就可以了。
2.配置环境
可以自己配置也可以用cmake配置,因为自己配置太麻烦,需要的可以私聊我,我告诉你怎么做。这里我用cmake
新建三个文件,如下图所示:
在CmakeLists里面添加如下内容:
**
cmake_minimum_required(VERSION 2.8 FATAL_ERROR) project(kdtree_search)
find_package(PCL 1.2 REQUIRED)
include_directories( P C L I N C L U D E D I R S ) l i n k d i r e c t o r i e s ( {PCL_INCLUDE_DIRS}) link_directories( PCLINCLUDEDIRS)linkdirectories({PCL_LIBRARY_DIRS})
add_definitions(${PCL_DEFINITIONS}) add_executable (kdtree_search
kdtree_search.cpp) target_link_libraries (kdtree_search
${PCL_LIBRARIES})
**
.cpp里面添加
#include <pcl/point_cloud.h>
#include <pcl/kdtree/kdtree_flann.h>#include
#include
#includeint main (int argc, char** argv) { srand (time (NULL));
pcl::PointCloudpcl::PointXYZ::Ptr cloud (new
pcl::PointCloudpcl::PointXYZ);// Generate pointcloud data cloud->width = 1000; cloud->height =
1; cloud->points.resize (cloud->width * cloud->height);for (std::size_t i = 0; i < cloud->size (); ++i) {
(*cloud)[i].x = 1024.0f * rand () / (RAND_MAX + 1.0f);
(*cloud)[i].y = 1024.0f * rand () / (RAND_MAX + 1.0f);
(*cloud)[i].z = 1024.0f * rand () / (RAND_MAX + 1.0f); }pcl::KdTreeFLANNpcl::PointXYZ kdtree;
kdtree.setInputCloud (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);// K nearest neighbor search
int K = 10;
std::vector pointIdxNKNSearch(K); std::vector
pointNKNSquaredDistance(K);std::cout << “K nearest neighbor search at (” << searchPoint.x
<< " " << searchPoint.y
<< " " << searchPoint.z
<< “) with K=” << K << std::endl;if ( kdtree.nearestKSearch (searchPoint, K, pointIdxNKNSearch,
pointNKNSquaredDistance) > 0 ) {
for (std::size_t i = 0; i < pointIdxNKNSearch.size (); ++i)
std::cout << " " << (*cloud)[ pointIdxNKNSearch[i] ].x
<< " " << (*cloud)[ pointIdxNKNSearch[i] ].y
<< " " << (*cloud)[ pointIdxNKNSearch[i] ].z
<< " (squared distance: " << pointNKNSquaredDistance[i] << “)” << std::endl; }// Neighbors within radius search
std::vector pointIdxRadiusSearch; std::vector
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;if ( kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch,
pointRadiusSquaredDistance) > 0 ) {
for (std::size_t i = 0; i < pointIdxRadiusSearch.size (); ++i)
std::cout << " " << (*cloud)[ pointIdxRadiusSearch[i] ].x
<< " " << (*cloud)[ pointIdxRadiusSearch[i] ].y
<< " " << (*cloud)[ pointIdxRadiusSearch[i] ].z
<< " (squared distance: " << pointRadiusSquaredDistance[i] << “)” << std::endl; }return 0; }
3.生成
做好上述之后,打开cmake
如下图所示,进行正确配置,变红不要害怕,再点击依次配置就好了,不红了就点生成。会显示最下面的两个done。
然后打开这个,点击生成,如果生成不成功,点击重新生成方案,还不成功,就点生成–配置管理器,勾选全部之后,再重新生成。生成之后,就在下图Release文件夹下出现了一个应用程序。
打开这个应用程序,可以用cmd。windows+r,再输入cmd,打开界面,找到应用程序所在路径,输入应用程序名,就可以打开了。如下图:
如果cmd打开后路径不同,就cd,一路cd下去就可以了。
结语
原理方面各种博客写的很详细了,我在这里就不做说明了,如果觉得我这更加靠谱就私聊我或者在下方评论下想让我再补充些什么。大家如果觉得内容可靠能实现,还请点赞评论收藏三连,让文章能更快的被其他伙伴看到。