SWIG Python привязки к нативному коду не работает с OpenCV 2.1 - PullRequest
19 голосов
/ 17 июля 2010

У меня есть проект 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.

1 Ответ

1 голос
/ 06 декабря 2012

Для работы я однажды обернул Tesseract (программное обеспечение OCR), используя Cython, который очень похож на Python.Вы пишете в основном программу на Python, которая компилируется в полноценный двоичный модуль Python.В своем .pyx-файле вы можете импортировать C / 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

...