2010-07-17 10 views
19

Tengo un proyecto OpenCV mezclando Python y C. Después de cambiar a OpenCV 2.1, mis llamadas al código C ya no funcionan, probablemente porque OpenCV ya no está usando SWIG bindings .SWIG Enlaces de Python al código nativo que no funciona con OpenCV 2.1

piel de pitón, que estaba acostumbrado a llamar a una función C con el siguiente prototipo:

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

Ahora, me sale el siguiente error:

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

El código C es de una biblioteca creada por mí que usa SWIG para producir la interfaz de Python. No estoy seguro, pero creo que OpenCV está usando ctypes ahora y este código no puede enviar un puntero CvMat a mi código nativo.

¿Conoces una solución rápida a este problema? Cualquier consejo es bienvenido

ACTUALIZACIÓN: Visitantes, tenga en cuenta esta pregunta es obsoleta . El soporte de Python en OpenCV es muy maduro ahora. CvMat está siendo representado como una matriz Numpy por defecto ahora.

+0

¿Intenta convertir 'cvMat's a' cvArr's y luego usa el cvArr * como argumentos? cvMat se deriva de cvArr. Entonces, una vez que obtenga el puntero cvArr, podrá convertirlo de nuevo a cvMat y usarlo. O la otra opción será volver a la última versión de trabajo de OpenCV. – askmish

Respuesta

1

Para el trabajo Una vez envolví Tesseract (software OCR) usando Cython que es un lenguaje muy similar a Python. Usted escribe un programa en su mayoría Python que se compila en un módulo de python binario completo. En el archivo de .pyx puede importar archivos de C/C++/bibliotecas instancias de objetos, funciones de llamadas, etc.

http://www.cython.org/

Se podría definir un proyecto pequeño Cython y hacer algo como:

#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, ...) 

usted también necesitará un distutils/Cython archivo que se ve algo como esto construyen:

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"])] 
) 

La página web Cython tiene un excelente tutorial para hacer su primer proyecto de Cython: http://docs.cython.org/src/userguide/tutorial.html

Cuestiones relacionadas