1


0

boost :: python(pyopencv)を使用してPython内でC ++演算子を使用する方法
私はpyopencvバインディングを使用しています。 このPythonライブラリは、boost

pythonを使用してOopenCVに接続します。 今、私はSURFクラスを使用しようとしていますが、私のPythonコードでクラス演算子を処理する方法がわかりません。

C ++クラスは次のように定義されます。

void SURF::operator()(const Mat& img, const Mat& mask,
                  vector& 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
       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 Answer


1


関数であるかのように呼び出すだけです。 surf_inst`が SURF`クラスのインスタンスである場合、次を呼び出します。

newKeyPoints = surf_inst(img, mask, keypoints)

引数 keypoints`はタプルであることが期待され、 img`と mask`は Mat`クラスのインスタンスでなければなりません。 C ++関数はその「キーポイント」パラメーターを変更します。 代わりに、Pythonバージョンは変更されたキーポイントを返します。

C ++の `operator()`はPythonの `call`に似ています:関数呼び出しと同じ構文を使用してオブジェクトを呼び出し可能にします。

編集:2番目の質問:エラーでわかるように、 `keypoints`はタプルであると想定されており、リストを与えました。 代わりにタプルにしてみてください。