boost:python将指针作为参数传递给指针

时间:2013-03-04 17:46:02

标签: c++ python image pointers boost

首先,我不是一个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中访问该图像,我该如何完成?

1 个答案:

答案 0 :(得分: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()