我有一个混合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数组。
答案 0 :(得分:1)
对于我曾经使用Cython包装Tesseract(OCR软件)的工作,这是一种非常Python的语言。你编写了一个大多数python程序,它被编译成一个完整的二进制python模块。在.pyx文件中,您可以导入C / C ++文件/库实例化对象,调用函数等。
您可以定义一个小的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