SWIG Python绑定到与OpenCV 2.1不兼容的本地代码

问题描述:

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

从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指针发送到我的本机代码。

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

UPDATE:访客,请注意这个问题是过期。 OpenCV中的Python支持现在非常成熟。现在,默认情况下,CvMat被表示为Numpy数组。

+0

尝试将'cvMat's转换为'cvArr's,然后使用cvArr *作为参数? cvMat来自cvArr。所以,一旦你得到了cvArr指针,你可以将它转换回cvMat并使用它。或者另一种选择是回到最后一个工作版本的OpenCV。 – askmish 2012-10-18 18:12:06

为了工作,我曾经用Cython包装了Tesseract(OCR软件),这是一种非常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