Я использовал 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), а облако точек без нормалей можно увидеть ниже.
Согласно этому руководству http://www.pointclouds.org/documentation/tutorials/normal_estimation.php область поиска важна, и ее можно уменьшить, чтобы получить все более и более точные детали. Но если его понизить и понизить, это не сильно изменится, и в конечном итоге я получу плотность ниже облака, и тогда все нормали будут указывать больше в неправильном направлении. Последнее понятно, поскольку плоскость, используемая для оценки, становится слишком малой.
Что я могу сделать, чтобы получить меньше угловых нормалей на углах, а также, надеюсь, держать их под углом на фактически изогнутых поверхностях?
Последние изогнутые нормали создают проблемы при сегментации, из-за которых верх стола и сторона не соединены и имеется большой зазор.
В конечном счете, я хочу устранить пробел в сетке, и я уверен, что в этом виноваты неправильные углы нормалей по углам.
Обновление: мне удалось добиться резонанса нормалей, удвоив плотность моего облака точек, плотность была просто низкой для нахождения плоскости даже с удвоенным радиусом для поиска.