PCL编译过程

PCL是一套开源的点云处理工具/类库,网上看到一些很酷的3D处理视频,比如:微软Kinect扫描建立3D模型,在PCL上可以找到现成的例子。然而官网提供的windows安装包是1.6.0版本,很多有用的APP没有编译,所以不得已只能自己动手了。还是得吐槽一下,PCL的编译过程太繁琐,文档也没有好的说明。

前期准备:

  • 源码:从http://pointclouds.org/downloads上找github的链接
  • 第三方库:PCL依赖几个第三方库,为了图简单我没有逐个编译这些第三方库,而是选择了安装all-in-one installer和QT 4.8.0,cmake-2.8.x,GTest

编译过程:

  1. 运行cmake-gui,选择好源码位置和工作目录位置,然后点击configurate,我的输出如下,可以作为参考。
  2. 点击generate,可能会提示找不到PDB文件,如果不需要调试信息的话,可以忽略这些warning。
Could NOT find PkgConfig (missing:  PKG_CONFIG_EXECUTABLE) 
Found OpenMP
Boost version: 1.49.0
Found the following Boost libraries:
  system
  filesystem
  thread
  date_time
  iostreams
  chrono
Eigen found (include: D:\Program Files\PCL 1.6.0\3rdParty\Eigen\include, version: 3.0.3)
FLANN found (include: D:/Program Files/PCL 1.6.0/3rdParty/FLANN/include, lib: optimized;D:/Program Files/PCL 1.6.0/3rdParty/FLANN/lib;debug;D:/Program Files/PCL 1.6.0/3rdParty/FLANN/lib)
Could NOT find LIBUSB_1 (missing:  LIBUSB_1_LIBRARY LIBUSB_1_INCLUDE_DIR) 
OpenNI found (include: D:\Program Files\OpenNI\Include, lib: D:\Program Files\OpenNI\Lib)
OpenNI 2 found (include: D:/Program Files/OpenNI2/Include, lib: D:/Program Files/OpenNI2/Lib/OpenNI2.lib, redist: D:\Program Files\OpenNI2\Redist\)
Could NOT find FZAPI (missing:  FZAPI_LIBS FZAPI_INCLUDE_DIR) 
Could NOT find ensenso (missing:  ENSENSO_LIBRARY ENSENSO_INCLUDE_DIR) 
Could NOT find davidSDK (missing:  DAVIDSDK_LIBRARY DAVIDSDK_INCLUDE_DIR) 
Could NOT find PXCAPI (missing:  PXCAPI_LIBS PXCAPI_INCLUDE_DIRS) 
Could NOT find ZLIB (missing:  ZLIB_LIBRARY ZLIB_INCLUDE_DIR) 
Could NOT find PNG (missing:  PNG_LIBRARY PNG_PNG_INCLUDE_DIR) 
QHULL found (include: D:/Program Files/PCL 1.6.0/3rdParty/Qhull/include, lib: optimized;D:\Program Files\PCL 1.6.0\3rdParty\Qhull\lib;debug;D:\Program Files\PCL 1.6.0\3rdParty\Qhull\lib)
Qt QTGUI library not found.
VTK_MAJOR_VERSION 5
VTK found (include: D:/Program Files/PCL 1.6.0/3rdParty/VTK/include/vtk-5.8;D:/Program Files/PCL 1.6.0/3rdParty/VTK/include/vtk-5.8, lib: D:/Program Files/PCL 1.6.0/3rdParty/VTK/lib/vtk-5.8;D:/Program Files/PCL 1.6.0/3rdParty/VTK/lib/vtk-5.8)
Could NOT find PCAP (missing:  PCAP_LIBRARIES PCAP_INCLUDE_DIRS) 
Qt QTOPENGL library not found.
Qt QTGUI library not found.
Qt QTGUI library not found.
PCL_EXAMPLES_SUBDIRS E:/phil/ws/structureio/pcl-master/examples/common/;E:/phil/ws/structureio/pcl-master/examples/features/;E:/phil/ws/structureio/pcl-master/examples/filters/;E:/phil/ws/structureio/pcl-master/examples/geometry/;E:/phil/ws/structureio/pcl-master/examples/keypoints/;E:/phil/ws/structureio/pcl-master/examples/outofcore/;E:/phil/ws/structureio/pcl-master/examples/segmentation/;E:/phil/ws/structureio/pcl-master/examples/stereo/;E:/phil/ws/structureio/pcl-master/examples/surface/
GTest found (include: D:\Program Files\PCL 1.6.0\3rdParty\gtest-1.7.0\include, src: D:/Program Files/PCL 1.6.0/3rdParty/gtest-1.7.0)
DOXYGEN_FOUND 
HTML_HELP_COMPILER 
Found CPack generators: NSIS
The following subsystems will be built:
  common
  octree
  io
  kdtree
  search
  sample_consensus
  filters
  2d
  geometry
  features
  ml
  segmentation
  visualization
  surface
  registration
  keypoints
  tracking
  recognition
  stereo
  apps
       building: 
       |_ 3d_rec_framework
       |_ in_hand_scanner
       |_ modeler
       |_ point_cloud_editor
       not building: 
       |_ cloud_composer: No reason
       |_ optronic_viewer: FZAPI was not found.
  outofcore
  examples
  people
  global_tests
  tools
