1、PCD文件与PLY文件互相转换
这里的PCD文件与PLY文件的互相转换是简单的将点的xyz坐标以及rgb数据转换,没有涉及到网格化。如果想从PCD文件生成网格模型可以参考快速三角化:http://www.pclcn.org/study/shownews.php?lang=cn&id=111
a、PCD转PLY
//PCD转换为PLY****************************************************** #include <pcl/io/pcd_io.h> #include <pcl/io/ply_io.h> #include<pcl/PCLPointCloud2.h> #include<iostream> #include<string> using namespace pcl; using namespace pcl::io; using namespace std; int PCDtoPLYconvertor(string & input_filename ,string& output_filename) { pcl::PCLPointCloud2 cloud; if (loadPCDFile(input_filename , cloud) < 0) { cout << "Error: 无法加载PCD文件!!!"<< endl; return -1; } PLYWriter writer; writer.write(output_filename, cloud, Eigen::Vector4f::Zero(), Eigen::Quaternionf::Identity(),true,true); return 0; } int main() { string input_filename = "0.pcd"; string output_filename = "cloud_ply.ply"; PCDtoPLYconvertor(input_filename , output_filename); cout << "pcd->ply转换完毕!!!"<< endl; return 0; } b、PLY转PCD//PLY转换为PCD****************************************************** #include <pcl/io/pcd_io.h> #include <pcl/io/ply_io.h> #include <pcl/point_types.h> #include <iostream> using namespace std; using namespace pcl; using namespace io; using namespace pcl::io; bool loadCloud (const std::string &filename, pcl::PCLPointCloud2 &cloud) { pcl::PLYReader reader; if (reader.read (filename, cloud) < 0) return (false); return (true); } void saveCloud (const std::string &filename, const pcl::PCLPointCloud2 &cloud, bool format) { pcl::PCDWriter writer; writer.write (filename, cloud, Eigen::Vector4f::Zero (), Eigen::Quaternionf::Identity (), format); } int main() { pcl::PCLPointCloud2 cloud; // Load the first file if (!loadCloud ("bun_zipper.ply", cloud)) return (-1); bool format = 1; // Convert to PLY and save saveCloud ("bun_zipper.pcd", cloud, format); return (0); }
2、计算程序运行时间
PCL中计算程序运行时间的函数有很多,利用控制台计算时间的方法是: a、包含头文件 #include <pcl/console/time.h>
b、定义 pcl::console::TicToc time; //定义对象
time.tic(); //开始记录时间
/**这里可以放想要计算时间的程序段**/ c、std::cout<<time.toc()<<"ms"<<std::endl;就可以以hao秒为单位输出“程序段”的运行时间。
运行代码示例:
#include <iostream> #include <pcl/console/time.h> #include <windows.h> int main() { pcl::console::TicToc time; time.tic(); Sleep(1000); std::cout << time.toc() << "ms" << std::endl; return 0; }运行结果一般比实际程序运行时间大3 ms左右
pcl::GeneralizedIterativeClosestPoint< PointSource, PointTarget > Class Template Reference 广义迭代最近点算法
pcl::IterativeClosestPoint< PointSource, PointTarget, Scalar > Class Template Reference 点到点经典迭代最近点算法
pcl::IterativeClosestPointWithNormals< PointSource, PointTarget, Scalar > Class Template Reference 点到面迭代最近点算法
pcl::IterativeClosestPointNonLinear< PointSource, PointTarget, Scalar > Class Template Reference 非线性迭代最近点算法
pcl::JointIterativeClosestPoint< PointSource, PointTarget, Scalar > Class Template Reference 联合迭代最近点算法
pcl::registration::IncrementalICP< PointT, Scalar > Class Template Reference 增量迭代最近点算法
简介:
a、GeneralizedIterativeClosestPoint是一种ICP变体,它实现了Alex Segal等人描述的广义迭代最近点算法。在http://www.robots.ox.ac.uk/~avsegal/resources/papers/Generalized_ICP.pdf该方法是基于使用无数成本函数来优化最近的点分配之后的对齐。 原始代码使用GSL和ANN,而在我们中,我们使用特征映射的BFGS和FLANN。
b、IterativeClosestPoint基于奇异值分解(SVD)估计变换,点到点的经典ICP算法。 该算法有几个终止标准: 迭代次数已达到用户最大次数迭代次数(通过setMaximumIterations) 前一个变换和当前估计变换之间的ε(差)小于用户强制值(viasetTransformationEpsilon) 欧几里德平方误差的总和小于用户定义的阈值(通过setEuclideanFitnessEpsilon)
c、IterativeClosestPointWithNormals迭代最近点与法线是一个特殊情况,默认情况下使用基于点到平面距离估计的变换。
d、IterativeClosestPointNonLinear是使用Levenberg-Marquardt优化后端的ICP变体。所得到的变换被优化为四元数。 该算法有几个终止标准: 迭代次数已达到用户最大次数迭代次数(通过setMaximumIterations) 前一个变换与当前估计变换之间的ε(差)小于用户施加的值(通过setTransformationEpsilon) 欧几里德平方误差的总和小于用户定义的阈值(通过setEuclideanFitnessEpsilon)
e、JointIterativeClosestPoint将ICP扩展到共享相同转换的多个帧。 这在使用多次观察来解决相机外部特性时特别有用。 当给予一双云时,这就是到普通的ICP。
f、IncrementalICP增量迭代最近点类。 这个类提供了一种注册云流的方式,每个云将与之前的云对齐。