SWIG Python 绑定到本地代码不适用于 OpenCV 2.1

Posted

技术标签:

【中文标题】SWIG Python 绑定到本地代码不适用于 OpenCV 2.1【英文标题】:SWIG Python bindings to native code not working with OpenCV 2.1 【发布时间】:2011-03-17 08:48:15 【问题描述】:

我有一个混合了 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 数组。

【问题讨论】:

尝试将cvMats 转换为cvArrs,然后使用 cvArr * 作为参数? cvMat 源自 cvArr。所以,一旦你得到 cvArr 指针,你可以十次将它转换回 cvMat 并使用它。或者另一种选择是回到 OpenCV 的最后一个工作版本。 【参考方案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

【讨论】:

以上是关于SWIG Python 绑定到本地代码不适用于 OpenCV 2.1的主要内容,如果未能解决你的问题,请参考以下文章

SWIG 多参数类型映射适用于函数,但如果有多个构造函数,则不适用于构造函数

Swig csclassmodifiers 不适用于 C 函数的 Module 类

带有回调的 SWIG C++ 绑定

为啥 Perl 对跨平台打包结构的访问不适用于 SWIG?

我们可以使用 SWIG 为 Qt 应用程序制作 python 绑定吗?

SWIG 添加行以删除不存在的变量