目前我正在使用PCL 1.8.0,我们正在获得一个板的样本云数据,其中一些组件安装在板上,在实际板上几厘米以上。
这是包含群集和功能数据的云数据。 Cloud Data
通过使用Euclidean聚类提取,我能够从样本数据中获取聚类计数和cluter形状,并根据聚类数据和形状将这些聚类保存到不同的PCD中,如下所示。 Extracted Cluster Data
现在,如果您在上面的图像中观察到我们只按照我的要求获得了集群的外边界,我希望将集群的整个外边界和内部特征写入单独的PCD文件,以便进一步计算,
任何人都可以建议我如何从给定的云数据中提取集群和特征数据,并将其写入单独的PCD文件。
任何建议都会有所帮助
先谢谢
答案 0 :(得分:0)
解决问题的一种可能方法:
PCL forums描述了计算最小方向边界框的过程。但是,为了方便和进一步参考,这里是Nicola Fioraio解决方案的概述:
1)计算质心(c0,c1,c2)和归一化协方差
2)计算特征向量e0,e1,e2。参考系统为(e0,e1,e0 X e1)---注:e0 X e1 = +/- e2
3)移动该RF中的点---注意:由旋转矩阵(e0,e1,e0 X e1)和&给出的变换。 (c0,c1,c2)必须倒置
4)计算对角线的最大值,最小值和中心
5)给出一个以原点为中心的框(max_pt.x - min_pt.x,max_pt.y - min_pt.y,max_pt.z - min_pt.z),你必须应用的转换是Rotation =(e0 ,e1,e0 X e1)& Translation = Rotation * center_diag +(c0,c1,c2)
答案 1 :(得分:0)
首先感谢你的建议。
正如你在PCA和Bounding框中建议的那样,我创建了一个边界框,我也可以在PCL Visualizer中查看创建的框,现在获得边界框后,我的目标是将生成的Cube保存到单独的PCD文件以供进一步计算。
以下是我用于生成Bounding Box的代码,可以建议我如何将生成的Cube保存到单独的PCD文件
int BoundingBox(pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_ptr)
{
// compute principal direction
Eigen::Vector4f centroid;
pcl::compute3DCentroid(*point_cloud_ptr, centroid);
Eigen::Matrix3f covariance;
computeCovarianceMatrixNormalized(*point_cloud_ptr, centroid,covariance);
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance, Eigen::ComputeEigenvectors);
Eigen::Matrix3f eigDx = eigen_solver.eigenvectors();
eigDx.col(2) = eigDx.col(0).cross(eigDx.col(1));
// move the points to the that reference frame
Eigen::Matrix4f p2w(Eigen::Matrix4f::Identity());
p2w.block<3,3>(0,0) = eigDx.transpose();
p2w.block<3,1>(0,3) = -1.f * (p2w.block<3,3>(0,0) * centroid.head<3>());
pcl::PointCloud<pcl::PointXYZ> cPoints;
pcl::transformPointCloud(*point_cloud_ptr, cPoints, p2w);
pcl::PointXYZ min_pt, max_pt;
pcl::getMinMax3D(cPoints, min_pt, max_pt);
const Eigen::Vector3f mean_diag = 0.5f*(max_pt.getVector3fMap() + min_pt.getVector3fMap());
// final transform
const Eigen::Quaternionf qfinal(eigDx);
const Eigen::Vector3f tfinal = eigDx*mean_diag + centroid.head<3>();
// draw the cloud and the box
pcl::visualization::PCLVisualizer viewer;
viewer.addPointCloud(point_cloud_ptr);
viewer.addCube(tfinal, qfinal, max_pt.x - min_pt.x, max_pt.y - min_pt.y, max_pt.z - min_pt.z);
viewer.spin();
return(0);
}
任何建议都会有所帮助。 在此先感谢