boost: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;
}
还有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中访问那个图像,我该怎么做呢?
1 个回答
0
这是一个经过修订并且可以正常工作的版本,它将数据以 Python 列表的形式展示出来。
我不太确定该怎么实现这个功能,但如果你可以自由选择 Python 接口,可能会有更好的实现方式。我觉得创建一个列表可能是更好的选择。你希望返回的结果是什么样的呢?也许你还可以把它包装成一个 numpy 数组,这样性能会更好(如果你在 StackOverflow 上搜索“boost python”和“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()