2010-07-17 4 views
19

J'ai un projet OpenCV mélangeant Python et C. Après le passage à OpenCV 2.1, mes appels au code C ne fonctionnent plus, probablement parce qu'OpenCV n'utilise plus les liaisons SWIG .SWIG Liaisons Python vers le code natif ne fonctionnant pas avec OpenCV 2.1

De Python, je l'habitude d'appeler une fonction C avec le prototype suivant:

int fast_support_transform(CvMat * I, CvMat * N,...); 

Maintenant, je reçois l'erreur suivante:

TypeError: in method 'fast_support_transform', argument 1 of type 'CvMat *' 

Le code C est d'une bibliothèque créée par moi qui utilise SWIG pour produire l'interface Python. Je ne suis pas sûr, mais je pense qu'OpenCV utilise maintenant des ctypes et que ce code est incapable d'envoyer un pointeur CvMat à mon code natif.

Connaissez-vous une solution rapide à ce problème? Tous les conseils sont les bienvenus.

MISE À JOUR: Visiteurs, notez que cette question est dépassée. Le support Python dans OpenCV est très mature maintenant. CvMat est représenté en tant que tableau Numpy par défaut maintenant.

+0

Essayez de convertir 'cvMat's en' cvArr's, puis en utilisant cvArr * comme arguments? cvMat est dérivé de cvArr. Ainsi, une fois le pointeur cvArr obtenu, vous pouvez le convertir en cvMat et l'utiliser. Ou l'autre option sera de revenir à la dernière version de travail d'OpenCV. – askmish

Répondre

1

Pour le travail, j'ai une fois enveloppé Tesseract (logiciel OCR) en utilisant Cython qui est un langage très Python-esque. Vous écrivez un programme majoritairement python qui est compilé dans un module python binaire complet. Dans votre fichier .pyx vous pouvez importer C/C++ fichiers/bibliothèques instancier objets, fonctions d'appel, etc.

http://www.cython.org/

Vous pouvez définir un petit projet Cython et faire quelque chose comme:

#make sure Cython knows about a CvMat 
cdef extern from "opencv2/modules/core/include/opencv2/types_c.h": 
    ctypedef struct CvMat 

#import your fast_support_transform 
cdef extern from "my_fast_support_transform_file.h": 
    int fast_support_transform(CvMat * I, CvMat * N, ...) 

#this bit is the glue code between Python and C 
def my_fast_support_transform(CvMat * I, CvMat * N, ...) 
    return fast_support_transform(CvMat * I, CvMat * N, ...) 

vous aurez également besoin d'une construction distutils/Cython fichier qui ressemble à ceci:

from distutils.core import setup 
from distutils.extension import Extension 
from Cython.Distutils import build_ext 

setup(
    cmdclass = {'build_ext': build_ext}, 
    ext_modules = [Extension("wrapped_support_transform", ["wrapped_support_transform.pyx"])] 
) 

Le site Cython a un excellent tutoriel pour faire votre Premier projet Cython: http://docs.cython.org/src/userguide/tutorial.html