2017-08-21 5 views
2

内で定義された3Dボックスの外側の点を削除し、私はすべてxyz方向ためmaxよりmin未満と大きいすべてのポイントを削除します。以下はサンプルコードです所与のポイントクラウドでPCLビジュアライザ

#include <pcl/io/io.h> 
#include <pcl/io/pcd_io.h> 
#include <pcl/filters/passthrough.h> 
#include <pcl/visualization/pcl_visualizer.h> 

// Define min and max for X, Y and Z 
float minX = -0.1, minY = -0.5, minZ = -2.5; 
float maxX = +0.1, maxY = +0.5, maxZ = +2.5; 

int main (int argc, char** argv) 
{ 
    pcl::visualization::PCLVisualizer viewer("Cloud Viewer"); 

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr body (new pcl::PointCloud<pcl::PointXYZRGBA>); 
    pcl::io::loadPCDFile ("body.pcd", *body); 

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr bodyFiltered (new pcl::PointCloud<pcl::PointXYZRGBA>); 

    pcl::PassThrough<pcl::PointXYZRGBA> filter; 
    filter.setInputCloud (body); 
    filter.setFilterFieldName ("x"); 
    filter.setFilterLimits (minX, maxX); 
    filter.setFilterFieldName ("y"); 
    filter.setFilterLimits (minY, maxY); 
    filter.setFilterFieldName ("z"); 
    filter.setFilterLimits (minZ, maxZ); 
    filter.filter (*bodyFiltered); 

    viewer.addPointCloud (bodyFiltered,"body"); 
    viewer.spin(); 
    return 0; 
} 

最後のフィルタが適用されているようです。どんな解決策ですか?

+0

はあなたには、いくつかのサンプルデータ、サンプル出力を示し、あなたが唯一の最後のフィルタが適用されると結論どのように説明できますか? – Yunnosch

+0

@Yunnosch:データはセンサーから取得され、非常に騒々しいです。現在、私は最高の境界を見つけようとしているので、ほとんどのノイズを取り除くことができます。ちなみに、上記の方法はあなたに正しい見ていますか? –

+0

クラウドからポイントを削除するのではなく、有効なポイントのインデックスを取得したい場合は、 'pcl :: Clipper3D :: clipPointCloud3D'を使用することができます。 –

答えて

3

pcl::CropBoxはどうしますか? (documentation

pcl::CropBox<pcl::PointXYZRGBA> boxFilter; 
boxFilter.setMin(Eigen::Vector4f(minX, minY, minZ, 1.0)); 
boxFilter.setMax(Eigen::Vector4f(maxX, maxY, maxZ, 1.0)); 
boxFilter.setInputCloud(body); 
boxFilter.filter(*bodyFiltered); 
+0

優れています。それは魅力のように働く。どうもありがとうございました。 –

3

あなたはdocumentationが明らかにしたものを発見しました。このようConditionalRemoval

次のように異なるフィルタを使用する必要があり、複数のフィールドについては、

PassThrough passes points in a cloud based on constraints for one particular field of the point type.

はテストされていないが、それはこのようなものになるでしょう。

pcl::ConditionOr<PointT>::Ptr range_cond (new pcl::ConditionOr<PointT>()); 
range_cond->addComparison (pcl::FieldComparison<PointT>::Ptr (new pcl::FieldComparison<PointT>("x", pcl::ComparisonOps::GT, minX))); 
range_cond->addComparison (pcl::FieldComparison<PointT>::Ptr (new pcl::FieldComparison<PointT>("x", pcl::ComparisonOps::LT, maxX))); 
range_cond->addComparison (pcl::FieldComparison<PointT>::Ptr (new pcl::FieldComparison<PointT>("y", pcl::ComparisonOps::GT, minY))); 
range_cond->addComparison (pcl::FieldComparison<PointT>::Ptr (new pcl::FieldComparison<PointT>("y", pcl::ComparisonOps::LT, maxY))); 
range_cond->addComparison (pcl::FieldComparison<PointT>::Ptr (new pcl::FieldComparison<PointT>("z", pcl::ComparisonOps::GT, minZ))); 
range_cond->addComparison (pcl::FieldComparison<PointT>::Ptr (new pcl::FieldComparison<PointT>("z", pcl::ComparisonOps::LT, maxZ))); 

pcl::ConditionalRemoval<PointT> range_filt; 
range_filt.setInputCloud(body); 
range_filt.setCondition (range_cond); 
range_filt.filter(*bodyFiltered); 
+0

私はそれをチェックしています。ヘッダー '#include 'と '#include 'をインクルードしましたが、' error:' PointT 'はこのスコープでは宣言されていませんでした。 'error:' range_cond 'はこのスコープで宣言されていませんでした。 –

+1

' Using PointT = pcl :: PointXYZRGBA; – acraig5075

+0

あなたのコードでは、定義された境界。なぜ!!!!私はボックスの外にポイントを削除し、ボックス内のポイントを保持したい。もう一度見ていただけますか? –

関連する問題