首先,我不是一个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中访问该图像,我该如何完成?
答案 0 :(得分:0)
修改和工作版本,将数据公开为python列表。
我不确定如何实现它,但如果你可以自由选择你的python接口,可能有更好的实现方法。我认为创建列表可能是一种更好的方式来公开它。您对返回值有何期待?也许你还可以将它包装成一个numpy数组以获得更好的性能(如果你搜索boost python和numphy,还有一些关于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)
;
}
另一个提示,在您的问题中,您使用以下行调用方法:
mymodule.MyClass.getImg()
这将对您的对象进行类调用(或多或少等同于静态调用)。这是一种错误的方法:
img = mymodule.MyClass()
data = img.getImg()