J'essaie d'intégrer certaines classes et fonctions C++ à Python en utilisant Cython. Jusqu'à présent, j'ai enveloppé 2 classes, et maintenant je veux envelopper une fonction.Retour d'un objet complexe contenant PyObject à partir de la fonction C++ Cython
La signature de la fonction est
std::map<std::string, std::vector<PyObject*>> analyze(PyObject* img, LandmarkDetector::CLNF& clnf_model, LandmarkDetector::FaceModelParameters& params);
J'ai enveloppé avec succès les cours CLNF
et FaceModelParameters
, et je ne parviens pas à envelopper cette fonction analyze
.
La fonction traite PyObject*
s car elle traite avec opencv, et j'aimerais pouvoir les passer facilement entre les langues. J'utilise these functions afin d'effectuer le casting entre cv::Point
aux objets python et entre python Mat à cv::Mat
.
Ceci est mon fichier ciboire:
from libcpp.vector cimport vector
from libcpp.map cimport map
from libcpp.string cimport string
from cpython.ref cimport PyObject
from cython.operator cimport dereference as deref
cdef extern from "LandmarkDetectorModel.h" namespace "LandmarkDetector":
cdef cppclass CLNF:
CLNF(string) except +
cdef extern from "LandmarkDetectorParameters.h" namespace "LandmarkDetector":
cdef cppclass FaceModelParameters:
FaceModelParameters(vector[string] &) except +
cdef class PyCLNF:
cdef CLNF *thisptr
def __cinit__(self, arg):
self.thisptr = new CLNF(<string> arg)
cdef class PyLandmarkDetectorParameters:
cdef FaceModelParameters *thisptr
def __cinit__(self, args):
self.thisptr = new FaceModelParameters(args)
cdef extern from "FaceLandmarkVid.h":
map[string, vector[object]] analyze(object, CLNF&, FaceModelParameters&)
cdef PyAnalyze(object img, PyCLNF clnf, PyLandmarkDetectorParameters facemodel):
return analyze(img, deref(clnf.thisptr), deref(facemodel.thisptr))
Mais en essayant de le compiler je reçois le message d'erreur
landmarks.pyx:26:23: Python object type 'Python object' cannot be used as a template argument
(qui fait référence à la ligne map[string, vector[object]] analyze [...]
)