8

我正在为一些 C++ 代码编写一些 SWIG/Python 绑定。这是针对所谓的 Kinect Accidental API 的,我让电机和 LED 功能正常工作。解析和填充 RGB 和深度缓冲区的 Listener 类的回调似乎没有从 SWIG 调用。数据捕获线程显然启动并开始占用 CPU,但回调中没有调试行通过。填充数据缓冲区并从 python 轻松访问它们的更好方法是什么?

class KinectListener
{
     public:
        virtual ~KinectListener(){};
        virtual void KinectDisconnected(Kinect *K) {};
        virtual void DepthReceived(Kinect *K) {};
        virtual void ColorReceived(Kinect *K) {};
        virtual void AudioReceived(Kinect *K) {};
};

这是带有虚方法的监听器类,这个类的 Python 包装版本可以用来继承 c++ 类的监听器吗?我在 C++ 中添加了一个最小的侦听器,现在剩下的工作是使用类型映射有效地访问数组。目前我正在使用这个天真的类型图

%typemap(out) unsigned short [ANY] {
  int i;
  $result = PyList_New($1_dim0);
  for (i = 0; i < $1_dim0; i++) {
    PyObject *o = PyInt_FromLong((long)$1[i]);
    PyList_SetItem($result,i,o);
  }
}

更好的选择?

4

2 回答 2

3

巧合的是,我现在正好在研究 SWIG 的回调。

SWIG 2.0 文档是这样说的:

SWIG 提供对函数指针的完全支持,前提是回调函数是用 C 语言而不是目标语言定义的。...但是,现有的 C 函数可以用作参数,前提是您将它​​们安装为常量。一种方法是像这样使用 %constant 指令...

我打算用手写的 JNI 编写一个 C 回调来调用 Java。如果有另一种方式,我也很想听听。

于 2010-11-29T21:33:46.557 回答
3

有一种使用导演功能的方法。为您的 KinectListener 代理启用它,一行代码:

%feature("director") KinectListener

然后您可以从 Python 代码中的 KinectListener 类继承并定义您的函数。

于 2010-12-29T17:10:16.223 回答