Триангуляции жадного алгоритм является проекция алгоритма быстрой триангуляции оригинального облака точек, алгоритм предполагает, гладкую поверхность, равномерную плотность облака точек, и сглаживание поверхности не может быть установлен в отверстиях в то время триангуляции.
Методы:
(1) Трехмерная точка проецируется на плоскость, проходящей через нормальный
(2), полученный путем проецирования облака точек в плоскости триангуляции
(3) получение треугольной сетки модели в соответствии с топологическими соединительными отношениями трех точек на плоскости
Использует Делон алгоритма, основанный на области растущего пространства, метод, выбрав треугольник в качестве исходной поверхности образца, расширение граничной поверхности, и, наконец, образует полную треугольную плоскость сетки в треугольной области процесса, в соответствии с последней точкой проекции подключение отношение облака определения топологии соединения, в результате реконструкции модели поверхности является треугольник сетки, полученная из исходных трехмерных точек.
Этот алгоритм является подходящим для точки отбора проб облака от поверхности непрерывной гладкой поверхности и плотности в точке облака однородного случая
pcl1.8.1 + vs2015
#include <iostream> #include <ПКЛ / IO / pcd_io.h> #include <ПКЛ / IO / ply_io.h> #include <ПКЛ / point_types.h> #include <ПКЛ / kdtree / kdtree_flann.h> #include < ПКЛ / особенности / normal_3d.h> #include <ПКЛ / И.О. / obj_io.h> #include <ПКЛ / поверхность / gp3.h> #include <ПКЛ / визуализация / pcl_visualizer.h> INT основной ( INT ARGC, символ ** ARGV) { ПКЛ :: PointCloud <ПКЛ :: PointXYZ> :: Ptr облако ( новый ПКЛ :: PointCloud <ПКЛ :: PointXYZ> ()); ПКЛ :: PCLPointCloud2 cloud_blob; если (ПКЛ :: IO :: loadPCDFile ( "rabbit.pcd", cloud_blob) == -1 ) { PCL_ERROR ( "Не удалось прочитать файл rabbit.pcd \ п" ); Возвращение (-1 ); } ПКЛ :: fromPCLPointCloud2 (cloud_blob, * облако); // 法线估计对象 ПКЛ :: NormalEstimation <ПКЛ :: PointXYZ, ПКЛ :: Normal> п; // 存储估计的法线 ПКЛ :: PointCloud <ПКЛ :: Normal> :: Ptr нормалей ( новый ПКЛ :: PointCloud <ПКЛ :: Normal> ); // 定义кД树指针 ПКЛ :: поиск :: KdTree <ПКЛ :: PointXYZ> :: Ptr дерево ( новый ПКЛ :: поиск :: KdTree <ПКЛ :: PointXYZ> );-> setInputCloud (Облако); n.setInputCloud (Облако); n.setSearchMethod (дерево); n.setKSearch ( 20 ); // оценок нормальное хранение в ней n.compute (* нормали); // сцепить XYZ , и поля * Нормальный PCL PointCloud :: <PCL PointNormal ::> :: cloud_width_normals ВТР ( новый новый PCL PointCloud :: <PCL :: PointNormal> ); // поле ссылка PCL :: concatenateFields (Cloud *, *, * нормалей cloud_width_normals); // определение дерева поиска объекта PCL :: :: Поиск KdTree <PCL PointNormal ::> :: Дерево2 ВТР ( новый новый PCL :: :: Поиск KdTree <PCL :: PointNormal> ); //Строительство точка поиска облака дерева tree2-> setInputCloud (cloud_width_normals); // определение треугольных объектов PCL GreedyProjectionTriangulation :: <PCL :: PointNormal> GP3; // сетевая модель сохраняет конечную триангуляцию PCL :: PolygonMesh, треугольники; // установить соединение максимальное расстояние между точками, (то есть, максимальная длина стороны треугольной) gp3.setSearchRadius (200.0f ); // установить различные значения параметров gp3.setMu (2.5f ); gp3.setMaximumNearestNeighbors ( 100 ); gp3.setMaximumSurfaceAngle (M_PI_4 ); gp3.setMinimumAngle (M_PI / 18 ); gp3.setMaximumAngle ( 2 * M_PI / 3. ); gp3.setNormalConsistency ( ложь); // Установить метод поиска и облако точек входа gp3.setInputCloud (cloud_width_normals); gp3.setSearchMethod (Дерево2); // выполнить реконструкцию, результат сохраняются в треугольниках gp3.reconstruct (треугольники); // сохранение диаграммы решетчатой / / PCL :: IO :: saveOBJFile ( "result.obj", треугольники); STD :: output_dir Строка = "E: /C/cloud_mesh.ply" ; STD :: САВ Строка = "сетки сохраняются в:" ; САВ + = output_dir; PCL :: :: print_info консоли (sav.c_str ()); STD :: COUT << STD :: епсИ; PCL :: IO :: savePLYFileBinary (output_dir.c_str (), треугольники); // отображение результатов карта повышение :: shared_ptr <ПКЛ :: Визуализация :: PCLVisualizer> Зритель ( новый ПКЛ :: Визуализация :: PCLVisualizer ( "Map3D MESH" )); //// 设置背景; viewer-> setBackgroundColor (0, 0, 0 ); // 设置显示的网格 viewer-> addPolygonMesh (треугольники, "мой" ); // viewer-> initCameraParameters (); в то время как (viewer->! {wasStopped ()) зритель -> спина (); } Станд :: соиЬ << "Успех" << станд :: епсИ; вернуться 0 ; }
Операционные результаты
Описание:
Больше данных, подлежащих обработке, и поэтому они должны быть ждать пациента на некоторое время
Сохраните файл после триангуляции в E: /C/cloud_mesh.ply, который был открыт с compareCloud