最近在学习PCL,照着官网的教程在我的win7+VS2010平台上装好PCL1.3.0后,依旧按部就班地跑起了官网上给的例子程序。关于PCL简短的介绍请参照这篇博文:http://qing.weibo.com/1455173150/56bc2e1e330005pk.html
(1)整理一下安装OpenNI过程中碰到的问题。
用傻瓜式安装包PCL-1.3.0-AllInOne-msvc2010-win32.exe安装完PCL后,系统会自动的安装完OpenNI和PrimeSense\SensorKinect编译好后的动静态库,如此在将Kinect连接到自己的电脑上之后,只需在"计算机管理器"中将Kinect的默认驱动程序路径改为……PrimeSense\SensorKinect\Driver及其子目录,就基本完事了。
当然,在学习使用Kinect时,基本还需要安装一个PrimeSense\NITE的软件,这在OpenNI的官网上也可以下载的到,是用于骨骼、手势、音频识别的中间件。(目前看来,它是最后一个安装的,对于潜心用PCL的高手来说,可能用处并不是很大吧。不过建议不打算使用Microsoft SDK刚接触的OpenNI,PCL的盆友还是装上它,好处嘛——用过后才晓得。)
一个大家都容易碰到的问题——安装完上述系列软件后,跑OpenNI\Samples\Bin\Release下面的例子时,有些显示正常有些则不尽人意。例如运行NiUserTracker.exe时能正常出现类深度图的窗口,而运行NiViewer.exe时,就只出现白屏,看不到东西。这说明软件安装是没有问题的,而与大家机型的配置有关。这个问题在cnKinect论坛里已有人解决,请参照:http://www.cnkinect.com/forum.php?mod=viewthread&tid=3706&extra=&highlight=NiView&page=2
例如我的机器显示适配器型号是Intel(R)G41 Express Chipset,默认情况下,自动用的是Microsoft Corporation - WDDM 1.1的驱动程序。Intel官网上面有自动检测Intel型号用户终端机的硬件配置是否有更新驱动程序的小软件,很好用,我只需要在扫描完我的机子之后,将显示适配器对应的最新驱动下载来安装到本地机上即可。再运行NiViewer.exe,就可以正常出现彩图与对应的深度灰色图了。
(2)在VS2010中,跑PCL.org上面的例子时,要注意有些API对应读取存储操作时,需要的PCD文件的版本不同。
例如,我以前在用pcd_read.cpp读取# .PCD v.5 - Point Cloud Data file format时便不成功,但换成# .PCD v.7 版本后,代码就不会出错。官网上已经做了相关的说明:http://pointclouds.org/documentation/tutorials/pcd_file_format.php#pcd-file-format。
(3)在运行range_image_visualization.cpp时,碰到一个很无语的问题。再把新建的项目工程性文件的属性中把所有能加的include,bin,lib文件路径以及输入依赖库都加进去了以后,debug仍然出错:
显然,这说明ptrdiff_t不在该工程所在的std命名空间中,但一件令人困惑的是,下面我单独新建的一个测试用的小工程文件中std::ptrdiff_t却不会出错。
我找到对应引用的第三方库D:\PCL 1.3.0\3rdParty\Eigen\include\Eigen里面的core文件,问题出现在这一行语句:
using std::ptrdiff_t;
可在它的头文件里面也如下做了添加:
#include <cstddef> #include <cstdlib>
无奈,我尝试了一个最笨的方法,即在core路径下面把所以能找到的std::ptrdiff_t全部改成prediff_t,可新的问题又来了:
这一次,直接跳到boost文件里面出错。(不得不感叹,高手就是高手)谢谢子锐的帮助,原因出在我系统中Microsoft Visual Studio 10.0\VC\include路径下的cstddef文件中有ptrdiff_t的定义,而在\PCL 1.3.0\3rdParty\Boost\include\boost路径下的cstddef文件中却找不到ptrdiff_t,于是,在我debug时,当然会对std::ptrdiff_t报错。怎么屏蔽掉boost而引用原本的VC版本标准库命名空间呢。强大的google又派上用场了,在一个国外论坛的帖子中,我们找到了解决方法:
http://boost.2283326.n4.nabble.com/Config-Digital-Mars-and-BOOST-NO-STDC-NAMESPACE-td2609450.html
贴主碰到和我相同的问题,仿照他的解决方案,我们把下面这句添加到源cpp文件的首行,编译通过!!!
#define BOOST_NO_STDC_NAMESPACE