在其特征向量上投影点云
Projecting pointcloud on its eigenvectors
参考我另一个问题的答案,我试图将两个点云投影到它们的特征向量上。
我正在使用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并获得特征向量。
谁能帮我?多谢!
我相信你正在尝试将云放入它的特征空间中(定向Golden是特征空间中的云(。 这是可以做到的:
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());
要计算主分量(计算特征向量(,您需要:
pcl::PCA<pcl::PointXYZ> pca(cloud); // computed in the constructor
Eigen::Matrix3f eigen_vectors = pca.getEigenVectors(); // returns computed eigen vectors as a matrix
或者(getEigenVectors(((:
pcl::PCA<pcl::PointNormal> pca;
pca.setInputCloud(cloud);
Eigen::Matrix3f eigen_vectors = pca.getEigenVectors(); // pca computed here
这两种方法都是合法的,此时,您已经计算了投影(主分量(。请注意,这是一个3D到3D投影(基本上是旋转(。2D 只是忽略第 3 轴(方差最小(的结果。您可以通过以下方式获取相关轴(特征向量(:
Eigen::Vector3f x_axis = eigen_vector.col(0);
Eigen::Vector3f y_axis = eigen_vector.col(1);
计算投影后,可以将其应用于任何云。
pca.project(cloud, projection); // project the cloud that was used to calculate the projection
pca.project(another_cloud, projection); // project any other cloud
最后一个例子:
pcl::PCA<pcl::PointNormal> pca;
pca.setInputCloud(cloud_a);
pca.project(cloud_b, projection); // calculate projection based on cloud_a, and apply the projection to cloud_b
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 如何通过派生类函数更改基类中的向量
- C++从另一个类访问公共静态向量的正确方法是什么
- 如何将ampl中的集合表示为c++中的向量
- 变量没有改变?通过向量的函数调用
- 迭代时从向量和内存中删除对象
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- 计算排序向量的向量中唯一值的计数
- 矩阵向量乘法(cublasDgemv)返回零
- 一对向量构造函数:初始值设定项列表与显式构造
- 将结构向量排序为子组
- 在其特征向量上投影点云
- 将结构化数据投影到std::向量的最有效方法是什么