Cython C ++包装器operator()重载错误

时间:2013-09-09 00:23:22

标签: c++ python opencv cython

与我之前的问题相关联。 Using Cython to wrap a C++ class that uses OpenCV types as parameters

现在我陷入了另一个错误。我的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

这对应于第一次使用Matx33d :: operator(),这是在上面的代码中访问m(0,0)时的。 如果我查看生成的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);

我不理解这个操作符()(0,0)在线的末尾没有任何对象!这怎么可能?这是一个Cython错误吗?或者我用于operator()的语法错误? 任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:7)

好的,我不知道为什么会发生错误,对我来说它看起来像语法

double& operator()(int i, int j)

应该有效,但事实并非如此。此语法适用于其他运算符,如+, - ,/,*

可行的替代语法如下:

double& get "operator()"(int i, int j)

然后在cython代码中,当我们想要使用operator()(i,j)时,我们调用get(i,j)