boost:python 传递指向指针的指针作为参数

4 投票
1 回答
823 浏览
提问于 2025-04-17 17:53

首先,我不是一个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

这是一个经过修订并且可以正常工作的版本,它将数据以 Python 列表的形式展示出来。

我不太确定该怎么实现这个功能,但如果你可以自由选择 Python 接口,可能会有更好的实现方式。我觉得创建一个列表可能是更好的选择。你希望返回的结果是什么样的呢?也许你还可以把它包装成一个 numpy 数组,这样性能会更好(如果你在 StackOverflow 上搜索“boost python”和“numpy”,会有一些相关的问题)。

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()

撰写回答