2016-06-19 168 views
1

私はC++でPCLを使用しており、既にクラスタ化されたポイントクラウド(すべての個々のクラスタにあります)でPCAを実行したいと考えています。このアイデアは、固有ベクトルに沿ってサイズを測定することによって、大きすぎる/小さすぎるすべてのクラスタを排除することです。そのため、各クラスタの固有ベクトルを取得し、対応する固有ベクトル上のクラスタポイントを投影して、これらの次元に沿った点の最大距離を測定し、そこから「不良」次元/次元の比率を有するすべてのクラスタを除去する。私は実装に困難を抱えています。あなたが余裕を持って手伝ってくれるほど、幸せを助けます。これは私のデータが編成されている方法です(だけで明確にすること、これらは、cluster_indicesがすでに適切にチェックされた抽出されたスニペットがある)、そして私が始めた何:PCLの主成分分析

std::vector<pcl::PointIndices> cluster_indices; 
pcl::PCA<pcl::PointXYZ> cpca = new pcl::PCA<pcl::PointXYZ>; 
cpca.setInputCloud(input); 
Eigen::Vector3f pca_vector(3,3); 
// and now iterating with a for loop over the clusters, but having issues using setIndices already 
for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it, n++) 
{ 
    cpca.setIndices(it->indices); //not sure what to put in brackets, everything I thought of returns an error! 
    pca_vector = cpca.getEigenVectors(); 
} 
+0

このコードは現在コンパイルされていますか?たとえば、行番号2は値型ではなくポインタをとる必要があります。 – Arunmu

+0

悲しいことに、私は実際にsetIndicesメソッドブラケットに何を入れるべきかを理解できません。私はそれがポインタであることを知っていると思うし、&(it-> indices)のようなものを試しました。それはインデックス自体のアドレスを私に与えるだろうと思ったからです...特に厄介なのは、 "it" const_iteratorと私はそれに対処する方法がありません。 –

+0

コードでクラッシュする唯一の事は、IndicesPtr&が必要なのでsetIndicessです。正確にどのように正しく提供するかはわかりません。 –

答えて

0

これで一般的な問題があるようです。だから私はこの解決策を見つけました: ポインタで反復するのではなく、通常のイテレータを使用して、これらの定式化を使用します。 PointIndicesPtr pi_ptr(新しいPointIndices); pi_ptr-> indices = cluster_indices [i] .indices; //入力としてpi_ptrを使用できるようになりました

関連する問題