2011-06-27 37 views
3

我的類名是HandMotionRecognition,我在鼠標回調中調用getColorPixel方法。這是使用Visual Studio 2010的OpenCV,項目類型是C++ - > cli。OpenCV 2.1中的cvSetMouseCallback託管C++(CLI/C++)

標準代碼(除非我錯了)來處理鼠標事件是

cvSetMouseCallback("CameraIn", getColorPixel, (void*) frameHSV); 

但是,當我編譯它給一個編譯時錯誤

error C3867: 'HandMotionRecognition::getColorPixel': function call missing argument list; use '&HandMotionRecognition::getColorPixel' to create a pointer to member

那麼我是因爲我告訴和把這樣的代碼...

cvSetMouseCallback("CameraIn", &HandMotionRecognition::getColorPixel, (void*) frameHSV); 

但我又得到一個編譯錯誤..

error C3374: can't take address of 'HandMotionRecognition::getColorPixel' unless creating delegate instance

所以我創建一個委託這樣的... [創建delegate..I不知道這是100%正確]

  1. 我把delegate void MouseCallbackDelegate(int event, int x, int y, int flags, void *param);在HandMotionRecognition.h

  2. 我把這個代碼HandMotionRecognition.cpp代替cvSetMouseCallback("CameraIn", &HandMotionRecognition::getColorPixel, (void*) frameHSV);

    MouseCallbackDelegate ^StaticDelInst = gcnew MouseCallbackDelegate(this, &HandMotionRecognition::getColorPixel); 
    

    cvSetMouseCal的lback(「CameraIn」,StaticDelInst,(void *)frameHSV);

但後來它提供了編譯錯誤:(這是唯一的錯誤,我得到)

error C2664: 'cvSetMouseCallback' : cannot convert parameter 2 from 'HandMotionRecognition::MouseCallbackDelegate ^' to 'CvMouseCallback'

(至於我可以see..this是由於使用CLI而不是win32)中

有沒有解決這個問題或者我在這裏做錯了什麼?

請幫助...

+0

這是一個非常完整的錯誤消息。 :-)不幸的是,CV似乎需要一個函數指針(native)作爲參數。該功能永遠不會是成員功能,託管或本地。 –

+0

Thankx的信息... 我不知道它不適用於成員函數...應該再次查看opencv ... 它現在是固定的.. 從類中刪除了「getColorPixel()」,並將其添加到同一個文件中(僅在類的外部)。它現在可以工作 – Sachira

回答

4

回調方法必須是靜態的(或者非成員函數),因爲你已經發現了。在這種情況下,標準習慣用法是傳遞參數void* param中的類實例指針,並使用static函數調用成員函數。由於您目前使用param來存儲frameHSV,因此您需要以其他方式進行轉移(例如,將其存儲在您的班級實例中)。

例子:

class HandMotionRecognition { 
/* your code */ 
private: 
    void getPixelColor(int event, int x, int y, int flags, void* param) { 
    } 
public: 
    static void mouseCallback(int event, int x, int y, int flags, void* param) { 
    static_cast<HandMotionRecognition*>(param)->getPixelColor(event, x, y, flags);  
    } 
} 

並註冊:

HandMotionRecognition* hmr = /* ... */ 
hmr->setFrameHSV(frameHSV); 
cvSetMouseCallback("CameraIn", &HandMotionRecognition::mouseCallback, hmr); 
+1

@Sachira以防萬一它不夠明顯,但它必須是** static * *和** public **。 – karlphillip