4

まず、私はPythonプログラマーではないので、ばかげた間違いを許してください。

C ++には、画像を動的に作成してそのサイズを返すMyClassのこのパブリックメソッドがあります。

int MyClass::getImg(uchar *uimg[])
{
    int size = variable_size;
    *_uimg = new uchar[size];
    memcpy(*_uimg, imageOrigin->data(), size);
    uimg = _uimg;
    return size;
}

そしてboost:python:

BOOST_PYTHON_MODULE(mymodule)
{
    class_<MyClass>("MyClass")
        .def("getImg", &MyClass::getImg)
    ;
}

そして私がPythonでそれを使おうとすると:

def getImg():
    img = c_char_p()
    size = mymodule.MyClass.getImg(byref(img))

このエラーが発生します:

Boost.Python.ArgumentError: Python argument types in
    MyClass.getImg(MyClass, CArgObject, CArgObject)
did not match C++ signature:
    getImg(class MyClass {lvalue}, unsigned char * *)

Pythonでは、宣言も試みました

img = POINTER(c_ubyte)()

しかし、それも役に立ちませんでした。

私はそれを何時間もグーグルで検索しましたが、良い解決策は思いつきませんでした。

Pythonでその画像にアクセスする必要がありますが、どうすればこれを実行できますか?

4

1 に答える 1

0

データを Python リストとして公開する、改訂された作業バージョン。

これを実装する方法はわかりませんが、Python インターフェイスを自由に選択できる場合は、より良い実装方法があるかもしれません。リストを作成することは、それを公開するためのより良い方法かもしれないと思います. 戻り値から何を期待しますか? たぶん、パフォーマンスを向上させるために numpy 配列としてラップすることもできます (boost python と numphy を検索すると、stackoverflow に関するいくつかの質問もあります)。

class TestPtr
{
public:
  int getImg(uchar **uimg)
  {
     int size = 9045;
     uchar *_uimg = new uchar[size];
     for( int i = 0; i < size; ++i )
       _uimg[i] = i;  

    *uimg = _uimg;
     return size;
 }
};

boost::python::list getImgList( TestPtr &p )
{
  uchar *uimg;
  int rv = p.getImg(&uimg);
  boost::python::list l;
  for ( int i = 0; i < rv; ++i)
    l.append( uimg[i] );
  return l;
}

BOOST_PYTHON_MODULE(mymodule)
{
  class_<TestPtr>("TestPtr")
    .def("getImg",&getImgList)
    ;
}

別のヒントとして、あなたの質問では、次の行を使用してメソッドを呼び出しました。

 mymodule.MyClass.getImg()

これにより、オブジェクトへのクラス呼び出し (静的呼び出しとほぼ同等) が行われます。これは、より正しい方法です。

img = mymodule.MyClass()
data = img.getImg()
于 2013-03-25T17:49:40.743 に答える