PCL, проекционный алгоритм жадный триангуляции

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

Методы:

(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

 

  

 

рекомендация

отwww.cnblogs.com/baby123/p/10956399.html