2013-03-04 5 views
4

먼저 파이썬 프로그래머가 아니므로 내 어리석은 실수를 용서하십시오.부스트 : 포인터로 포인터를 매개 변수로 전달하는 파이썬

C++에서는 이미지를 동적으로 만들고 크기를 반환하는 MyClass의 공용 메서드가 있습니다.

int MyClass::getImg(uchar *uimg[]) 
{ 
    int size = variable_size; 
    *_uimg = new uchar[size]; 
    memcpy(*_uimg, imageOrigin->data(), size); 
    uimg = _uimg; 
    return size; 
} 

그리고 부스트 : 파이썬 :

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

BOOST_PYTHON_MODULE(mymodule) 
{ 
    class_<MyClass>("MyClass") 
     .def("getImg", &MyClass::getImg) 
    ; 
} 

및 파이썬에서 사용하려고 할 때

파이썬에서 나는 또한 선언하려고 시도했다

img = POINTER(c_ubyte)() 

그러나 그 중 하나도 도움이되지 않았습니다.

나는 몇 시간 동안 인터넷 검색을하고 난 좋은 해결책이 떠오르지 않았다.

파이썬에서 그 이미지에 액세스 할 필요가 있습니다. 어떻게해야합니까?

답변

0

수정 된 버전과 작동중인 버전으로 데이터를 파이썬 목록으로 표시합니다.

어떻게 구현해야할지 모르겠지만 파이썬 인터페이스를 자유롭게 선택할 수 있다면 더 좋은 방법이있을 수 있습니다. 나는 목록을 만드는 것이 그것을 폭로하는 더 좋은 방법 일 것이라고 생각한다. 반환 가치에서 당신은 무엇을 기대합니까? 아마 (당신이 부스트 파이썬과 numphy을 검색하는 경우에 유래에 대한 몇 가지 질문도 있습니다) 당신은 또한 더 나은 성능을 위해 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() 
관련 문제