在OSX上构建PyOpenNI

时间:2012-05-26 18:22:10

标签: python macos kinect openni

我正在研究一个合适的(或至少是直接的堆栈),最终通过OSX平台上的python api从kinect获取骨架信息。我发现的大部分信息都非常分散和断开。

虽然看起来非常明显的是基于Windows的堆栈在他们的kinect SDK之上是微软自己的pykinect,但我似乎无法弄清楚在OSX环境中哪些方法有效。

以下是我目前编制的信息:

  • libfreenect是低级别驱动程序的明显来源(这部分工作正常)
  • OpenNI提供框架+ NITE中间件以提供识别。 (不是python)
  • PyOpenNI - OpenNI的python绑定,支持骨架和其他高级功能。

我得出结论,这是迄今为止最推荐的堆栈。我想要实现的是简单的骨架数据,类似于windows SDK python包装器为您提供的开箱即用。最后,我将在基于PyQt的应用程序中使用它来绘制显示,然后在Maya中应用数据。

我的问题分为两部分,如果最合适,我会接受任何一个方向的答案......

为PyOpenNI构建问题

到目前为止,我无法在OSX Snow Leopard(10.6.8)或Lion(10.7.4)上成功构建PyOpenNI。两个系统都更新了xcode。我注意到源文件是硬编码的,期望python2.7,所以在雪豹上我必须确保它已经安装并且是默认版本(也试过了virtualenv)。

在Snow Leopard上,我看到cmake进程找到了不同的libs,header,bin for python,最终make产生了一个与错误的解释器碰撞的.so。

在Lion上,我也有不匹配的翻译崩溃。但是在我通过自制软件安装python2.7之后,它产生了一个新的错误:

ImportError: dlopen(./openni.so, 2): Symbol not found: _environ
  Referenced from: /usr/local/lib/libpython2.7.dylib
  Expected in: dynamic lookup

是否有任何特定的步骤在我缺少的OSX上构建它,比如环境变量以确保它指向正确的python2.7库?有没有人有这个平台的成功构建过程?

替代问题

这仍然是OSX最推荐的堆栈吗?

跟进

我已经接受了我自己的答案作为临时工作解决方案。如果有人可以提供更好的,我会很乐意接受它!

1 个答案:

答案 0 :(得分:3)

更新

在我提交的补丁(information here)之后,此过程的一部分是不必要的。从那时起,我还写了一篇关于在OSX上安装整个堆栈的更详细的博文:Getting Started With Xbox360 Kinect On OSX


在对此进行了一些攻击后,我发现了一个有效的修复方法(虽然它没有解决构建级别的问题)。 cmake存在一个问题,除了系统框架之外它没有正确检测其他python框架(导致python二进制文件和libs之间的不匹配)。

我首先通过自制软件重新安装了我的python2.7安装,添加了--framework标志

在构建模块之后,我注意到通过otool它仍然链接到我的系统python,并且Lion上的系统python是胖i386和x86_64。我还注意到链接到openni.so的libboost(通过自制软件安装的boost)也链接到系统python而不是homebrew。所以我使用以下内容重新链接它们:

install_name_tool -change \
    /System/Library/Frameworks/Python.framework/Versions/2.7/Python \
    /usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Python \
    openni.so 

install_name_tool -change \
    /System/Library/Frameworks/Python.framework/Versions/2.7/Python \
    /usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Python \
    /usr/local/Cellar/boost/1.49.0/lib/libboost_python-mt.dylib

执行此操作后,我能够导入openni而不会出现任何错误。

以下是变通方法的摘要:

  1. python2.7作为框架,x86_64(不胖)
  2. libboost链接到正确的64位python
  3. export CPPFLAGS="-arch x86_64"
  4. cmake并做出正常的步骤
  5. 将openni.so重新链接到64位python
  6. 理想情况下,有人会发布一个更好的答案,而不是显示如何在构建阶段使用环境变量修复此问题,而不必在结束时进行重新链接修复。