Подтвердить что ты не робот

SWIG Python привязки к собственному коду, не работающему с OpenCV 2.1

У меня есть проект OpenCV, смешивающий Python и C. После перехода на OpenCV 2.1 мои вызовы на C-код больше не работают, возможно потому, что OpenCV больше не использует привязки SWIG.

Из Python я был использован для вызова функции C со следующим прототипом:

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

Теперь я получаю следующую ошибку:

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

Код C из библиотеки, созданной мной, которая использует SWIG для создания интерфейса Python. Я не уверен, но я думаю, что OpenCV теперь использует ctypes, и этот код не может отправить указатель CvMat на мой собственный код.

Знаете ли вы о быстром решении этой проблемы? Любые советы приветствуются.

ОБНОВЛЕНИЕ. Посетители, обратите внимание, что этот вопрос устарел. Поддержка Python в OpenCV сейчас очень зрелая. CvMat теперь представляется как массив Numpy по умолчанию.

4b9b3361

Ответ 1

Для работы я однажды завернул Tesseract (программное обеспечение OCR) с помощью Cython, который является языком языка Python. Вы пишете в основном программу python, которая скомпилируется в полнофункциональный двоичный модуль python. В вашем .pyx файле вы можете импортировать файлы/библиотеки C/С++, создавать объекты, функции вызова и т.д.

http://www.cython.org/

Вы можете определить небольшой проект Cython и сделать что-то вроде:

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

Вам также понадобится файл distutils/Cython, который выглядит примерно так:

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

Сайт Cython имеет отличный учебник для создания вашего первого проекта Cython: http://docs.cython.org/src/userguide/tutorial.html