如何在Python中使用C++运算符,借助boost::python (pyopencv)

1 投票
1 回答
960 浏览
提问于 2025-04-15 18:56

我正在使用pyopencv这个库。这个Python库是通过boost::python来连接OpenCV的。现在我想使用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)

1 个回答

1

你只需要像调用函数一样去调用它。如果 surf_instSURF 类的一个实例,你可以这样调用:

newKeyPoints = surf_inst(img, mask, keypoints)

这里的参数 keypoints 需要是一个元组,而 imgmask 则应该是 Mat 类的实例。C++ 的这个函数会直接修改它的 keypoints 参数。而在 Python 中,它会返回修改后的关键点。

C++ 的 operator() 和 Python 的 __call__ 是类似的:它让一个对象可以像函数一样被调用,语法上看起来和函数调用是一样的。

补充:关于你的第二个问题:从错误信息中可以看到,keypoints 应该是一个元组,但你给的是一个列表。试着把它改成元组吧。

撰写回答