2017-02-28 56 views
0

我正在使用Cython創建C++包裝到python代碼。 的CDEF功能如下傳遞cython參數作爲參考與未知類型

import cv2 

cdef public void Load_Cascades(object& face_cascade, object& eye_cascade): 
    face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') 
    eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') 
    print("Cascades loaded!!") 

的參數的類型是未知的,所以我已經使用object&是將它們通過作爲參考變量。調用函數如下

cdef public void Run(): 
    face_cascade = None; 
    eye_cascade = None; 
    Load_Cascades(face_cascade, eye_cascade) 

有了這樣的代碼,cython編譯器會出錯,引用變量不能更改。

我還通過地址

Load_Cascades(&face_cascade, &eye_cascade) 

這並不工作,以及調用的函數,你可以請讓我知道我可以通過參考實現未知類型變量的傳遞用Cython

+1

你不知道。 'object'基本上是說「把它當作Python」,而Python不能像那樣工作。你返回你想改變的變量。 – DavidW

+0

[this](https://groups.google.com/forum/#!topic/cython-users/nXsytgkTbGg)可能有幫助 – Matthias

回答

1

由於object使參數成爲默認的Python參數,因此將Python的可變性考慮在內。因此,我將所有參數合併爲list,默認情況下它是可變的,它工作正常!

因此,代碼是現在

import cv2 
cdef public void Load_Cascades(cascade): 
    cascade.append(cv2.CascadeClassifier('haarcascade_frontalface_default.xml')) 
    cascade.append(cv2.CascadeClassifier('haarcascade_eye.xml')) 
    print("Cascades loaded!!") 

當調用該函數,我只是傳遞一個空的列表

cdef public void Run(): 
    cascade = [] 
    Load_Cascades(cascade) 

謝謝大衛輸入