使用PCL 1.6.0从边界框中拾取点数

时间:2016-12-15 10:56:40

标签: c++ visual-studio-2010 windows-7 point-cloud-library

我有一个盘子的云数据,它是扭曲的而不是平板,并且它上面有一些簇,通过使用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。

非常感谢任何建议都会有所帮助

0 个答案:

没有答案