2013-03-04 190 views
4

首先,我不是一个Python程序员,所以请原谅我愚蠢的错误。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_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中的那张图片,我该怎么做到这一点?

回答

0

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

我不知道如何实现这一点,但如果你可以自由选择你的Python接口,可能有更好的实现方法。我认为创建一个列表可能是更好的揭示它的方法。你对退货价值有什么期望?也许你也可以把它包装ASA numpy的阵列获得更好的性能(也有在计算器的一些问题,如果你搜索升压Python和numphy)

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