C++ 在点云库(PCL)中使用自定义点类型时出现问题

C++ 在点云库(PCL)中使用自定义点类型时出现问题,c++,registration,point-cloud-library,C++,Registration,Point Cloud Library,我在尝试使用PCL注册两点云时遇到了一个问题。我没有使用提供的point,而是使用自定义point类型并遵循教程()。然而,当我遵守VS2019中的代码时,它失败了。我也试过这个帖子()。它也不起作用 以下是该点的定义 #ifndef PCL_NO_PRECOMPILE #define PCL_NO_PRECOMPILE #endif #include <iostream> #include <pcl/pcl_macros.h> #include <pcl/poin

我在尝试使用PCL注册两点云时遇到了一个问题。我没有使用提供的point,而是使用自定义point类型并遵循教程()。然而,当我遵守VS2019中的代码时,它失败了。我也试过这个帖子()。它也不起作用

以下是该点的定义

#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)
\ifndef PCL\u NO\u预编译
#定义PCL\u否\u预编译
#恩迪夫
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
结构dPointXYZ{
双x;
双y;
双z;
};
点云寄存器点结构(dPointXYZ,
(双倍,x,x)
(双倍,y,y)
(双倍,z,z)
)
PCL_实例化(体素网格,dPointXYZ);
PCL_实例化(正态估计,dPointXYZ);
PCL_实例化(KdTree,dPointXYZ);
PCL_实例化(fpfh估计,dPointXYZ);
PCL_实例化(样本一致性对齐,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;
}
void体素过滤点(pcl::PointCloud::Ptr&ProjPoint,pcl::PointCloud::Ptr&filteredPoints,浮点dGridSize)
{
体素网格近似体素网格;
setLeafSize(dGridSize,dGridSize,dGridSize);
setInputCloud(ProjPoint);
近似像素网格过滤器(*filteredPoints);

//std::cout似乎在包含任何PCL头文件之前需要定义
PCL\u NO\u PRECOMPILE
。从“模板已定义”错误判断

检查.cpp文件,例如在main.cpp中

#在任何PCL包含之前定义PCL_NO_PRECOMPILE/!!
#包括
#包括“您的文件显示自定义点类型的使用方式。h”
int main(){…}