2016-12-09 13 views
1

Я пытаюсь выяснить, должна ли детерминированная оценка неорганизованной поверхности на основе данного облака точек; Я предположил, что он должен основываться на этом объяснении: http://pointclouds.org/documentation/tutorials/normal_estimation.php#normal-estimationPCL Cloud Normals Недетерминированный в простом тестовом случае

Однако при создании однородного кубика поверхности 3x3 (т. Е. Всего 26 баллов) и выполнения обычной оценки 8 ближайших соседей по всему облаку 6 точек, которые лежат на центр 6 кубических поверхностей не совпадает с координатными осями и кажется довольно хаотичным. Это удивительно, поскольку я понял, что этот выбор «8» ближайших соседей должен ограничивать нормальные оценки для этих шести центральных точек поверхности, основываясь только на других точках на одной и той же плоской поверхности. Вот фрагмент кода :.

// 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

Подобные результаты, и довольно уверен, что он не учитывает точку, основанную на объяснении, приведенном в ссылке. Странно. –

+0

https://github.com/djl11/PCL_Temp_Repo/blob/master/Cube_Gen.cpp Просто подтолкнуло его к временному репо на моем github, исходный файл есть, если кто-то заинтересован в репликации явлений. –

ответ

0

Детерминирован, когда 8 ближайших соседей являются детерминированными ... В вашем тестовом случае (оболочка куба 3x3, 8 ближайших соседей любой центральной точки лица фактически не детерминированы), то есть: сначала она захватит 4 ближайших точек вертикальной и горизонтальной точек, но следующие 4 точки не так ясны, он может захватить 4 угловые вершины, которые вы хотите, или он может захватить центры 4 связанных граней (которые все равноудалены).

Я тестировал это в pcl, и это действительно так. Если вы увеличите количество очков на каждой грани до 5, то у вас действительно будут идеальные центральные нормали лица, которые вы после.

 Смежные вопросы

  • Нет связанных вопросов^_^