繁体   English   中英

使用Cython包装使用OpenCV类型作为参数的C ++类

[英]Using Cython to wrap a C++ class that uses OpenCV types as parameters

我正在尝试使用Cython包装使用某些OpenCV类型作为参数的C ++类,然后打算从Python使用此包装的类。 C ++类的简化版本如下所示:

“ transform.h”

#include "opencv2/core/core.hpp"

namespace geom
{
    class Transform
    {
    public:
        Transform(cv::Vec3d &euler, cv::Vec3d &t);
        void set_euler(cv::Vec3d &euler);
        cv::Vec3d get_euler();
    }
}

Vec3d在OpenCV中定义为:

template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};
typedef Vec<double, 3> Vec3d;

Matx定义为:

template<typename _Tp, int m, int n> class Matx {...};

我对cython包装器的第一次尝试是这样的:

“ geom_gateway.pyx”

cdef extern from "opencv2/core/core.hpp" namespace "cv":
    cdef cppclass Matx[_Tp, int m, int n]:
        Matx()
        Matx(_Tp v0, _Tp v1, _Tp v2)

cdef extern from "opencv2/core/core.hpp" namespace "cv":
    cdef cppclass Vec[_Tp, int n](Matx[_Tp, n, 1]): 
        Vec()
        Vec(_Tp v0, _Tp v1, _Tp v2)

ctypedef Vec<double, 3> Vec3d

cdef extern from "transform.h" namespace "geom":
    cdef cppclass Transform:
        Transform(cv::Vec3d &euler, cv::Vec3d &t)
        void set_euler(cv::Vec3d &euler)
        cv::Vec3d get_euler()

该包装器尚未完成,但我只想构建它并检查语法是否正确。 不幸的是,当我建造它时,我并没有走得太远。

cdef extern from "opencv2/core/core.hpp" namespace "cv":
    cdef cppclass Matx[_Tp, int m, int n]:
                                           ^
------------------------------------------------------------

../basics/geom_gateway:3:29: Expected ']', found 'm'

怎么了? 我想在Cython中可能有多个值模板? 否则我该如何在Cython中包装一个使用OpenCV中这些模板化类型的C ++类? 我怀疑这段代码中可能还有其他问题,请随时指出。

我找到了解决方案! 基于此线程:

http://grokbase.com/t/gg/cython-users/136v44ees2/wrap-c-template-function-with-multiple-template-parameter-and-typdef-for-specific-instantiations-of-the-typdef

不用在cython中声明模板,我可以在C ++中用引号声明一个特定的情况,然后用它命名我的cython变量。 对于Vec3d将是:

cdef extern from "opencv2/core/core.hpp" namespace "cv":
    cdef cppclass Vec3d "cv::Vec<double, 3>": 
        Vec3d()
        Vec3d(double v0, double v1, double v2)

请注意,名称空间“ cv”必须在引号内,否则将无法使用。 对于Matx33d

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM