2013-03-04 186 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()