c++ - 将点云投影到其特征向量上

标签 c++ pca point-cloud-library

引用我的另一个答案question我尝试将两个点云投影到它们的特征向量。

我正在使用 c++PointCloudLibrary 。不幸的是,我无法找到 PCA 类的良好文档。

model_cloud 是我的点云时,我尝试了以下方法来进行投影:

pcl::PCA<pcl::PointNormal> pca;
pca.setInputCloud(model_cloud_ptr);
pcl::PointCloud<pcl::PointNormal> projection;
pca.project(model_cloud_nt, projection);

Eigen::Matrix3f ev_M = pca.getEigenVectors();

我不明白为什么我必须设置这个inputCloud,然后给出一个特定的云作为投影的参数。我只想将其 PCA 降为 2D 并获得特征向量。

有人可以帮助我吗?非常感谢!

最佳答案

我相信您正在尝试将云放入其特征空间中(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 的特征向量可以直接插入到变换矩阵中作为旋转矩阵,因为它们总是相互正交的(即表示一个帧)。还取中点,以便与 vector 结合,可以生成完整的变换矩阵,该矩阵(当应用于目标云时)将移动它,使其均值位于原点,并且其变化的主轴与笛卡尔坐标对齐系统(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());

关于c++ - 将点云投影到其特征向量上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59578991/

相关文章:

c++ - 当不在包含路径中时,Eclipse CDT 自动引入/usr/include/boost

memory-management - 似乎Random使使用Point Cloud Library处理Pointcloud崩溃-可能是内存问题?

c++ - 从 OPENCV 中的图像中删除特定图案

c++ - 在 C++ 中使用标准流的灵活记录器类

python - 在 c++ 中嵌入 python,示例

machine-learning - PCA、TruncatedSVD 和 ICA 之间的详细区别是什么?

C++,在文件上存储和更新大型 B+ 树(非集群)结构

python - 使用 Numpy 实现 PCA

pca - 什么时候使用 ICA 而不是 PCA?

c++ - 从 pcl::people::Person Cluster<Point> 中提取点云