点云数据通过pcl的kdtree搜索关键点某半径邻域内的区域

利用pcl中的kdtree可以做到搜索关键点某半径邻域内的区域.

主要步骤

1.读入点云数据
2.设置kdtree
3.设置关键点和邻域半径
4.执行搜索函数

附上代码

#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <vector>
using namespace std;

typedef pcl::PointXYZI PointType;
int main(int argc, char** argv)
{
    if(argc != 3)
    {
        cerr<<"输入参数数量不对!"<<endl;
        exit(1);
    }
    string input_filename = argv[1];
    string output_filename = argv[2];

    pcl::PointCloud<PointType>::Ptr cloud(new pcl::PointCloud<PointType>());

    std::string format = input_filename.substr(input_filename.length()-4, 4);
    //std::cout<<"pointcloud format:"<<format<<std::endl;
    if(format == ".ply")
    {
        if(pcl::io::loadPLYFile(input_filename, *cloud)==-1)
        {
            PCL_ERROR("error! \n");
            exit(1);
        }
    }
    else if(pcl::io::loadPCDFile(input_filename, *cloud)==-1)
    {
        PCL_ERROR("error! \n");
        exit(1);
    }

    //创建kdtree 结构
    pcl::KdTreeFLANN<PointType> kdtree;
    //传入点云
    kdtree.setInputCloud(cloud);

    pcl::PointCloud<PointType>::Ptr source_key_Neigh(new pcl::PointCloud<PointType>());

    //设置关键点
    PointType searchPoint;
    searchPoint.x = 0;
    searchPoint.y = 0;
    searchPoint.z = 0;

    // 创建两个向量,分别存放近邻的索引值、近邻的中心距
    std::vector<int> pointIdxRadiusSearch;
    std::vector<float> pointRadiusSquaredDistance;

    // 指定随机半径
    //float radius = 256.0f * rand () / (RAND_MAX + 1.0f);
    float radius = 15;

    std::cout << "Neighbors within radius search at (" << searchPoint.x
            << " " << searchPoint.y
            << " " << searchPoint.z
            << ") with radius=" << radius << std::endl;

    // kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) 
    if ( kdtree.radiusSearch (searchPoint, radius, pointIdxRadiusSearch, pointRadiusSquaredDistance) > 0 )
    {
        cout<<"最近邻点数: "<<pointIdxRadiusSearch.size ()<<endl;
        for (size_t i = 0; i < pointIdxRadiusSearch.size (); ++i)
        {
//            std::cout << cloud->points[ pointIdxRadiusSearch[i] ].x
//                      << " " << cloud->points[ pointIdxRadiusSearch[i] ].y
//                      << " " << cloud->points[ pointIdxRadiusSearch[i] ].z
//                      << " (squared distance: " << pointRadiusSquaredDistance[i] << ")" << std::endl;
            source_key_Neigh->push_back(cloud->points[pointIdxRadiusSearch[i]]);
        }
        pcl::io::savePCDFile(output_filename, *source_key_Neigh);
    }
    else
        cout<<"找不到最近点"<<endl;

    cout<<"end"<<endl;
    return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)

project(search_pc_neighbourhood)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

# pcl
find_package( PCL 1.7 REQUIRED)
include_directories( ${PCL_INCLUDE_DIRS} )
add_definitions( ${PCL_DEFINITIONS} )
#LINK_DIRECTORIES(${PCL_LIBRARY_DIRS}$)

list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4")
add_executable(main "main.cpp")
target_link_libraries(main ${PCL_LIBRARIES})

效果展示
在这里插入图片描述

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值