2010-07-17 103 views
19

我有一個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

回答

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