2010-02-05 45 views
1

我正在使用pyopencv綁定。這個python庫使用boost :: python連接到OopenCV。現在我試圖使用SURF類,但不知道如何處理我的Python代碼中的類運算符。如何在python中使用boost :: python(pyopencv)使用C++運算符

C++的類定義爲:

void SURF::operator()(const Mat& img, const Mat& mask, 
        vector<KeyPoint>& keypoints) const 
{...} 

我怎樣才能把我的論點這門課嗎?

更新: 由於interjay我可以調用的方法,但現在我得到類型錯誤。什麼是python boost :: python :: tuple?

import pyopencv as cv 
img = cv.imread('myImage.jpg') 

surf = cv.SURF(); 
key = [] 
mask = cv.Mat() 
print surf(img, mask, key, False) 

給我說:

Traceback (most recent call last): 
    File "client.py", line 18, in <module> 
     print surf(img, mask, key, False) 
     Boost.Python.ArgumentError: Python argument types in 
     SURF.__call__(SURF, Mat, Mat, list, bool) 
     did not match C++ signature: 
      __call__(cv::SURF inst, cv::Mat img, cv::Mat mask, 
        boost::python::tuple keypoints, 
        bool useProvidedKeypoints=False) 
      __call__(cv::SURF inst, cv::Mat img, cv::Mat mask) 

回答

1

你只需要調用它,彷彿它是一個函數。如果surf_instSURF類的一個實例,你會打電話:

newKeyPoints = surf_inst(img, mask, keypoints) 

的爭論keypoints有望成爲一個元組,並imgmask應該是Mat類的一個實例。 C++函數修改其參數keypoints。 Python版本反而返回修改後的關鍵點。

C++的operator()類似於Python的__call__:它使得對象可以使用與函數調用相同的語法來調用。

編輯:對於第二個問題:正如你可以看到的錯誤,keypoints應該是一個元組,並且你給它一個列表。嘗試使它成爲一個元組。

+0

感謝interjay,這工作。但現在我得到一個類型錯誤。我已經更新了我的問題。你有什麼建議嗎? – dan 2010-02-05 22:15:35

+0

@dan看我的編輯 – interjay 2010-02-05 22:23:57