我相信您正在尝试将云放入其特征空间(orientedGolden 是特征空间中的云)。这是可以做到的:
pcl::PCA<pcl::PointXYZ> pcaGolden;
pcl::PointCloud<pcl::PointXYZ>::Ptr orientedGolden(new pcl::PointCloud<pcl::PointXYZ>);
pcaGolden.setInputCloud(goldenCloud);
pcaGolden.project(*goldenCloud, *orientedGolden);
//this is the scale factor described in the other question
pcl::PointXYZ goldenMin, goldenMax;
pcl::getMinMax3D(*orientedGolden, goldenMin, goldenMax);
double scale = goldenMax.x - goldenMin.x;
说明:PCA 用于计算变异的均值轴和主轴。来自 PCA 的特征向量可以作为旋转矩阵直接插入到变换矩阵中,因为它们总是相互正交的(即表示一个框架)。还取中点,以便与向量组合,可以制作一个完整的变换矩阵,该矩阵(当应用于目标云时)将移动它,使其平均值位于原点,并且其主轴变化与笛卡尔坐标对齐系统 (xyz)。这对于获得所谓的定向边界框(我认为您在另一个问题中尝试做的事情)很有用,这是围绕其特征空间中的云计算的边界框。定向边界框优于一般边界框的原因在于,尽管对给定的云进行了任意数量的旋转,但对于给定的云,它将保持不变,而标准边界框的尺寸会有所不同。
项目功能:
这个:
pcl::PointCloud<pcl::PointXYZ>::Ptr orientedGolden(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCA<pcl::PointXYZ> pcaGolden;
pcaGolden.setInputCloud(goldenCloud);
pcaGolden.project(*goldenCloud, *orientedGolden);
相当于这个:
pcl::PointCloud<pcl::PointXYZ>::Ptr orientedGolden(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCA<pcl::PointXYZ> pcaGolden;
pcaGolden.setInputCloud(goldenCloud);
Eigen::Matrix3f goldenEVs_Dir = pcaGolden.getEigenVectors();
Eigen::Vector4f goldenMidPt = pcaGolden.getMean();
Eigen::Matrix4f goldenTransform = Eigen::Matrix4f::Identity();
goldenTransform.block<3, 3>(0, 0) = goldenEVs_Dir;
goldenTransform.block<4, 1>(0, 3) = goldenMidPt;
pcl::transformPointCloud(*goldenCloud, *orientedGolden, goldenTransform.inverse());