利用PCL点云库从CAD模型(stl,obj格式)采样得到点云(pcd,ply格式)有两种方式:
1. 整体点云采样,包括原来CAD模型各个面(可能会包含从外面看不到的内部结构),用的是 pcl_mesh_sampling,可以直接运行exe文件,也可以把里面的代码粘出来放到自己程序里面结合使用
exe运行方法可以参考:
http://www.pianshen.com/article/486229813/
如果想用代码见 Github:
https://github.com/PointCloudLibrary/pcl/blob/master/tools/mesh_sampling.cpp
2. 从多个视角采样,仅包括原来CAD模型某个视角下的一面,这种在做配准(registration)的时候更方便应用,因为我们使用的深度相机一般就是从一个视角拍摄,这时比较好用的是PCL自带函数:renderViewTesselatedSphere,当然也会有一些局限下面细说
实现代码可以参考:
https://blog.csdn.net/A_Jia_17/article/details/82596450
这里解释一下这个函数:(参考PCL官方文档)
void pcl::visualization::PCLVisualizer::renderViewTesselatedSphere ( int xres,
int yres,
pcl::PointCloud< pcl::PointXYZ >::CloudVectorType & cloud,
std::vector< Eigen::Matrix4f, Eigen::aligned_allocator< Eigen::Matrix4f > > & poses,
std::vector< float > & enthropies,
int tesselation_level,
float view_angle = 45,
float radius_sphere = 1,
bool use_vertices = true
)
这个函数是从不同视角得到CAD模型的部分视图。这里设定的视角是一个包在CAD模型外面的,由正三角形组成的二十面体,虚拟的相机从二十面体的每个顶点(或者每个面)拍摄CAD模型,然后得到对应视角下的点云。这个函数如果不改内部的代码,是不能指定视角的,每次运行,虚拟的相机会在每个顶点(或者面)都拍一遍,得到12个(或者20个,对应面的数量)视角下的点云,之后可以挑选自己需要的点云来进行之后的操作。
参数如下:
[in] xres 窗口x方向大小(即分辨率),分辨率越大,采样点云包含点的数目越多
[in] yres 窗口y方向大小(即分辨率),分辨率越大,采样点云包含点的数目越多
[in] cloud 有XYZ信息的点云向量代表各视角下的模型
[out] poses 从物体坐标系到各视角相机坐标系的位姿转换
[out] enthropies 在0-1之间,各视角看到模型的比率
[in] tesselation_level 对于原始二十面体三角形面的分割数,如果设为0,则是原始二十面体,设为1,每个三角形面会被分为4个三角形
[in] view_angle 相机的视场角FOV,默认为45
[in] radius_sphere 半径,默认为1
[in] use_vertices 设为TRUE,则使用顶点,得到12个视角(tesselation_level =0)或42个视角(tesselation_level =1),设为FALSE,则使用面,得到得到20个视角(tesselation_level =0)或80个视角(tesselation_level =1)
根据我尝试的,主要设置xres,yres,tesselation_level,view_angle,use_vertices 这几个参数即可,其他参数有什么trick欢迎大家补充