2017-11-22 20 views
3

PCLを使用して点群の法線を計算しています。 Meshlabでは法線は正しいものですが、すべての法線は外側から内側に向​​いていますが、すべてを逆にしても正しいでしょう。PCLは、一部の部分で法線方向が正しくないと推定します。

しかし、私はこれを行うためにPCLを使用すると、いくつかの法線の方向は、左の図のように間違っています。

enter image description here

より多くの意味を作るために、以下PCLによって推定ノーマルで、私は正しい結果を得ることができない、meshlabとPCLを使用して再構築された面です。 enter image description here

私のコードが続くと私のサンプル.plyデータはhereあり、そして私のモデルは、ここで見つけることができ、私は半径、隣人と重心位置の数を変更しようとしているようですが、これを修正coundn't。

cout << "begin normal estimation" << endl; 
NormalEstimationOMP<PointXYZ, Normal> ne; 
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>()); 
ne.setSearchMethod(tree); 
ne.setNumberOfThreads(8); 
ne.setInputCloud(filtered); 
ne.setKSearch(15); 
ne.setRadiusSearch(5); 

Eigen::Vector4f centroid; 
compute3DCentroid(*filtered, centroid); 
ne.setViewPoint(centroid[0], centroid[1], centroid[2]); 

PointCloud<Normal>::Ptr cloud_normals (new PointCloud<Normal>()); 
ne.compute(*cloud_normals); 
cout << "normal estimation complete" << endl; 

他のパラメータを調整する必要がありますか?またはより良い方法に切り替える?ご清聴ありがとうございました!

答えて

2

あなたの視点は、オブジェクトの中央にあり、ポイントが検出された場所ではありません。すべての法線は、ポイントの後ろに固体のオブジェクトがあるというアイデアを持って、視点に向かって(または視点から離れるように)向けられています。あなたのケースではそうではありません。

ポイントが実際に検出された場所にビューポイントを設定し、そのポイントに従ってポイントポイントを設定できます。

これはオプションではない場合は、このようなことを試みることができます。

  1. (おそらく から削除通常は それが行わあなたはそれが可能とマークしたい方法であれば起動して確認するところからランダム点を選択してネイバー検索

  2. ための半径を選択クラウドまたはpointIndices)。

  3. 次に、法線が同じ場合(ドットプロダクトプラス)、 にチェックマークを付けます。そうでない場合は、それを反転してマークします。

  4. これらの点の近傍を見つけて、すべての点を繰り返します。

これはトリックを行う必要があります。あなたがそれを正しく得るように半径で遊ぶ。あなたは "指"の反対側からポイントを選択したくありません。

AFAIK PCLは、結合した「完全」スキャンの通常の方向を決定する本当に堅牢な方法を持っていません。

+0

はい、視点が問題ですが、私のクラウドに正しい視点を見つけることができません。あなたの2番目の提案は私が思うように動作するはずですが、これを行うにはあまりにも多くの作業があるので、最終的に法線を自分で計算することにしました。提案ありがとう! –

関連する問題