2

Cython を使用して、いくつかの OpenCV 型をパラメーターとして使用する C++ クラスをラップしようとしています。次に、このラップされたクラスを Python から使用するつもりです。C++ クラスの単純化されたバージョンは次のようになります。

「変換.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 で複数の値のテンプレートを使用できると思いますか? そうでなければ、これらの OpenCV のテンプレート型を使用する C++ クラスを Cython でラップするにはどうすればよいでしょうか? このコードには他にも問題があるのではないかと思います。遠慮なく指摘してください。

4

1 に答える 1

6

解決策を見つけました!このスレッドに基づいて:

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)
于 2013-09-08T23:44:26.440 に答える