三角測量貪欲アルゴリズムは、元のポイントクラウド高速三角測量アルゴリズムの投影で、アルゴリズムは、ポイントクラウドの均一な密度を平滑な面を想定し、三角測量しながら、表面を平滑化する穴に固定することができません。
方法:
(1)三次元点は、通常通る平面上に投影します
(2)三角の平面内に点群を投影しました
(3)面内の3点の位相的接続関係に応じて三角形メッシュモデルを得ます
領域成長スペースに基づいてドロネーアルゴリズム、境界面を拡大し、初期試料面として三角形を選択することによって方法を使用して、最終的にプロセスの三角形の領域に完全な三角形メッシュの面を形成する、最後の投影点に応じて接続トポロジーを決定クラウド接続関係は、得られた表面モデルの再構成は、元の三次元点のうち得られた三角形メッシュです。
このアルゴリズムは、からのサンプリングポイントクラウドに適している点クラウド均一の連続した滑らかな表面の面密度ケース
pcl1.8.1 + vs2015
#include <iostreamの> する#include <PCL / IO / pcd_io.h> の#include <PCL / IO / ply_io.h> の#include <PCL / point_types.h> の#include <PCL / kdtree / kdtree_flann.h> する#include < PCL /特徴/ normal_3d.h> の#include <PCL / IO / obj_io.h> の#include <PCL /面/ gp3.h> の#include <PCL /可視/ pcl_visualizer.h> int型のmain(int型 ARGC、チャー ** ARGV){ PCL :: PointCloud <PCL :: PointXYZ> ::のPTR雲(新しい PCL :: PointCloud <PCL :: PointXYZ> ()); PCL :: PCLPointCloud2のcloud_blob。 もし(PCL :: IO :: loadPCDFile( "rabbit.pcd"、cloud_blob)== -1 ){ PCL_ERROR( "ファイルrabbit.pcdの\ nを読み取ることができませんでした" ); リターン(-1 ); } PCL :: fromPCLPointCloud2(cloud_blob、 * 雲)。 // 法线估计对象 PCL :: NormalEstimation <PCL :: PointXYZ、PCL ::ノーマル> N; // 存储估计的法线 PCL :: PointCloud <PCL ::ノーマル> :: Ptrが法線(新しい PCL :: PointCloud <PCL ::ノーマル> ); // 定义KD树指针 PCL ::検索:: KdTree <PCL :: PointXYZ> ::のPTRツリー(新 PCL ::検索:: KdTree <PCL :: PointXYZ> );- > setInputCloud(クラウド); n.setInputCloud(クラウド); n.setSearchMethod(木); n.setKSearch( 20である); // 推定通常の貯蔵そこ n.compute(* 法線); // 連結しXYZ及びフィールド*通常の PCL PointCloud :: <PCL PointNormal ::> :: cloud_width_normalsのPtr(新新 PCL PointCloud :: <PCL :: PointNormal> ); // リンクフィールドの PCL :: concatenateFields(クラウド*、*法線、* cloud_width_normals)。 // 検索ツリーのオブジェクトの定義 PCL :: ::検索KdTree <PCL PointNormal ::> ::樹上村のPtr(新新 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(falseに); // 検索方法及び入力点群を設定し 、gp3.setInputCloud(cloud_width_normals) gp3.setSearchMethod(樹上村を); //は、再構成を実行し、結果を三角形に格納され gp3.reconstruct(三角); // トレリス線図を保存します / / PCL :: IO :: saveOBJFile( "result.obj"、三角形); STD OUTPUT_DIR ::文字列 = "E:/C/cloud_mesh.ply" ; STD SAV ::文字列 = "で保存メッシュ:" ; SAV + = OUTPUT_DIR; PCL :: ::コンソールprint_info(sav.c_str()); STD :: COUT << STD :: ENDL; PCL :: IO :: savePLYFileBinary(output_dir.c_str()、三角); // 結果を表示しますマップ <PCL ::可視化:: PCLVisualizer>ビューア(:: shared_ptrの強化、新たな PCL ::可視化:: PCLVisualizer( "MAP3D MESH" )); //// 设置背景。 viewer-> setBackgroundColor(0、0、0 ); // 设置显示的网格 viewer-> addPolygonMesh(三角形、 "私" )。 // viewer-> initCameraParameters(); しばらく(!viewer-> wasStopped()){ ビューア - > ;スピン() } のstd :: coutの << "成功" << はstd ::てendl; リターン 0 ; }
業績
説明:
より多くのデータを処理するため、しばらくの間、患者の待機する必要がします
compareCloudで開かれ、/C/cloud_mesh.ply:Eにおける三角測量後のファイルを保存します