好的,所以我有一个OBJ文件,我读到了PCLpointcloud2。现在我想把它喂成K-dTree。这不是将PCLPointCloud2作为输入。如果它位于我的OBJ文件的表面上,我想查询任何一般点。 我发现很难理解他们的文档。那怎么办呢? 另外,请指出一个易于解释的好参考。什么是“PointT”BTW?是我们定义的自定义构建类型吗?请详细说明。
答案 0 :(得分:0)
查看提供的工具pcl_mesh_sampling
中的代码(在tools/mesh_sampling.cpp
下的PCL代码目录中)。它相对简单。它从PLY或OBJ加载模型,然后为每个三角形从三角形中采样随机点。然后,最终点云经历体素网格样本以使得点相对均匀。或者,您可以在obj文件上运行pcl_mesh_sampling
程序以获取输出PCD,然后在将PCD文件加载到您自己的代码之前,可以使用pcl_viewer
进行可视化。
获得最终点云后,您可以根据http://pointclouds.org/documentation/tutorials/kdtree_search.php构建和使用KD树
PointT
是模板参数。点云库可以处理各种点类型,从简单的PointXYZ(只有x,y,z)到更复杂的点,如PointXYZRGBNormal(有x,y,z,normal_x,normal_y,normal_z,曲率,r,g,和b通道)。每种算法都根据您要使用的点类型进行模板化。如果将PointXYZ与OBJ文件一起使用可能会更容易,因此请将pcl :: PointXYZ用于所有模板参数。有关模板的更多信息,请参阅http://www.tutorialspoint.com/cplusplus/cpp_templates.htm和http://pointclouds.org/documentation/tutorials/adding_custom_ptype.php。
更新(回复最新评论)
此处已添加,因为此回复对于评论来说太长了。
我想我知道你得到了什么。所以当你从点云和点云中采样点时建立一个物体表面的KD树,并为每个点跟踪哪些面在该点附近(可能所有与该点相邻的面都应该是足够的?只有一个面肯定是不够的)。然后,当给出查询点时,您会在KD树中找到最近的点,并检查查询点是否位于与KD树中该点关联的附近面的完整列表的“外部”或内部。如果它在所有这些的“内部”,也许它是一个内部点。但我不能保证这是真的。那是我现在对这个问题的看法。但我确实想知道你是否真的需要基于网格的方法。顺便说一下,如果你将网格划分为凸起部分,那么在处理每个凸起部分时你可以得到很好的保证。