8

私はいくつかのC++コード用にいくつかのSWIG/Pythonバインディングを書いています。これは、Kinect Accidental APIと呼ばれるもので、モーターとLEDの機能が動作しています。RGBバッファとDepthバッファを解析して設定する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 関数を引数として使用できます。これを行う 1 つの方法は、次のように %constant ディレクティブを使用することです ...

Java を呼び出すために、手書きの JNI を使用して C コールバックを作成する予定です。他に方法があれば、私も聞きたいです。

于 2010-11-29T21:33:46.557 に答える
3

ディレクター機能を利用する方法があります。KinectListener プロキシに対して有効にします。1 行のコードです。

%feature("director") KinectListener

その後、Python コードで KinectListener クラスから継承し、関数を定義できます。

于 2010-12-29T17:10:16.223 に答える