mar*_*ako 1 c++ python opencv cython
我正在尝试使用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();
}
}
Run Code Online (Sandbox Code Playgroud)
Vec3d在OpenCV中定义为:
template<typename _Tp, int n> class Vec : public Matx<_Tp, n, 1> {...};
typedef Vec<double, 3> Vec3d;
Run Code Online (Sandbox Code Playgroud)
Matx定义为:
template<typename _Tp, int m, int n> class Matx {...};
Run Code Online (Sandbox Code Playgroud)
我对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()
Run Code Online (Sandbox Code Playgroud)
该包装器尚未完成,但我只想构建它并检查语法是否正确。不幸的是,当我建造它时,我并没有走得太远。
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'
Run Code Online (Sandbox Code Playgroud)
怎么了?我想在Cython中可能有多个值模板?否则我该如何在Cython中包装一个使用OpenCV中这些模板化类型的C ++类?我怀疑这段代码中可能还有其他问题,请随时指出。
我找到了解决方案!基于此线程:
不用在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)
Run Code Online (Sandbox Code Playgroud)
请注意,名称空间“ 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)
Run Code Online (Sandbox Code Playgroud)