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_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 回答