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

19
我有一个混合了Python和C的OpenCV项目。在升级到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数组。


尝试将 cvMat 转换为 cvArr,然后使用 cvArr * 作为参数?cvMat 派生自 cvArr。因此,一旦您获得了 cvArr 指针,就可以将其转换回 cvMat 并使用它。或者另一个选项是返回到上一个工作版本的 OpenCV。 - askmish
1个回答

1
在工作中,我曾经使用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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接