The following subsystems will not be built:
  simulation: Requires external library glew.
Configuring done

几个值得注意到地方,如果Qt没有安装到默认的位置”C:\Qt\”,那么需要修改VTK目录下VTKConfigQt.cmake,VTKTargets-debug.cmake,VTKTargets-release.cmake,将Qt目录修改为你实际安装的目录即可。另外,cmake是根据qmake的信息寻找qt库路径,所以还得在qmake所在路径下新建一个qt.conf文件,增加qt的安装路径,示例如下:

[Paths]
Prefix = D:\\Qt\\4.8.0

配置的过程很繁琐,注意error提示,一个个解决。编译过程中还会遇到几个问题,凭印象列举一下吧。

  • 找不到Qt的头文件,因为Qt4和Qt5有区别,简单解决办法是在include头文件的时候加上QtGui或者QtOpenGL。如:“#include <QtOpenGL/QtOpenGL>”
  • 如果遇到链接错误很可能是没有将第三方库加到链接选项里面去,解决办法,自己修改VS工程的链接选项。

PCL官网:http://pointclouds.org/

将深度数据转换成点云(cloud point)

自从用了openni2以后,又得从造轮子开始了。openni1.x版本还有个xnConvertProjectiveToRealWorld函数可以将深度图转化成点云,openni2将这些接口都删光光了,无奈之下只好自己研究原理,然后将算法porting过来。

什么是深度图?2D图像里面,每个坐标(x,y)都有一个向量来表示该点的颜色,同理,深度图就是每个坐标(x,y)都有一个浮点数表示该点距离测量平面(比如深度摄像头镜面所在平面)的距离。

什么是点云?实际上就是三维空间里面点的集合,这些点具有相同的参照坐标系(原点)。

深度图与点云之间有什么关系?假设三维空间用xyz坐标系表示,以相机中心点为原点,那么深度值实际就是z。由于深度图中的,x,y分别表示图像的横向和纵向的点序列(而非距离),所以必须统一单位才能输出点云。

参考网友的文章:http://blog.csdn.net/opensource07/article/details/7804246,然后加上自己的理解,从深度图转化为点云,其实很简单,只需知道相机的Field of View。Structure sensor的FOV为:Horizontal: 58 degrees, Vertical: 45 degrees。原理如下图:IMG_0498

最后生成的点云:

cloudpoint

structure sensor试用(2)——Nite2

Nite是一套基于openni开发的手势识别中间件,如果使用structure sensor的话,Nite的其他版本基本不用考虑了,因为openni2跟openni1.x相比架构上做了大调整,这里我使用的是NiTE-Windows-x86-2.0.0版本。安装完毕以后,记住参考(1)介绍的,修改PS1080.ini文件。

structure sensor试用(1)

前两天structure sensor到手,简单试用了一下网站上提供的APP还有openni2,老实说目前这款sensor的支持还是非常有限。

先说说安装,sensor如果要固定到ipad上,需要通过4颗螺钉固定到支架上,然后通过支架卡在ipad上,再将数据线连接ipad和sensor就可以了。貌似ipad无法给sensor直接供电,所以数据线仅仅是将sensor的数据传送给ipad处理而已。如果购买了hacker usb cable线的话,则可以将sensor通过usb连接到PC上使用,驱动在openni2中自带了,安装完毕就可以通过open2自带的tools NiViewer查看深度视图。这里需要注意到是,structure io的官网上介绍,需要修改PS1080.ini文件,将“UsbInterface=2”修改为“UsbInterface=0”,很多人忘了把这句话前面的“;”号去掉,导致修改不生效。运行的结果如下图所示,由于没有color camera,所以只有depth camera的图像显示出来。

niviewer

Scanner,使用之前还需要下载一个标定软件标定一下,标定的过程非常简单,找一个光线充足,有足够清晰纹理的视角,左右缓慢移动就可以了。标定的作用主要是将color camera的图像与depth camera的图像进行匹配,这样才能扫描出带颜色的3D模型。标定完成以后,运行Scanner就可以开始扫描了,官网的视频里面有扫描过程的视频,这里就不累述了。从实际使用的体验来看,扫描一个人体上半身大概需要3,4分钟左右,整个轮廓还是比较平滑的,注意光线一定要充足,不然就会扫出来的3D模型就会偏黑。对于比较复杂的物体,扫描效果不好,比如一盆花什么的,花瓣位置简直无法无法忍受。

 

 

