2010-02-05 3 views
1

J'utilise les liaisons pyopencv. Cette librairie python utilise boost :: python pour se connecter à OopenCV. Maintenant, j'essaie d'utiliser la classe SURF mais je ne sais pas comment gérer l'opérateur de classe dans mon code python.Comment utiliser les opérateurs C++ dans python en utilisant boost :: python (pyopencv)

La classe C++ est définie comme:

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

Comment puis-je passer mes arguments à cette classe?

Mise à jour: Merci à interjay je peux appeler la méthode, mais maintenant je reçois des erreurs de type. Quel serait le 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) 

me APPORTE:

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) 

Répondre

1

Vous appelez juste comme si elle était une fonction. Si surf_inst est une instance de la classe SURF, vous appelez:

newKeyPoints = surf_inst(img, mask, keypoints) 

L'argument keypoints devrait être un tuple et img et mask devrait être une instance de la classe Mat. La fonction C++ modifie son paramètre keypoints. La version Python renvoie à la place les keypoints modifiés. Le operator() de C++ est analogue à __call__ de Python: Il rend un objet appelable en utilisant la même syntaxe qu'un appel de fonction.

Editer: Pour votre deuxième question: Comme vous pouvez le voir dans l'erreur, keypoints est censé être un tuple et vous lui avez donné une liste. Essayez de faire un tuple à la place.

+0

Merci interjay, cela fonctionne. Mais maintenant je reçois une erreur de type. J'ai mis à jour ma question. Avez-vous des conseils à ce sujet? – dan

+0

@dan voir ma modification – interjay