【问题标题】:How to use C++ operators within python using boost::python (pyopencv)如何使用 boost::python (pyopencv) 在 python 中使用 C++ 运算符
【发布时间】:2010-02-05 19:41:23
【问题描述】:

我正在使用 pyopencv 绑定。这个 python 库使用 boost::python 连接到 OopenCV。现在我正在尝试使用 SURF 类,但不知道如何在我的 python 代码中处理类运算符。

C++类定义为:

void SURF::operator()(const Mat& img, const Mat& mask,
                  vector<KeyPoint>& keypoints) const
{...}

如何将我的论点传递给该类?

更新: 感谢 interjay,我可以调用该方法,但现在我收到类型错误。 python boost::python::tuple 是什么?

import pyopencv as cv
img = cv.imread('myImage.jpg')

surf = cv.SURF();
key = []
mask = cv.Mat()
print surf(img, mask, key, False)

告诉我:

Traceback (most recent call last):
   File "client.py", line 18, in <module>
       print surf(img, mask, key, False)
       Boost.Python.ArgumentError: Python argument types in
       SURF.__call__(SURF, Mat, Mat, list, bool)
       did not match C++ signature:
            __call__(cv::SURF inst, cv::Mat img, cv::Mat mask,
                     boost::python::tuple keypoints,
                     bool useProvidedKeypoints=False)
            __call__(cv::SURF inst, cv::Mat img, cv::Mat mask)

【问题讨论】:

    标签: c++ python operators operator-overloading boost-python


    【解决方案1】:

    你只是把它当作一个函数来调用。如果surf_instSURF 类的一个实例,您可以调用:

    newKeyPoints = surf_inst(img, mask, keypoints)
    

    参数keypoints 应该是一个元组,imgmask 应该是Mat 类的一个实例。 C++ 函数修改其keypoints 参数。 Python 版本改为返回修改后的关键点。

    C++ 的 operator() 类似于 Python 的 __call__:它使用与函数调用相同的语法使对象可调用。

    编辑:对于您的第二个问题:正如您在错误中看到的那样,keypoints 应该是一个元组,并且您给了它一个列表。尝试将其改为元组。

    【讨论】:

    • 感谢 interjay,这行得通。但是现在我遇到了类型错误。我已经更新了我的问题。你对此有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2021-09-30
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    相关资源
    最近更新 更多