目前我正在使用PCL 1.8.0,我们有一个板的样本云数据,其中有一些组件安装在板上,在实际板上几厘米以上。
这是包含集群和特征数据的云数据。云数据
通过使用欧几里得聚类提取,我能够从样本数据中获得聚类计数和聚类形状,并根据聚类数据和形状将这些聚类保存到不同的PCD中,如下所示。提取的集群数据
现在,如果你观察上面的图像,我们只得到集群的外部边界,根据我的要求,我希望集群的整个外部边界和内部特征被写入一个单独的PCD文件,为了进一步计算,
有谁能告诉我如何从给定的云数据中提取集群和特征数据并将其写入单独的PCD文件吗?
任何建议都会有帮助的
Thanks in Advance
一个可能的解决方案:
- 像你已经在做的那样计算集群。
- 选择您感兴趣的集群
- 计算包含集群的最小定向边界框。
- 使用计算框剪辑原始点云,获得框内的所有点。
在PCL论坛上描述了计算最小定向边界框的过程。然而,这里是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)变换你必须应用的是旋转= (e0, e1, e0 X e1) &翻译=旋转* center_diag + (c0, c1, c2)
首先感谢您的建议。
正如你所建议的PCA和边界框,我已经创建了一个边界框,我也能够在PCL可视化器中查看创建的框,现在在获得边界框之后,我的目标是将生成的立方体保存到一个单独的PCD文件中,以便进一步计算。
这是我用来生成边界框的代码,谁能告诉我如何将生成的立方体保存到一个单独的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);
}
任何建议都会有帮助。