3D扫描应用

3D技术已经发展很多年了,但是一直无法大众化,最近找到一个国外的网站https://sketchfab.com。这个网站可以让用户上传自己的3D模型数据,然后用户可以从web浏览器直接访问/观看这些3D模型图像,目前已经支持30多种3D数据格式上传。网站主要用到的3D展示技术,如:webGL,HTML5。而3D模型如何得到,有的是通过3D扫描,有的是通过3D设计软件创建出来。

大概浏览了一下网站的3D模型,其中扫描生成的大部分是一些工艺品,比如:首饰,小的展示品,新产品展示。所以也不难看出,在3D扫描领域中似乎也只有这些需要产品展示的行业会经常用到。

其实3D扫描不同技术/硬件,精度和效率/效果方面有很大不同,比如:扫描汽车,用手持设备得满满扫,整个外部轮廓扫下来一天半天的很正常。再比如一些复杂的工艺品(主要指内部结构),一般的扫描仪只能扫到外部轮廓,不能调整,这种应用就用不了。而近几年比较火的Kinect,精度最多到1mm,无法满足高精度的要求。

关于Kinect(1)

准备入手一个Kinect来玩玩,先做好前期调查,本来想总结一下价格的,但是kinect太多版本了,还是自己认准哪个版本以后再搜吧。

kinect for xbox 与 kinect for windows:

好在买之前做了功课,这两个玩意还是不一样的,从网上收集到的结果如下:

  • windows版多一个NEAR MODE,识别距离0.4m~3m,正常的距离为0.8~4m这个范围,当然这不是最关键的
  • xbox版通过数据线连接PC可以顺利运行大部分Sample Code,不过官方不保证。新发布的Kinect for Windows SDK只支持windows版,xbox版只能使用原来的kinect for windows SDK(beta)来开发。
  • xbox版kinect $149, windows版kinect $249

看样子如果是用于开发的话,还是买kinect for windows比较好,不过价格要贵好多啊,而且还是一代的产品。

Xtion PRO LIVE/Xtion PRO:

Xtion Family与kinect一代像是孪生兄弟一样,样子一样,而且都是用的PrimeSense的芯片,但是Xtion专门针对PC上的体感开发,可想而知不会出现kinect哪种xbox和windows版本还会不兼容的问题。价格方面,Live版价格900~1000,Pro版800+(比Live少一个音频和一个摄像头)。

开发资源:

Kinect for Windows SDK 2.0,KinectSDK-v2.0_1409-Setup.exe,2014-10发布。

微软开发部分kinect的源代码,可以从这里访问。

openni2,可以下载到Mac OS X,Windows,Linux的SDK Binaries和Docs。如果想要下载完整代码,可以从github下载。据说目前支持ASUS Xtion, PrimeSense Carmine, Microsoft Kinect and Structure Sensor depth sensors这些外设,不过Kinect2是否支持还有待确认

openni与kinect SDK的关系,这两个开发包相互排斥,但是网上有一些方法,可以简化一些步骤,不用每次切换都卸载重装那么麻烦。

总结一下,如果想用Kinect SDK和OpenNI开发的话,最好买个Kinect for Windows 1;如果只是用OpenNI开发的话,买个Xtion PRO LIVE好了,便宜几百块。如果对OpenNI不感冒,那就买Kinect for Windows 2尝尝鲜吧。买Kinect的时候认准for Windows版,虽然xbox版也能用,但是。。。who knows.

几个三维重建应用软件

3D builder

微软推出的基于windows 8.1的应用,可以从windows store免费下载/安装,支持使用kinect扫描

Reconstructme

一家奥地利公司开发的软件,基于openni,Microsoft kinect SDK,感应器支持ASUS Xtion Family or PrimeSense Carmine Family or Microsoft Kinect family

http://www.structure.io/

其实就是PrimeSense,被苹果收购以后换了个马甲,开发了一款用于ipad的附件(相对于把kinect套在了ipad上)。

整理一下这三家之间的关系:kinect 1.0用的是PrimeSense的方案,后来PrimeSense被苹果收购,于是kinect 2.0使用了自己的方案(据说)。Reconstructme无所谓,反正是做上层应用的,只要给驱动支持就行。作为开发者我更关心买谁的sensor,用谁家的SDK。简单来说,如果买了kinect 1.0,那么openni和kinect windows sdk都可以用;如果是kinect 2.0,kinect windows sdk肯定是没有问题的,openni现在还不知道;如果买了其他PrimeSense OEM的产品,我估计用openni应该也是没有问题的。

其他几家基本都是基于openni+kinect/Xtion的方案

http://www.artec3d.com

http://www.kscan3d.com

http://www.fablitec.com

http://skanect.occipital.com