PCL Cloud Normals在简单测试用例中是非确定性的

时间:2016-12-09 16:56:03

标签: c++ pca point-cloud-library point-clouds normals

我试图找出基于给定点云的无组织表面法线估计是否应该是确定性的;我推测它应该基于这个解释: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

我确信我没有在立方体坐标上犯任何错误,这些错误在云端查看器中完美呈现。

任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:0)

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

我在pcl中对此进行了测试,确实如此。如果你将每个面上的点数增加到5,那么你确实会拥有你所追求的完美中心面法线。