PCL 简单测试用例中的云法线不确定

PCL Cloud Normals Non-Deterministic in Simple Test Case

我想弄清楚无组织的表面法线估计是否应该基于给定的点云是确定性的;我认为它应该基于这个解释:http://pointclouds.org/documentation/tutorials/normal_estimation.php#normal-estimation

然而,当生成一个均匀的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

我确定我没有在立方体坐标上犯任何错误,它在云查看器中的显示完全符合预期。

非常感谢任何帮助!

当8个最近邻是确定性的时候就是确定性的... 在您的测试用例中(一个 3x3 立方体 shell,任何人脸中心点的 8 个最近邻点实际上是不确定的)即:它首先会抓取垂直和水平边缘点的 4 个最近点,但接下来的 4 个点是不太清楚,它可以抓住你想要的4个角顶点,或者它可以抓住4个连接面的中心(它们都是等距的)。

我在pcl测试过,确实如此。如果将每个面上的点数增加到 5,那么您确实会拥有完美的中央面法线。