gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:19 24 4
gpt4 key购买 nike

我正在尝试使用 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 中可以有多个值模板吗?否则我怎么能在 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

我可以在 C++ 中用引号声明一个特定的案例,然后用它命名我的 cython 变量,而不是在 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)

关于c++ - 使用 Cython 包装使用 OpenCV 类型作为参数的 C++ 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18676860/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com