Windows10下配置KinectV2以支持OpenNI2和PCL

个人配置及设备

变量
系统 Windows10 64位
处理器 Intel i5-6500
设备 Kinect V2
IDE Visual Studio 2015

第一步:设备到手,装驱动装SDK

  1. Kinect适配器按说明书连接,将USB插入电脑USB3.0接口

  2. 打开设备管理器,看系统是否识别设备,不识别设备则右键更新驱动,Win10自动搜索下载对应驱动。驱动装完会提示重启,不急,先装完SDK再重启也行。

设备管理器

  1. 更新驱动同时,去官网下载Kinect SDK,Kinect for Windows SDK 2.0

  2. 安装SDK并重启。

  3. 开始菜单多了 SDK Browser 和 Kinect Studio等,进去探索一番,测试一下自带Demo。

    Kinect Studio

    记得运行Kinect Configuration Verifier验证配置,查看Kinect能否运行。

    USB Controller叹号一般没关系,是因为电脑硬件的USB控制器不是Intel或Renesas的,如果能运行则没事,不然就只能换电脑了。

    检查配置

第二步:安装libfreenet2以支持OpenNI2调用Kinect v2

点云库(PCL)是通过OpenNI技术获取深度传感器等设备的信息的,即PCL需要通过OpenNI调用Kinect。

同时,OpenNI2是不支持 Kinect v2的(v1大概也不支持),或者说Kinect没有对应OpenNI2的驱动。

于是,就需要安装开源的Kinect驱动,使OpenNI2能够支持Kinect v2。

libfreenet2就是这样的开源驱动。

项目地址:https://github.com/OpenKinect/libfreenect2

参考Git推荐步骤Windows / Visual Studio,同时参照了这篇博主的文章,Win10安装OpenNI2并通过python接口调用Kinect

虽有点小波折,但是一遍流程就走通了,在此记录一下自己的安装步骤:

预备

  1. 确认电脑已经装好Git程序和Cmake程序,以及配置好对应的环境变量,后面下载和编译用得到。
  2. 将源码下载下来,git clone 或者 下载Zip

Install UsbDk driver(安装UsbDK 驱动)

  1. (Windows 7)必须首先安装Microsoft Security Advisory 3033929,否则USB键盘和鼠标可能不能工作。

    在Win10下,我安装完后也出现了鼠标不能动的情况,只需要插拔一下鼠标即可。

  2. https://github.com/daynix/UsbDk/releases下载最新的安装包,注意是64位,并安装。

  3. 如果UsbDK不能工作的话,需要先卸载UsbDK,然后按照libusbK的步骤安装libusbK。这两个是不能共存的。
    由于我的UsbDK可以工作,UsbDK不能工作的请自觉参考 Windows/Visual Studio(Alternatively) Install libusbK driver这一小节安装libusbK,本文不展开了。

Build libusb(编译libusb)

  1. 使用Git Bash或者其他能够访问到git.exe和msbuild.exe的shell工具,如果前面安装没问题的话,Windows自带的cmd工具也是可以的。

  2. 进入到源码的depends目录,并根据自己环境选择脚本运行,我是vs2015,所以选择install_libusb_vs2015.cmd

    cd depends/

    ./install_libusb_vs2015.cmd

  3. 备注:脚本里有个步骤是git下载libusb源码的,如果嫌慢,可以自己上网下载下来,命名为libusb_src,然后修改脚本执行下面的步骤。

    install_libusb_vs2015脚本文件view raw
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    rem This can only be run in a Git Shell or similar environments
    rem with access to git.exe and msbuild.exe.

    rmdir /s /q libusb_src libusb

    git clone https://github.com/libusb/libusb.git libusb_src || exit /b

    # 如果嫌git clone慢的话,就自己根据链接把源码下下来,放到目录depends/libusb_src下
    # 然后把上面的删了,运行脚本执行后续步骤

    cd libusb_src

    set CONFIG=Release
    set YEAR=2015
    set MSBUILD="C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe"

    %MSBUILD% msvc\libusb_dll_%YEAR%.vcxproj /p:Platform=x64 /p:Configuration=%CONFIG% /target:Rebuild || exit /b

    mkdir ..\libusb\include\libusb-1.0
    copy libusb\libusb.h ..\libusb\include\libusb-1.0
    mkdir ..\libusb\MS64\dll
    copy x64\%CONFIG%\dll\*.lib ..\libusb\MS64\dll
    copy x64\%CONFIG%\dll\*.dll ..\libusb\MS64\dll
    copy x64\%CONFIG%\dll\*.pdb ..\libusb\MS64\dll

