4

前回の質問とつながりました。 Cython を使用して OpenCV 型をパラメーターとして使用する C++ クラスをラップする

今、私は別のエラーで立ち往生しています。OpenCV タイプ Matx33d の cython ラッピング コードは次のようになります。

cdef extern from "opencv2/core/core.hpp" namespace "cv":
    cdef cppclass Matx33d "cv::Matx<double, 3, 3>":
        Matx33d()
        Matx33d(double v0, double v1, double v2, double v3, double v4, double v5, double v6, double v7, double v8)
        double& operator()(int i, int j)

次に、Matx33d を numpy 配列にコピーする関数を定義します。

cdef Matx33d2numpy(Matx33d &m):
    cdef np.ndarray[np.double_t, ndim=2] np_m = np.empty((3,3), dtype=np.float64)  
    np_m[0,0]= m(0,0); np_m[0,1]= m(0,1); np_m[0,2]= m(0,2)
    np_m[1,0]= m(1,0); np_m[1,1]= m(1,1); np_m[1,2]= m(1,2)
    np_m[2,0]= m(2,0); np_m[2,1]= m(2,1); np_m[2,2]= m(2,2)    
    return np_m

cython ラッパーをコンパイルすると、これらのエラーが発生します

geom_gateway.cpp(2528) error C3861: '()': identifier not found

これは、上記のコードで m(0,0) にアクセスするときの Matx33d::operator() の最初の使用に対応します。生成された geom_gateway.cpp 行 2528 を見ると、次のようになります。

  *__Pyx_BufPtrStrided2d(__pyx_t_5numpy_double_t *, __pyx_pybuffernd_np_m.rcbuffer->pybuffer.buf, __pyx_t_6, __pyx_pybuffernd_np_m.diminfo[0].strides, __pyx_t_7, __pyx_pybuffernd_np_m.diminfo[1].strides) = operator()(0, 0);

この operator()(0, 0) がオブジェクトなしで行末にあるだけではわかりません!! これはどのように可能ですか?これは Cython のバグですか? または、operator() に使用している構文が間違っていますか? どんな助けでも大歓迎です!

4

1 に答える 1