2016-12-09 7 views
1

私は未構成サーフェスの法線推定が所定のポイントクラウドに基づいて決定論的であるべきかどうかを判断しようとしています。 http://pointclouds.org/documentation/tutorials/normal_estimation.php#normal-estimationPCL Cloud Normalsシンプルなテストケースで非決定的です

しかし、均一な3x3表面直方体(すなわち合計26点)を生成し、雲全体にわたって8つの最近傍法線推定を行う場合、6つの点が存在することになります6つの立方体の表面の中心は座標軸と整列せず、むしろ混沌と見える。これは驚くべきことです。この8つの最も近い近傍のこの選択は、これらの6つの中心表面点の通常の推定値が同じ平面上の他の点にのみ基づいていることを制約しなければならないことを理解しています。コードの抜粋です:

// compute normals 
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; 
ne.setInputCloud (cloud_ptr); 
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>()); 
ne.setSearchMethod (tree); 
pcl::PointCloud<pcl::Normal>::Ptr cloud_normals (new pcl::PointCloud<pcl::Normal>); 
ne.setKSearch(8); 
ne.compute (*cloud_normals); 

for (int i =0; i<cloud_ptr->size(); i++) 
{ 
    cout << "x: " << cloud_ptr->points.at(i).x << " y: " << cloud_ptr->points.at(i).y << " z: " << cloud_ptr->points.at(i).z << endl; 
} 

for (int i =0; i<cloud_normals->size(); i++) 
{ 
    cout << "x: " << cloud_normals->points.at(i).normal_x << " y: " << cloud_normals->points.at(i).normal_y << " z: " << cloud_normals->points.at(i).normal_z << endl; 
} 

cout << cloud_ptr->size() << endl; 
cout << cloud_normals->size() << endl; 

と出力:

x: -1 y: -1 z: 1 
x: -1 y: 0 z: 1 
x: -1 y: 1 z: 1 
x: 0 y: -1 z: 1 
x: 0 y: 0 z: 1 
x: 0 y: 1 z: 1 
x: 1 y: -1 z: 1 
x: 1 y: 0 z: 1 
x: 1 y: 1 z: 1 
x: -1 y: -1 z: -1 
x: -1 y: 0 z: -1 
x: -1 y: 1 z: -1 
x: 0 y: -1 z: -1 
x: 0 y: 0 z: -1 
x: 0 y: 1 z: -1 
x: 1 y: -1 z: -1 
x: 1 y: 0 z: -1 
x: 1 y: 1 z: -1 
x: -1 y: -1 z: 0 
x: -1 y: 0 z: 0 
x: -1 y: 1 z: 0 
x: 1 y: -1 z: 0 
x: 1 y: 0 z: 0 
x: 1 y: 1 z: 0 
x: 0 y: -1 z: 0 
x: 0 y: 1 z: 0 
x: 0.642542 y: 0.417468 z: -0.642542 
x: 0.81252 y: 0.0985752 z: -0.574538 
x: 0.642542 y: -0.417468 z: -0.642542 
x: -0.0985752 y: 0.574539 z: -0.81252 
x: -0.196116 y: 0 z: -0.980581 
x: -0.0985752 y: -0.574539 z: -0.81252 
x: -0.642542 y: 0.642542 z: -0.417468 
x: -0.81252 y: -0.0985752 z: -0.574538 
x: -0.642542 y: -0.642542 z: -0.417468 
x: 0.642542 y: 0.642542 z: 0.417468 
x: 0.81252 y: 0.0985752 z: 0.574538 
x: 0.642542 y: -0.642542 z: 0.417468 
x: -0.0985752 y: 0.81252 z: 0.574539 
x: -0.196116 y: 0 z: 0.980581 
x: -0.0985752 y: -0.81252 z: 0.574539 
x: -0.642542 y: 0.417468 z: 0.642542 
x: -0.81252 y: -0.0985752 z: 0.574538 
x: -0.642542 y: -0.417468 z: 0.642542 
x: 0.81252 y: 0.574538 z: -0.0985752 
x: 1 y: -0 z: -0 
x: 0.81252 y: -0.574538 z: 0.0985752 
x: -0.81252 y: 0.574538 z: -0.0985752 
x: -0.987623 y: 0.153347 z: -0.0329405 
x: -0.574539 y: -0.81252 z: 0.0985752 
x: 0.153347 y: 0.987623 z: -0.0329405 
x: 0.153347 y: -0.987623 z: -0.0329405 
26 
26 

私は雲のビューアで期待どおりに完璧に現れキューブ座標、とのいずれかのミスを犯していないと確信しています。

大変助かりました!

+0

最近傍点にはポイント自体が含まれていますか? k = 9に設定するとどうなりますか? – GuyRT

+0

同様の結果で、リンクに記載されている説明に基づいて、ポイント自体は数えられません。 V奇妙な。 –

+0

https://github.com/djl11/PCL_Temp_Repo/blob/master/Cube_Gen.cpp ちょうど私のgithubの一時レポにプッシュしました。ソースファイルは誰でも現象の複製に興味があればそこにあります。 –

答えて

0

これは、8つの最近傍が確定的である場合に決定的です。 テストケース(3x3立方体シェル、フェース中心点の8つの最近傍点は実際には非確定的です):つまり、最初に4点を取得します最も近い点は垂直と水平のエッジ点ですが、次の4点はあまり明確ではありません。必要な4つのコーナー頂点をつかむことも、4つの接続面の中心を取得することもできます(すべて等距離です)。

私はこれをpclでテストしましたが、それは事実です。あなたが各顔の点数を5に増やすと、実際にはあなたは完全な中心の顔の法線を持つことになります。

関連する問題