贪婪三角形投影算法

在pcl-1.8测试

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/vtk_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string.h> int main(int argc, char** argv)
{
// 点云模型读入,此处读入为PCD格式点云文件.数据类型为PointXYZ.
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
if (pcl::io::loadPCDFile<pcl::PointXYZ>(argv[1], *cloud) == -1)
{
PCL_ERROR("Couldn't read file mypointcloud.pcd\n"); //若读取失败将提示
return -1;
}
std::cerr << "点云读入 完成" << std::endl;
//sensor_msgs::PointCloud2 cloud_blob;
//pcl::io::loadPCDFile ("bun0.pcd", cloud_blob);
//pcl::fromROSMsg (cloud_blob, *cloud);
//* the data should be available in cloud // Normal estimation(法向量估计) pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;//创建法向估计对象
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);//创建法向数据指针
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);//创建kdtree用于法向计算时近邻搜索
tree->setInputCloud(cloud);//为kdtree输入点云
n.setInputCloud(cloud);//为法向估计对象输入点云
n.setSearchMethod(tree);//设置法向估计时采用的搜索方式为kdtree
n.setKSearch(20);//设置法向估计时,k近邻搜索的点数
n.compute(*normals); //进行法向估计 std::cerr << "法线计算 完成" << std::endl; // 创建同时包含点和法向的数据结构的指针
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
//将已获得的点数据和法向数据拼接
pcl::concatenateFields(*cloud, *normals, *cloud_with_normals); // 创建另一个kdtree用于重建
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
//为kdtree输入点云数据,该点云数据类型为点和法向
tree2->setInputCloud(cloud_with_normals); // 创建贪婪三角形投影重建对象
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
//创建多边形网格对象,用来存储重建结果
pcl::PolygonMesh triangles; //设置参数
gp3.setSearchRadius(25); // 设置连接点之间的最大距离(最大边长)用于确定k近邻的球半径(默认为0)
gp3.setMu(2.5); // 设置最近邻距离的乘子,已得到每个点的最终搜索半径(默认为0)
gp3.setMaximumNearestNeighbors(100); //设置搜索的最近邻点的最大数量
gp3.setMaximumSurfaceAngle(M_PI / 2); // 45 degrees 最大平面角
gp3.setMinimumAngle(M_PI / 18); // 10 degrees 每个三角的最大角度
gp3.setMaximumAngle(2 * M_PI / 3); // 120 degrees
gp3.setNormalConsistency(false); //若法向量一致,设为true // 设置点云数据和搜索方式
gp3.setInputCloud(cloud_with_normals);
gp3.setSearchMethod(tree2); //开始重建
gp3.reconstruct(triangles); std::cerr << "重建 完成" << std::endl; //将重建结果保存到硬盘文件中,重建结果以VTK格式存储
pcl::io::saveVTKFile("mymesh.vtk", triangles); // Additional vertex information
std::vector<int> parts = gp3.getPartIDs();
std::vector<int> states = gp3.getPointStates();
fstream fs;
fs.open("partsID.txt", ios::out);
if (!fs)
{
return -2;
}
fs << "点云数量为:" << parts.size() << "\n";
for (int i = 0; i < parts.size(); i++)
{
if (parts[i] != 0)
{
fs << parts[i] << "\n"; //这的fs对吗?
}
} std::cerr << "开始显示 ........" << std::endl; //图形显示模块
//创建显示对象指针
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->setBackgroundColor(0, 0, 0.6); //设置窗口颜色
viewer->addPolygonMesh(triangles, "my"); //设置所要显示的网格对象
viewer->addCoordinateSystem(0.1); //设置坐标系,参数为坐标显示尺寸
viewer->initCameraParameters();
while (!viewer->wasStopped())
{
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
} // Finish
return 0;
}

