3d模型如何生成点云数据?

—————————— 2016.08.11 补充 ————————————

有朋友说obj格式用pcl_mesh2pcd是可以均匀采样的。

我用mesh2pcd一直core dumped,所以没运行成功过,因此补充。

—————————— 2016.07.20 更新 ————————————

请善用搜索引擎,多读源代码么么哒。

啃论文时发现了另一种方法,首先生成Depth map,然后再生成点云,这种方法的好处在于可以设定viewpoint。

(Depth map生成很多库都可以实现,也有源代码;Depth 转点云,参考PCL库里的png2pcd,以及

c++ – Converting depth map, stored in a Mat to a point cloud using pcl

图片来自 Sliding Shapes for 3D Object Detection in Depth Images(ECCV2014)

—————————— 正文 ————————————

这问题问得好笼统……我按照我的理解来回答好了。

(我知乎的第一个专业类回答(°////°))

首先,最简单的情况:你的3D模型是*.ply或者*.obj格式的。那么你可以直接调用PCL库里的tool,例如:pcl_ply2pcd, pcl_obj2pcd,(划掉pcl_mesh2pcd). 它的原理就是提取模型mesh的顶点(Vertex)坐标/法向量坐标。

至于*.pcd文件转成点云,很简单,PCL的tutorials里有代码。

其次,如果你的3D模型是其它复杂的格式,比如COLLADA(*.dae),那就稍微麻烦一些。可以调用Assimp库,它是一个3D模型读取库,支持读取十几种3D文件: Collada(*.dae;*.xml ) Blender (*.blend) Biovision BVH (*.bvh) 3D Studio Max 3DS (*.3ds) 3D Studio Max ASE (*.ase) AutoCAD DXF ( *.dxf )等。

然后提取你需要的数据,有用数据一般都是3D模型的meshes的顶点坐标和法向量,可以很简单就转成*.ply或者*.pcd文件。

最后一个问题是:以上提到的都是提取3D模型的meshes的顶点(Vertex)坐标,对于点云来说点数不够,而且在3D模型存在平面或者是简单立方体的情况下几乎没有点。

所以又需要PCL库了,pcl_mesh_sampling可以轻松解决这个问题。它是通过调用VTK(Visualization ToolKit)读取模型,在3D模型平面均匀地采样点然后生成点云,并且你可以选择需要的点数, 以及voxel grid的采样距离。

以上都是通过使用各种库,我处理点云也都是用大神的轮子进行各种拼接,更高端的办法恕实力不够暂时想不到。

例图如下:

我是一只*.obj格式的愚蠢的模型猪

我是一只经过pcl_obj2pcd转换后的愚蠢的点云猪

我是一只经过pcl_mesh_sampling转换后的愚蠢且黄的点云猪

(点云颜色为随机)

—————————— 2016.08.11 补充 ————————————

后天实习答辩不想学习,我来补充一下Assimp的用法吧:

下图为Assimp库所用的数据结构,任何可以用它导入的3D模型在用它之后都以这样的结构保存的。

话不多说甩个教学链接:

Learn OpenGL, extensive tutorial resource for learning Modern OpenGL

网站里面有例子代码,看看代码,再读读assimp的说明(

http://www.assimp.org/lib_html/data.html

),整合一下就可以自己写代码转格式了。

    THE END
    喜欢就支持一下吧
    点赞15 分享
    评论 抢沙发
    头像
    欢迎您留下宝贵的见解!
    提交
    头像

    昵称

    取消
    昵称表情代码图片

      暂无评论内容