增强:python传球指向指针作为参数的指针

2024-10-01 17:27:38 发布

您现在位置:Python中文网/ 问答频道 /正文

首先,我不是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;
}

以及增强:python公司名称:

^{pr2}$

当我尝试在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中的图像,我如何才能做到这一点?在


Tags: 方法图像imgsize错误myclassvariable程序员
1条回答
网友
1楼 · 发布于 2024-10-01 17:27:38

修订的工作版本,将数据公开为python列表。在

我不确定如何实现这一点,但是如果您可以自由地选择python接口,可能还有更好的实现方法。我认为创建一个列表可能是更好的公开它的方法。你对返回值有什么期望?也许你也可以把它包装成一个numpy数组以获得更好的性能(如果你搜索boostpython和numpy,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)
    ;
}

另一个提示,在您的问题中,您使用了以下行来调用该方法:

^{pr2}$

这将对对象进行类调用(或多或少相当于静态调用)。这是一种比较正确的方法:

img = mymodule.MyClass()
data = img.getImg()

相关问题 更多 >

    热门问题