Как использовать операторы C ++ в Python, используя boost :: python (pyopencv) - PullRequest
1 голос
/ 05 февраля 2010

Я использую привязки 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)

1 Ответ

1 голос
/ 05 февраля 2010

Вы просто называете это, как будто это была функция. Если surf_inst является экземпляром класса SURF, вы бы позвонили:

newKeyPoints = surf_inst(img, mask, keypoints)

Предполагается, что аргумент keypoints будет кортежем, а img и mask должны быть экземпляром класса Mat. Функция C ++ изменяет свой параметр keypoints. Вместо этого версия Python возвращает измененные ключевые точки.

C ++ operator() аналогичен Python __call__: он позволяет вызывать объект с использованием того же синтаксиса, что и при вызове функции.

Редактировать: Ваш второй вопрос: как вы можете видеть из ошибки, keypoints должен быть кортежем, и вы дали ему список. Попробуйте вместо этого сделать его кортежем.

...