Я пытаюсь выяснить, должна ли детерминированная оценка неорганизованной поверхности на основе данного облака точек; Я предположил, что он должен основываться на этом объяснении: 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
Я уверен, что я не сделал ни одной ошибки с кубом координат, которые проявляются совершенно, как ожидается, в зрителе облаке.
Любая помощь очень ценится!
Содержит ли подсчет ближайших соседей самую точку? Что произойдет, если вы установите k = 9? – GuyRT
Подобные результаты, и довольно уверен, что он не учитывает точку, основанную на объяснении, приведенном в ссылке. Странно. –
https://github.com/djl11/PCL_Temp_Repo/blob/master/Cube_Gen.cpp Просто подтолкнуло его к временному репо на моем github, исходный файл есть, если кто-то заинтересован в репликации явлений. –