今天开始写 计算LB算子的class 的声明,其中阅读源代码时遇到一个问题:
namespace pclbo {
/*从输入的mesh数据中计算Laplace-Beltrami算子 */
#include <vector>
#include <numeric>
#include <Eigen/Sparse>
#include <pcl/common/common_headers.h>
#include <pcl/PolygonMesh.h>
#include <pcl/conversions.h>
class MeshLBOEstimation {
public:
/*空的构造函数*/
MeshLBOEstimation () : input_mesh_(), area(new std::vector<double>()) {}
/*空的析构函数*/
virtual ~MeshLBOEstimation () {}
inline void
setInputMesh (const pcl::PolygonMeshConstPtr &input)
{ input_mesh_ = input; }
/*计算LB算子*/
void compute ();
/** \brief Surface area */
double surface_area;
/** \brief Average edge length. */
double avg_edge_length;
/** \brief Input polygonal mesh. */
pcl::PolygonMeshConstPtr input_mesh_;
/** \brief Laplace-Beltrami Operator */
Eigen::SparseMatrix<double> L;
/** \brief Mass matrix. */
Eigen::SparseMatrix<double> M;
/** \brief faces area. */
std::shared_ptr<std::vector<double> > area;
}; // class MeshLBOEstimation
} // namespace pclbo
遇到的问题:
-
MeshLBOEstimation () : input_mesh_(), area(new std::vector()) {}构造函数冒号后部分的意思:
此处冒号后面其实是调用某个成员的构造函数以完成初始化,还可以是对父类的初始化,这里应该是属于初始化成员input_mesh和area -
关于pcl::PolygonMeshConstPtr,写在pcl/PolygonMesh.h:
主要参考该博客pcl::PolygonMesh简析
PolygonMesh这个类用于描述三角网格,其数据构成主要有三维点的坐标、构成三角面的点的索引以及法向量等。下面是类PolygonMesh的声明。
#include <string>
5 #include <vector>
6 #include <ostream>
7
8 // Include the correct Header path here
9 #include <pcl/PCLHeader.h>
10 #include <pcl/PCLPointCloud2.h>
11 #include <pcl/Vertices.h>
12
13 namespace pcl
14 {
15 struct PolygonMesh
16 {
17 PolygonMesh () : header (), cloud (), polygons ()
18 {}
19
20 ::pcl::PCLHeader header;
21
22 ::pcl::PCLPointCloud2 cloud;
23
24 std::vector< ::pcl::Vertices> polygons;
25
26
27 public:
28 typedef boost::shared_ptr< ::pcl::PolygonMesh> Ptr;
29 typedef boost::shared_ptr< ::pcl::PolygonMesh const> ConstPtr;
30 }; // struct PolygonMesh
31
32 typedef boost::shared_ptr< ::pcl::PolygonMesh> PolygonMeshPtr;
33 typedef boost::shared_ptr< ::pcl::PolygonMesh const> PolygonMeshConstPtr;
34
35 inline std::ostream& operator<<(std::ostream& s, const ::pcl::PolygonMesh &v)
36 {
37 s << "header: " << std::endl;
38 s << v.header;
39 s << "cloud: " << std::endl;
40 s << v.cloud;
41 s << "polygons[]" << std::endl;
42 for (size_t i = 0; i < v.polygons.size (); ++i)
43 {
44 s << " polygons[" << i << "]: " << std::endl;
45 s << v.polygons[i];
46 }
47 return (s);
48 }
49
50 } // namespace pcl
在namespace pcl 中有
typedef boost::shared_ptr< ::pcl::PolygonMesh> PolygonMeshPtr;
PolygonMeshPtr是一个智能指针boost::shared_ptr,学习了这篇博客Boost智能指针——boost::shared_ptr(使用及原理分析),大概是一个用于共享指针的class,使用起来是
boost::shared_ptr<指针类型名> 指针名
在PolygonMesh中不单保存点的xyz信息,还保存点的颜色和法线向量,关于mesh的读取方法博客中也有介绍,pcl是利用VTK的IO接口,可以直接读取stl,ply,obj等格式的三维点云数据。(我也不知道是否是只有这种方式)
- Eigen::SparseMatrix是一个用于描述稀疏矩阵的class,见稀疏矩阵快速参考指南。
遇到的问题:
对于如何输入mesh我还是比较模糊,仍没解决,而且是否有必要计算法向量,面积等我还是不确定,等最后读完源码改进代码时再来解决。(2020/3/9)