2010-07-17 14 views
19

Python ve C'yi karıştırma konusunda bir OpenCV projem var. OpenCV 2.1'e geçtikten sonra, C kod çağrıları artık çalışmıyor, çünkü OpenCV artık SWIG bağlamalarını kullanmıyor .SWIG Python bağlama, OpenCV 2.1 ile çalışmayan yerel koda bağlanır.

Python itibaren

, aşağıdaki prototip ile C işlevi çağırmak için kullanıldı: Şimdi

int fast_support_transform(CvMat * I, CvMat * N,...); 

, aşağıdaki hatayı alıyorum: C kodu bir kütüphaneden olduğunu

TypeError: in method 'fast_support_transform', argument 1 of type 'CvMat *' 

oluşturulan Bana göre Python arabirimini üretmek için SWIG kullanır. Emin değilim, ama sanırım OpenCV şimdi klişeleri kullanıyor ve bu kod yerel koduma bir CvMat işaretçisi gönderemiyor.

Bu sorunun hızlı bir şekilde düzeltildiğini biliyor musunuz? Herhangi bir ipucu kabul edilir.

UPDATE10: Ziyaretçiler, bu sorunun güncel olduğunu unutmayın. OpenCV'de Python desteği artık çok olgun. CvMat şimdi varsayılan olarak bir Numpy dizisi olarak temsil ediliyor.

+0

"cvMat" öğesini "cvArr" değerine dönüştürmeyi ve sonra argüman olarak cvArr * 'ı kullanmayı deneyin. cvMat, cvArr'dan türetilmiştir. Yani, cvArr işaretçisini aldıktan sonra, onunu cvMat'a geri dönüştürebilir ve kullanabilirsin. Veya diğer seçenek OpenCV'nin son çalışma sürümüne geri dönmek olacaktır. – askmish

cevap

1

Çalışmak için bir kez çok Python-esque dili olan Cython'u kullanarak Tesseract (OCR yazılımı) paketledim. Tam bir ikili python modülüne derlenmiş bir çoğunlukla python programı yazarsınız.

#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, ...) 

: En .pyx dosyada C/C++ dosyaları alabilirsiniz/kütüphaneler vb nesneleri arama işlevlerini

http://www.cython.org/

Küçük bir Cython projeyi tanımlamak ve böyle bir şey yapabileceğini örneğini Ayrıca distutils/Cython şöyle görünür dosyasını oluşturmak gerekir:

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 web sitesi yapma için mükemmel bir öğretici vardır senin ilk Cython projesi: http://docs.cython.org/src/userguide/tutorial.html