在点云库 (PCL) 中使用自定义点类型的问题
Problems with using custom point type in Point Cloud Library (PCL)
我在尝试使用 PCL 注册两个点云时遇到了问题。我没有使用提供的 PointT,而是使用了自定义点类型并遵循了教程(http://www.pointclouds.org/documentation/tutorials/adding_custom_ptype.php#adding-custom-ptype(。但是,当我在VS2019中编写代码时,它失败了。我也尝试了这篇文章(PCL 实例化所有函数的新点类型(。它也没有用。
这是要点的定义
#ifndef PCL_NO_PRECOMPILE
#define PCL_NO_PRECOMPILE
#endif
#include <iostream>
#include <pcl/pcl_macros.h>
#include <pcl/point_types.h>
#include <pcl/impl/point_types.hpp>
#include <pcl/impl/instantiate.hpp>
#include <pcl/point_cloud.h>
#include <pcl/impl/point_types.hpp>
#include <pcl/common/transforms.h>
#include <pcl/common/impl/transforms.hpp>
#include <pcl/registration/icp.h>
#include <pcl/registration/impl/icp.hpp>
#include <pcl/features/fpfh.h>
#include <pcl/features/impl/fpfh.hpp>
#include <pcl/features/pfh.h>
#include <pcl/features/impl/pfh.hpp>
#include <pcl/registration/ia_ransac.h>
#include <pcl/registration/impl/ia_ransac.hpp>
#include <pcl/features/normal_3d.h>
#include <pcl/features/impl/normal_3d.hpp>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/kdtree/impl/kdtree_flann.hpp>
#include <pcl/filters/voxel_grid.h>
#include <pcl/filters/impl/voxel_grid.hpp>
#include <pcl/filters/approximate_voxel_grid.h>
#include <pcl/filters/impl/approximate_voxel_grid.hpp>
#include <Eigen/Core>
struct dPointXYZ {
double x;
double y;
double z;
};
POINT_CLOUD_REGISTER_POINT_STRUCT(dPointXYZ,
(double, x, x)
(double, y, y)
(double, z, z)
)
PCL_INSTANTIATE(VoxelGrid, dPointXYZ);
PCL_INSTANTIATE(NormalEstimation, dPointXYZ);
PCL_INSTANTIATE(KdTree, dPointXYZ);
PCL_INSTANTIATE(FPFHEstimation,dPointXYZ);
PCL_INSTANTIATE(SampleConsensusInitialAlignment, dPointXYZ)
以下是自定义点类型的使用方式
void voxelFilteringPoints(pcl::PointCloud<pcl::dPointXYZ>::Ptr& ProjPoint, pcl::PointCloud<pcl::dPointXYZ>::Ptr& filteredPoints, float dGridSize)
{
pcl::VoxelGrid<pcl::dPointXYZ> ApproximateVoxelGrid;
ApproximateVoxelGrid.setLeafSize(dGridSize, dGridSize, dGridSize);
ApproximateVoxelGrid.setInputCloud(ProjPoint);
ApproximateVoxelGrid.filter(*filteredPoints);
//std::cout<<"Filtered points size: "<<*filteredPoints<<std::endl;
}
pcl::PointCloud<dNormal>::Ptr computeNormals(pcl::PointCloud<dPointXYZ>::Ptr& ProjPoint, double dNormalsRadius)
{
pcl::PointCloud<dNormal>::Ptr NormalsPtr(new pcl::PointCloud<dNormal>());
pcl::NormalEstimation<dPointXYZ, dNormal> NormEstimate;
NormEstimate.setInputCloud(ProjPoint);
NormEstimate.setRadiusSearch(dNormalsRadius);
pcl::search::KdTree<dPointXYZ>::Ptr PtrSearchMethod(new pcl::search::KdTree<dPointXYZ>);
NormEstimate.setSearchMethod(PtrSearchMethod);
NormEstimate.compute(*NormalsPtr);
//std::cout<<"Normals size: "<<*NormalsPtr<<std::endl;
return NormalsPtr;
}
pcl::PointCloud<pcl::FPFHSignature33>::Ptr getFPFHFeatures(pcl::PointCloud<dPointXYZ>::Ptr& ProjCloud, pcl::PointCloud<dNormal>::Ptr& ProjNormals, double dFeatureRadius)
{
pcl::PointCloud<pcl::FPFHSignature33>::Ptr FPFHFeatures(new pcl::PointCloud<pcl::FPFHSignature33>());
//std::cout<<"FPFH size: "<<FPFHFeatures<<std::endl;
pcl::search::KdTree<dPointXYZ>::Ptr PtrSearchMethod(new pcl::search::KdTree<dPointXYZ>);
pcl::FPFHEstimation<dPointXYZ, dNormal, pcl::FPFHSignature33> FPFHEstimate;
FPFHEstimate.setInputCloud(ProjCloud);
FPFHEstimate.setInputNormals(ProjNormals);
FPFHEstimate.setSearchMethod(PtrSearchMethod);
FPFHEstimate.setRadiusSearch(dFeatureRadius);
FPFHEstimate.compute(*FPFHFeatures);
return FPFHFeatures;
}
pcl::SampleConsensusInitialAlignment<dPointXYZ,dPointXYZ, pcl::FPFHSignature33> alignFPFH(pcl::PointCloud<dPointXYZ>::Ptr& ProjPoint1,
pcl::PointCloud<dPointXYZ>::Ptr& ProjPoint2, pcl::PointCloud<pcl::FPFHSignature33>::Ptr& FPFHProjFeatures1,
pcl::PointCloud<pcl::FPFHSignature33>::Ptr& FPFHProjFeatures2, int iMaxIterations, double dMinDist, double dMaxDist)
{
pcl::SampleConsensusInitialAlignment<dPointXYZ, dPointXYZ, pcl::FPFHSignature33> SCIA;
Eigen::Matrix4f transMatrix;
SCIA.setInputCloud(ProjPoint2);
SCIA.setSourceFeatures(FPFHProjFeatures2);
SCIA.setInputTarget(ProjPoint1);
SCIA.setTargetFeatures(FPFHProjFeatures1);
SCIA.setMaximumIterations(iMaxIterations);
SCIA.setMinSampleDistance(dMinDist);
SCIA.setMaxCorrespondenceDistance(dMaxDist);
pcl::PointCloud<dPointXYZ> registeredCloud;
SCIA.align(registeredCloud);
SCIA.getCorrespondenceRandomness();
return SCIA;
}
编译器指示已定义类模板。 错误 C2953 'pcl::d etail::转换器':已定义类模板 C:\Program 文件\PCL_1.9.1\include\pcl-1.9\pcl\common\impl\transforms.hpp 89
错误 C2995 'void pcl::transformPointCloud(const pcl::P ointCloud &,pcl::P ointCloud &,const Eigen::Transform &,bool(':函数模板已定义 C:\Program Files\PCL_1.9.1\include\pcl-1.9\pcl\common\impl\transforms.hpp 215
错误 C2995 'void pcl::transformPointCloud(const pcl::P ointCloud &,const std::vector> &,pcl::P ointCloud &,const Eigen::Transform &,bool(':函数模板已定义
我知道我可以通过规范化点来简单地使用浮点类型,但我想尝试自定义点类型。你有什么想法如何解决这个问题吗?
似乎在包含任何PCL头文件之前需要定义PCL_NO_PRECOMPILE
。从"模板已经定义"错误来看。
检查您的.cpp文件,例如在 main 中.cpp
#define PCL_NO_PRECOMPILE // !! BEFORE ANY PCL INCLUDE!!
#include <pcl/....h>
#include "your_file_that_shows_how_the_custom_point_type_is_used.h"
int main(){...}
- 使用QJsEngine在Qt中注册自定义类型
- 当我使用自定义类型创建动态数组时,即使使用字符串,它似乎也不起作用
- QtQuick - qml:28:错误:未知方法返回类型:自定义类型
- 如何使自定义类型在unordered_map中用作键
- Qt5 远程对象 + 自定义类型,但不在 POD 中
- 标准::原子中的自定义类型
- 如何使用自定义类型声明Arduino数组?
- 使用自定义访问者时具有自定义类型的提升变体失败(源自 boost::static_visitor)
- 您可以将binary_search应用于具有自定义类型的矢量吗?
- 在自定义类型图中重用 SWIG 映射
- 扩展自定义类型的spdlog
- 重载自定义类型的 std::to_string 和 std::to_chars?
- 自定义类型转换运算符在转发引用上调用时不起作用(当对象按值传递时有效)
- 初始化自定义类型构造函数的数组
- 如何使用 QListIterator 的声明自定义类型定义
- 向前删除标题文件中其他名称空间的自定义类型
- 如何为提升日志和自定义类型定义输出流运算符
- typedef 中的自定义类型为 Qt MetaType
- 无法专门化 std::hash 以unordered_map存储自定义类型
- 运算符/ STD :: Chrono ::持续时间和自定义类型与Clang