2016-11-14 3 views
1

カスタムC++のものを使うようにPythonのラッピングをしようとしています。主なタイプは、データが1Dバッファに割り当てられた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オブジェクト表現はOKですが、すぐに私は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 2D配列を解放することでした。

関連する問題