Win10安装OpenNI2并通过python接口调用Kinect

一、安装Kinect官方驱动

(这一步好像和下面的步骤没什么关系,但是还是建议做一下)
1. 先不要插入Kinect到usb3.0(一定要是3.0)接口,安装Kinect SDK2.0,然后插入Kinect,按下Win+X,在设备管理器里面显示有这个代表成功:
这里写图片描述
然后打开Kinect Studio,测试一下:
Win10安装OpenNI2并通过python接口调用Kinect_第1张图片

二、安装libfreenet2(参考官方教程)

libfreenet2是kinect v2的非官方驱动,如果要使用openni2调用kinect的话,需要先安装(编译)这个,具体请看下面的步骤。

注:下面步骤中有很多安装msi文件的步骤,因为权限问题,如果遇到了代码2503的错误,请使用cmd中的 “msiexec /package PATH” 命令(PATH是msi文件路径)

  1. 从github上下载源码:https://github.com/OpenKinect/libfreenect2

  2. 安装UsbDK驱动,下载网址:https://github.com/daynix/UsbDk/releases,msi文件直接安装就好了
    (如果UsbDK不起作用的话,卸载后,请看步骤3!!!!)
    这个是Usb的驱动,和kinect官方驱动并不会冲突,但是我用这个并没有成功,所以我用的的下面这个,你们想用UsbDK可以试一试

  3. 本步骤和步骤2二选一!!!!!安装libusbK驱动
    本步骤安装的usb驱动会和kinect官方的驱动冲突,也就是说用不了kinect studio了,但是并没有什么关系,不需要卸载kinect官方驱动。
    a) 从http://zadig.akeo.ie/ 下载Zadig
    b) 直接运行Zadig,点击options,选择”List All Devices” 取消选择 “Ignore Hubs or Composite Parents”
    c) 从下拉框选择”Xbox NUI Sensor (composite parent)”(Important: Ignore the “NuiSensor Adaptor” varieties, which are the adapter, NOT the Kinect)The current driver will list usbccgp. USB ID is VID 045E, PID 02C4 or 02D8.
    d) Select libusbK (v3.0.7.0 or newer) from the replacement driver list.
    e) Click the “Replace Driver” button. Click yes on the warning about replacing a system driver. (This is because it is a composite parent.)
    如果需要卸载libusbK驱动的话,也就是退回kinect官方驱动:
    To uninstall the libusbK driver (and get back the official SDK driver, if installed):

    1. Open “Device Manager”
    2. Under “libusbK USB Devices” tree, right click the “Xbox NUI Sensor (Composite Parent)” device and select uninstall.
    3. Important: Check the “Delete the driver software for this device.” checkbox, then click OK.
      If you already had the official SDK driver installed and you want to use it:
    4. In Device Manager, in the Action menu, click “Scan for hardware changes.”
      This will enumerate the Kinect sensor again and it will pick up the K4W2 SDK driver, and you should be ready to run KinectService.exe again immediately.
  4. 编译libusb(这是个大坑!)
    官方建议下载源码自己手动编译,但是亲测官方步骤不行,在后面进行cmake和编译的时候会报错(这个错误花了我大半天时间来解决,甚至还去改了cmake文件),所以我选择了预编译好的libusb文件(下载地址:https://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.21/libusb-1.0.21.7z/download),将压缩文件解压到depends文件夹下,重命名为libusb,在libusb文件夹下面有很多编译好的版本,比如MS32、MS64,我们需要的就是MS64,其他的放着就好了,没有影响。

  5. 安装TurboJPEG
    从网址http://sourceforge.net/projects/libjpeg-turbo/files 下载压缩包,安装到c:/libjpeg-turbo64,然后设置环境变量:TurboJPEG_ROOT

  6. 安装GLFW
    从http://www.glfw.org/download.html(64bit),解压到depends/glfw (重命名glfw-3.x.x.bin.WIN64 为glfw),然后设置环境变量:GLFW_ROOT
    下面这两个步骤都是可选的(装不装没什么所谓)

  7. 安装OpenCL(可选)
  8. 安装CUDA(可选,只支持nvidia显卡)

  9. 安装OpenNI2
    下载 OpenNI 2.2.0.33 (x64) from http://structure.io/openni, 安装到默认路径 (C:\Program Files…).

  10. 编译
    进入源码根目录,打开cmd(需要安装cmake!!)
    mkdir build && cd build
    cmake .. -G “Visual Studio 14 2015 Win64”
    cmake –build . –config RelWithDebInfo –target install
    我的是VS2015,2013用(cmake .. -G “Visual Studio 12 2013 Win64”)
    重点来了:
    有个很扯淡的事情就是,我原原本本按照官方文档的步骤操作了,嗯,cmake和编译没有问题,但是。。。。运行Protonect.exe的时候会出现这个错误,啊啊啊啊啊啊!:[Error] [usb::TransferPool] failed to submit transfer: LIBUSB_ERROR_NOT_SUPPORTED Operation not supported or unimplemented on this platform
    遇到问题怎么办?当然google啊!千万不要百度!百度了你就会感觉人生失去了希望!
    然后问题的解决方案就在网址:https://github.com/OpenKinect/libfreenect2/issues/580
    其实该问题的博主也不知道哪里错了(真是日了狗了。。。),然后下载了别人预编译好的dll文件和exe文件替换了最终编译出来的文件就ok了。(我也很无奈啊)

  11. 测试
    运行程序通过命令 .\install\bin\Protonect.exe
    Win10安装OpenNI2并通过python接口调用Kinect_第2张图片

  12. 测试OpenNI2
    将 freenect2-openni2.dll, 还有其他的 dll 文件 (libusb-1.0.dll, glfw.dll, etc.) 从文件夹 install\bin 复制到文件夹 C:\Program Files\OpenNI2\Tools\OpenNI2\Drivers. 然后双击运行 C:\Program Files\OpenNI\Tools\NiViewer.exe.
    Environment variable LIBFREENECT2_PIPELINE can be set to cl, cuda, etc to specify the pipeline.
    Win10安装OpenNI2并通过python接口调用Kinect_第3张图片

三、 通过python的openni调用kinect

  1. 安装openni
    打开cmd,通过命令pip install openni安装即可(注:这里安装的openni只是一个包装器,也就是python对C版本Openni的封装,所以还是要先通过第二大步骤安装libfreenect和Openni2)
  2. 将驱动libfreenect2的dll文件放到正确的openni2路径下面
    通过查看openni源码发现,最终调用的dll位于:C:\Program Files\OpenNI2\Redist\OpenNI2.dll
    所以要将 freenect2-openni2.dll, 还有其他的 dll 文件 (libusb-1.0.dll, glfw.dll, etc.) 从文件夹 install\bin 复制到文件夹 C:\Program Files\OpenNI2\Redist\OpenNI2\Drivers.
    这样才能找到kinect这个设备,否则会报找不到设备的错误!(DeviceOpen using default: no devices found)
  3. 编写程序进行测试
from openni import openni2
import numpy as np
import cv2

openni2.initialize()     # can also accept the path of the OpenNI redistribution

dev = openni2.Device.open_any()
print(dev.get_device_info())

depth_stream = dev.create_depth_stream()
color_stream = dev.create_color_stream()
depth_stream.start()
color_stream.start()


while True:
    # 显示深度图
    frame = depth_stream.read_frame()
    dframe_data = np.array(frame.get_buffer_as_triplet()).reshape([480, 640, 2])
    dpt1 = np.asarray(dframe_data[:, :, 0], dtype='float32')
    dpt2 = np.asarray(dframe_data[:, :, 1], dtype='float32')
    dpt2 *= 255
    dpt = dpt1 + dpt2
    cv2.imshow('dpt', dpt)

    # 显示RGB图像
    cframe = color_stream.read_frame()
    cframe_data = np.array(cframe.get_buffer_as_triplet()).reshape([1080, 1920, 3])
    R = cframe_data[:, :, 0]
    G = cframe_data[:, :, 1]
    B = cframe_data[:, :, 2]
    cframe_data = np.transpose(np.array([B, G, R]), [1, 2, 0])
    # print(cframe_data.shape)
    cv2.imshow('color', cframe_data)

    # 按下q键退出循环
    key = cv2.waitKey(10)
    if int(key) == 113:
        break

# 人走带门,关闭设备
depth_stream.stop()
color_stream.stop()
dev.close()

结果,就只看深度图吧 :
Win10安装OpenNI2并通过python接口调用Kinect_第4张图片

最后这就大功告成了!开始畅快的使用kinect吧!

你可能感兴趣的:(Kinect)