pcl曲面重建模块-贪婪三角形投影算法实例的更多相关文章

  1. pcl曲面重建模块-poisson重建算法示例

    poisson曲面重建算法 pcl-1.8测试通过 #include <iostream> #include <pcl/common/common.h> #include &l ...

  2. 算法实例-C#-快速排序-QuickSort

    算法实例 ##排序算法Sort## ### 快速排序QuickSort ### bing搜索结果 http://www.bing.com/knows/search?q=%E5%BF%AB%E9%80% ...

  3. [算法]检测空间三角形相交算法(Devillers & Guigue算法)

    #pragma once //GYDevillersTriangle.h /* 快速检测空间三角形相交算法的代码实现(Devillers & Guigue算法) 博客原地址:http://bl ...

  4. 【CImg】三角形绘制算法实现

    这周的CV基础练习是简单的图形绘制:比如说矩形.三角形和圆心什么的.会发现其实矩形和圆形的实现思路都很直白,矩形只需要确认两个对角坐标就可以了,圆心只需要确认圆心和半径,接着就是简单的遍历各个像素点判 ...

  5. python 解析XML python模块xml.dom解析xml实例代码

    分享下python中使用模块xml.dom解析xml文件的实例代码,学习下python解析xml文件的方法. 原文转自:http://www.jbxue.com/article/16587.html ...

  6. Adaboost 算法实例解析

    Adaboost 算法实例解析 1 Adaboost的原理 1.1 Adaboost基本介绍 AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由 ...

  7. 【机器学习】k-近邻算法以及算法实例

    机器学习中常常要用到分类算法,在诸多的分类算法中有一种算法名为k-近邻算法,也称为kNN算法. 一.kNN算法的工作原理 二.适用情况 三.算法实例及讲解 ---1.收集数据 ---2.准备数据 -- ...

  8. 【python库模块】Python subprocess模块功能与常见用法实例详解

    前言 这篇文章主要介绍了Python subprocess模块功能与常见用法,结合实例形式详细分析了subprocess模块功能.常用函数相关使用技巧. 参考 1. Python subprocess ...

  9. javascript常用经典算法实例详解

    javascript常用经典算法实例详解 这篇文章主要介绍了javascript常用算法,结合实例形式较为详细的分析总结了JavaScript中常见的各种排序算法以及堆.栈.链表等数据结构的相关实现与 ...

随机推荐

  1. PHP流程控制之特殊结构

    在前两节介绍的循环结构中,都是通过循环语句本身提供的条件表达式来指定循环次数执行代码块直到停止循环.但如果想在循环体执行过程中中止循环,或是跳过一些循环继续执行其他代码块,我们就需要一些特殊的流程控制 ...

  2. InteliJ Shortcuts

    Open your browser with documentation for the element at the editor's caret Press Shift+F1 (View | Ex ...

  3. SOA的浅析

    曾今SOA的概念犹如今日“云计算.大数据”一样,被炒得火热,不少企业便纷纷响应,并宣称会拥抱和实施SOA.而事实上,业界出现了两种极端:一种是由于各类文章和书籍关于SOA的描述往往太过抽象,再加上各大 ...

  4. ASP对XML的增、删、改、查

    首先看一下xml文件 text.xml 'encoding使用gb2312中文,如果要用英文则用utf-8 <?xml version="1.0" encoding=&quo ...

  5. java语言中Object转为String的几种形式

    在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString(),(String)要转换的对象,St ...

  6. PHP

    * PHP语言1.基本内容 * PHP语言 - 类似于javascript语言的 * javascript是客户端(HTML)的脚本语言 * PHP是服务器端的脚本语言 * PHP文件的扩展名为&qu ...

  7. HTML标签界里不会再用到的标签属性(一)

    为了成为一名初级前端开发工程师,最近正在探寻HTML标签的众多奥秘,果不其然,让我发现了许多被“冷落”了的标签属性. 一.<!DOCTYPE> 自从HTML5流行之后,<!DOCTY ...

  8. Android Studio安装配置、环境搭建详细步骤及基本使用

    前言 Android Studio的安装配置及使用篇终于来啦~ 废话不多说,以下针对JDK正确安装(及其环境变量配置完毕,即Java开发环境下).Android Studio的安装,配置,以及创建工程 ...

  9. c++ 奇特的递归模板模式(CRTP)

    概述 使用派生类作为模板参数特化基类. 与多态的区别 多态是动态绑定(运行时绑定),CRTP是静态绑定(编译时绑定) 在实现多态时,需要重写虚函数,因而这是运行时绑定的操作. CRTP在编译期确定通过 ...

  10. Symantec Backup Exec 2010 Agent For Linux安装

    以前写过一篇文章介绍过Symantec Backup Exec 2012 Agent For Linux安装安装,今天介绍一下Symantec Backup Exec 2010 Agent For L ...