使用python函数库Pyside和Vispy实现交互式3D点云显示(一)

首先给大家推荐一下我老师大神的人工智能教学网站。教学不仅零基础,通俗易懂,而且非常风趣幽默,还时不时有内涵黄段子!点这里可以跳转到网站

           在3D点云处理方面,我接触过的,最好的免费软件是cloudcompare和meshlab。它们功能的强大令我感到震惊。因为需要给用户提供一些简单的点云处理的功能,最近本的就是需要将点云显示出来。因此我最近开始3D点云显示功能相关的学习。因为考虑到开发速度原因,选择使用开发速度快的python,我才开始学习python。

      虽然matlab在矩阵运算和绘图方面有着杰出的表现,GUI开发速度快,但是在大量的点云数据3D显示面前却乏善可陈。尤其是需要给每个点单独着色时,运行速度低的令人无法接受。我也尝试使用了matplotlib,它的功能也很强大。据说numpy,scipy和matplotlib 的组合已经是免费的matlab了。同样是cup计算,使得matplotlib在大量数据面前表现的十分逊色。在显示一万个点时还是很流畅的,但当我给每个点单独着色后,速度已经无法满足要求了。同学给我一个他使用pyopengl完成的3D点云交互式显示器,在点数量不到十万的时候也逐渐变得不流畅。在3D方面还有Vpython和VDK。因为版本不支持我安装的python3.4,所以我没有机会进行过实验。

     下面就是要介绍一个,在这里重量级的函数库了:Vispy。Vispy的logo上便写着,Interactive Scientific Visualization,已经很说明它的功能。在官网上它第一句话是:Vispy is a high-performance interactive 2D/3D data visualization library. (Vispy 是高性能可交互2D,3D可视化函数库)。接下来写道:Vispy leverages the computational power of modern Graphics Processing Units (GPUs) through the OpenGL library to display very large datasets. (Vispy通过OpenGL利用现代gpu的计算能力实现大数据量的现实)。官网写着这个函数库面向两类人:第一类,熟悉opengl,或想学习opengl,希望能尽可能简单容易的实现快速漂亮的2D,3D可交互展示的人;第二类人,完全不懂opengl,需要高级高性能制图工具的科技人员。官网有大量的例子可供学习。详细信息可查询:http://vispy.org/。 下面贴出几张Vispy官网的样例:

     声明:图像是Vispy官网http://vispy.org/样例代码的截屏,这里仅用于学习交流目,如有转载请标明源于官网代码

   源代码的产生图像都是动图,这里为了展示,有拉伸的形变。前两幅的主题是大脑,右上角的是星云,左下角两张是平面上滚动的球,右下角的是分子团。在Vispy里生成随机一千万个点和颜色,仍能够流畅的展示放大缩小平移和旋转功能,已经可以满足我暂时的需求。

   在完成交互式展示窗口模块后,我使用函数库Pyside做了GUI。Pyside是跨平台的应用程式框架Qt的Python绑定版本。因为Pyside是完全免费的,使用PyQt发布的商业产品需要付费,所以我使用了Pyside。

     以下是同一组数据,用cloudcompare和我自己的程序展示的结果:

       左图为cloudcompare,右图为我的代码实现。这里截图中数据大小为75万个点,本来想用1300万的原始数据,因为python读txt文件还是太慢,就降采样75万。明显自己的代码还是展示的不够美观。希望大家提供python高速的txt读取方法。

       虽然,Vispy是很好的API,但是想熟练的应用它提供的函数接口实现一个功能,还是需要对opengl有基础的了解。后续的文章会对相应的几何知识,我用到的vispy和pyside功能进行说明。

       因为我学习python才一个多月,学习vispy三个星期,pyside三天,在此期间遇到很多问题,但是没有看到好的关于这两个函数库的中文教程,所以想把学习到的一些东西写下来,希望能对需要的人有所帮助。并且我的代码认识还有很多的不足,希望读者能指出我的缺点,若有想法请留言,大家互相交流进步。

点这里可以跳转到人工智能网站

发表评论