2016-11-14 62 views
1

我想要做一些Python包装来使用自定义C++的东西。我们使用的主要类型是2D灰度图像类型,数据分配在一维缓冲区中。我试图把它包起来这样(下面的例子in an ubuntu forum):试图传递一个自定义的C++矩阵到一个numpy数组

PyObject* to_python_object(const custom2DImage& img) { 
    int type_num = (int)NPY_UBYTE; 
    long int dims[2] = {img.nr(), img.nc()}; 

    uchar** tmp_img = new uchar*[img.nr()]; 
    tmp_img[0] = new uchar[img.nr() * img.nc()]; 
    for (int i = 1; i < img.nr(); ++i) 
    tmp_img[i] = tmp_img[0] + img.nc(); 
    for (int i = 0; i < img.nc(); ++i) 
    memcpy(tmp_mat[i], &img(i, 0), img.nc() * sizeof(uchar)); 
    PyObject* py_img = PyArray_SimpleNewFromData(2, dims, type_num, tmp_img[0]); 

    Py_INCREF(py_img); 
    delete[] tmp_img[0]; 
    delete[] tmp_img; 

    PyObject *repr = PyObject_Repr(py_img); 
    const char *s = PyString_AsString(repr); 
    cout << s << endl; 
    Py_XDECREF(repr); 

    return py_img; 
} 

从C++函数就可以了,但只要我尝试打印它在我的蟒蛇为主,它出现段错误(尽管我的Python对象表示形状很好)。 Python代码如下:

img = cst.read_image(filename); 
if img is None: 
    print("Can not load image from", filename) 
    sys.exit(-1) 
print(img) 

您知道为什么我有这个问题吗?

回答

1

好吧,所以我认为PyArray_SimpleNewFromData功能是复制数据,但它似乎没有。我的错误是释放tmp_img二维阵列。

相关问题