PCL Оценка нормалей на острых углах дает изогнутый результат - PullRequest
0 голосов
/ 11 марта 2019

Я использовал PCL для оценки нормалей в облаке точек с известной правильной точки зрения

float radius 0.1;    
pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree (new  pcl::search::KdTree<pcl::PointXYZRGB>);
tree->setInputCloud(in);
pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> n;
n.setInputCloud (in);
n.setSearchMethod (tree);
n.setRadiusSearch (radius);
n.setViewPoint(vx, vy, vz); // Known correct viewpoint
n.compute (*out);

Это работает хорошо в большинстве случаев, но когда есть острые углы (например, в форме чего-то в форме коробки), нормали на и вблизи угла становятся неправильно наклоненными к поверхности. См. Ниже, где неправильные углы нормали легко можно увидеть синим цветом (снимок из Meshlab), а облако точек без нормалей можно увидеть ниже.

Normals shown in blue enter image description here

Согласно этому руководству http://www.pointclouds.org/documentation/tutorials/normal_estimation.php область поиска важна, и ее можно уменьшить, чтобы получить все более и более точные детали. Но если его понизить и понизить, это не сильно изменится, и в конечном итоге я получу плотность ниже облака, и тогда все нормали будут указывать больше в неправильном направлении. Последнее понятно, поскольку плоскость, используемая для оценки, становится слишком малой.

Что я могу сделать, чтобы получить меньше угловых нормалей на углах, а также, надеюсь, держать их под углом на фактически изогнутых поверхностях?

Последние изогнутые нормали создают проблемы при сегментации, из-за которых верх стола и сторона не соединены и имеется большой зазор.

В конечном счете, я хочу устранить пробел в сетке, и я уверен, что в этом виноваты неправильные углы нормалей по углам.

Обновление: мне удалось добиться резонанса нормалей, удвоив плотность моего облака точек, плотность была просто низкой для нахождения плоскости даже с удвоенным радиусом для поиска.

mesh with gaps

...