SWIG Python绑定原生代码与OpenCV 2.1不兼容

19 投票
1 回答
744 浏览
提问于 2025-04-16 01:26

我有一个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指针传递给我的本地代码。

你知道有什么快速解决这个问题的方法吗?任何建议都很欢迎。

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

1 个回答

1

我曾经在工作中用Cython这个很像Python的语言封装了Tesseract(一个OCR软件)。你可以写一个主要是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

撰写回答