Install TurboJPEG(安装TurboJPEG)

  1. http://sourceforge.net/projects/libjpeg-turbo/files下载libjpeg-turbo。

    我的方式是下载带-vc64.exe后缀的文件,比如这个libjpeg-turbo-1.5.3-vc64.exe,运行,安装到默认的c:\libjpeg-turbo64路径下。

  2. 设置环境变量,TurboJPEG_ROOT=c:\libjpeg-turbo64

TurboJPEG环境变量示例

Install GLFW(安装GLFW)

  1. http://www.glfw.org/download.html下载GLFW,注意是64位文件,即64-bit Windows binaries
  2. 解压后的文件夹,将glfw-3.x.x.bin.WIN64重命名为glfw,复制到depends目录下,即路径为depends/glfw
  3. 设置环境变量,GLFW_ROOT=glfw所在路径

GLFW环境变量示例

Install OpenCL(安装OpenCL,可选,我没安装)

Install CUDA(安装CUDA,可选,我没安装)

Install OpenNI2(安装OpenNI2)

  1. http://structure.io/openni下载OpenNI 2.2.0.33 (x64),安装至默认路径(c:\Program Files…)

  2. 环境变量已经保存,确认一下,分别是OPENNI2_INCLUDE64OPENNI2_LIB64OPENNI2_REDIST64

  3. 备注:如果前面安装过点云库PCL的话应该已经装过OpenNI2了,但是有关PCL的安装教程都是说OpenNI2需要安装在PCL的3rdParty目录下。

    所以现在可以卸载掉之前的OpenNI2,重新安装到默认路径下(c:\Program Files…)。

    在确保环境变量无误的情况下,不影响PCL的编译运行,注意已有的PCL工程需要重新用CMake构建一下,不然找不到OpenNI的库。

OpenNI2环境变量示例

Build(编译构建)

1
2
3
mkdir build && cd build
cmake .. -G "Visual Studio 14 2015 Win64"
cmake --build . --config RelWithDebInfo --target install

运行测试程序

双击或者命令行下运行\install\bin\Protonect.exe

Protonect.exe

测试OpenNI2

  1. install\bin目录下的 freenect2-openni2.dll和别的dll文件 (libusb-1.0.dll, glfw.dll 等等) 复制到C:\Program Files\OpenNI2\Tools\OpenNI2\Drivers
  2. 运行C:\Program Files\OpenNI\Tools\NiViewer.exe进行测试。

NiViewer.exe

最后一步:善后清理

保留libfreenect2\build目录下的install文件夹,找个地方备份一下。

需要清理的有:

  • 源码libfreenect2-master可以删除
  • C盘的libjpeg-turbo64可以删除
  • 删除环境变量TurboJPEG_ROOT
  • 删除环境变量GLFW_ROOT

关于OpenNI2的不要删掉,不然从头到尾就白干了。

后记

freenect2的驱动是弄出来了,但是PCL那边还是没能找到设备,”Device not found!”。
我觉得顺序应该是第一步编译freenect2,第二步再编译PCL,同时引用第一步升级版本的OpenNI2。
由于我的Windows上的PCL是All-in-one版本,所以没有PCL编译这一步。
苦于没法使用,也尝试了一些其他方法。
比如Tsukasa Sugiura的这两篇博客:

我尝试第一种方案,方案是结合KinectSDK,在PCL程序中直接通过SDK提供的数据接口,将获取的数据直接封装转换成PCL的pointCloud格式。

能够成功运行,而且效果也还不错,就是帧率低了点。

不过这个方案跳过了传统意义上的OpenNI技术,PCL数据处理也要在程序的转换接口里去进行处理,让我这个接触才两三天的小白觉得怪别扭的。

索性跳到了Ubuntu下进行一波探索,而且编译安装都成功了,下面会另写一篇编译配置的过程。

后记2

原来将测试OpenNI2这一步骤中,将libfreenect文件拷贝到driver文件夹下,然后将整个OpenNI文件夹拷贝到PCL安装路径的3rdParty就可以使用了。

隔了一个月才知道。