SWIG Python绑定到不使用OpenCV 2.1的本机代码

TH.*_*TH. 19 c python swig opencv ctypes

我有一个混合Python和C的OpenCV项目.在更改为OpenCV 2.1后,我对C代码的调用不再起作用,可能是因为OpenCV不再使用SWIG绑定.

从Python,我习惯用以下原型调用C函数:

int fast_support_transform(CvMat * I, CvMat * N,...);
Run Code Online (Sandbox Code Playgroud)

现在,我收到以下错误:

TypeError: in method 'fast_support_transform', argument 1 of type 'CvMat *'
Run Code Online (Sandbox Code Playgroud)

C代码来自我创建的库,它使用SWIG生成Python接口.我不确定,但我认为OpenCV现在正在使用ctypes,而且这段代码无法向我的本机代码发送CvMat指针.

你知道快速解决这个问题吗?欢迎任何提示.

更新:访客,注意这个问题已经过时了.OpenCV中的Python支持现在非常成熟.CvMat现在默认表示为Numpy数组.

Mik*_*ord 1

在工作中,我曾经使用 Cython 封装 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, ...)
Run Code Online (Sandbox Code Playgroud)

您还需要一个 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"])]
)
Run Code Online (Sandbox Code Playgroud)

Cython 网站有一个关于制作第一个 Cython 项目的优秀教程: http://docs.cython.org/src/userguide/tutorial.html