我有一个盘子的云数据,它是扭曲的而不是平板,并且它上面有一些簇,通过使用Euclidean Cluster Extraction我已经提取了所有簇并将它们保存到一个单独的PCD文件中,提取集群的时间我只能保存边界,而不提取特征文件的其余部分。
为了提取剩余的特征,我正在进行PCA并在集群中获取最小值和最大值,并能够绘制边界框,如下图所示。 BoundingBox
现在我正在使用给定群集的Min和Max值构建条件过滤器并尝试提取盒子内的点,但是当我在盒子内部取出特征时,我只得到几个点,如下面的图像。 ExtrcatedFeatures
注意:为了更好地理解,我的观点有点暗。
有人可以建议我如何提取给定边界框中的所有功能。
对于参考,我还添加了我用于使用条件过滤器进行特征提取的代码。
int BoundingBox()
{
// your point cloud
pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_ptr (new pcl::PointCloud<pcl::PointXYZ> ());
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ> ());
pcl::PointCloud<pcl::PointXYZ>::Ptr Full_cloud (new pcl::PointCloud<pcl::PointXYZ> ());
pcl::PCDReader reader, reader_fullcloud;
pcl::PCDWriter writer;
std::stringstream ss;
pcl::PointIndices::Ptr fInliers_part_cloud (new pcl::PointIndices);
//For testing I hav been using the extracted clusters separetly
reader.read("cloud_cluster_1.pcd", *point_cloud_ptr);
reader.read("pcd_feature.pcd", *Full_cloud);
// 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(Full_cloud);
viewer.addCube(tfinal, qfinal, max_pt.x - min_pt.x, max_pt.y - min_pt.y, max_pt.z - min_pt.z);
viewer.spin();
pcl::ConditionAnd<pcl::PointXYZ>::Ptr range_cond (new
pcl::ConditionAnd<pcl::PointXYZ> ());
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
pcl::FieldComparison<pcl::PointXYZ> ("x", pcl::ComparisonOps::GT, min_pt.x)));
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
pcl::FieldComparison<pcl::PointXYZ> ("x", pcl::ComparisonOps::LT, max_pt.x)));
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
pcl::FieldComparison<pcl::PointXYZ> ("y", pcl::ComparisonOps::GT, min_pt.y)));
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
pcl::FieldComparison<pcl::PointXYZ> ("y", pcl::ComparisonOps::LT, max_pt.y)));
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::GT, min_pt.z)));
range_cond->addComparison (pcl::FieldComparison<pcl::PointXYZ>::ConstPtr (new
pcl::FieldComparison<pcl::PointXYZ> ("z", pcl::ComparisonOps::LT, max_pt.z)));
// build the filter
pcl::ConditionalRemoval<pcl::PointXYZ> condrem;
condrem.setCondition (range_cond);
condrem.setInputCloud (Full_cloud);
// apply filter
condrem.filter (*cloud_filtered);
ss << "Filtered_Cloud.pcd";
writer.write<pcl::PointXYZ> (ss.str (), *cloud_filtered, false);
return(0);
}
我正在使用PCL 1.6.0,Win 7和Visual Studio 2010。
非常感谢任何建议都会有所帮助