2013-09-07 3 views
1

Cython을 사용하여 일부 OpenCV 형식을 매개 변수로 사용하는 C++ 클래스를 래핑하려고합니다. 그런 다음이 래핑 된 클래스를 Python에서 사용하려고합니다. 는 C++ 클래스의 단순화 된 버전 보이는 같은 :Cython을 사용하여 OpenCV 형식을 매개 변수로 사용하는 C++ 클래스 래핑

Vec3d 같이 OpenCV의에 정의되어

#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(); 
    } 
} 

"transform.h"

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 wrapper에 대한 첫 번째 시도는 다음과 같습니다.

"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++ 클래스를 어떻게 포장 할 수 있습니까? 이 코드 조각에 다른 문제가있을 것으로 생각됩니다. 언제든지 알려주십시오.

답변

4

해결책을 찾았습니다! 이 스레드에 따라 :

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

대신 사이 썬의 템플릿을 선언 나는 따옴표 ++ C의 특정 사건을 선언하고 그와 내 사이 썬 변수 이름을 지정할 수 있습니다. 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) 
관련 문제