2011-07-21 52 views
8

強制的 - 我是個新手。有一份涉及編程的工作,我正在教自己。不用說作爲一名教師,我經常徹底地弄錯事情。OpenCV的2.3 VS 2008 - 鼠標事件

我在哪裏,現在我已經創建了類「圖」,它(令人驚訝的是),使圖形。但是現在我想要做到這一點,只需點擊鼠標就可以修改圖形。但我似乎無法讓鼠標處理程序成爲該類的成員函數。

cv::setMouseCallback(windowName, onMouse, 0); // Set mouse handler to be onMouse 

不工作與

cv::setMouseCallback(windowName, Graph::onMouse, 0); 

它給了我缺少參數錯誤。根據this我不能使它成爲一個成員函數。按照給出的答案,它編譯但我的this指針是空的。啊。

OnMouse看起來是這樣的:

void onMouse(int event, int x, int y,int, void*) 
{ 
    if (event == CV_EVENT_LBUTTONDOWN) 
    { 
     cvMoveWindow("Window", 500, 500); //Just to see if stuff happened 
    } 
    return; 
} 

我不關心移動窗口,我要修改圖形本身 - 這是存儲爲CV ::墊變量圖形對象。我無法弄清楚如何去做。

任何幫助,將不勝感激,我真的希望這不只是胡言亂語。用C

+0

不錯的問題!我有完全相同的問題 –

回答

11

是回調函數++是一種快樂,不是嗎?你必須給OpenCV一個函數(不是類方法),因爲你已經發現了。但是,您可以使用以下方法解決此這場可怕破解:

class MyClass 
{ 
public: 
    void realOnMouse(int event, int x, int y, int flags) 
    { 
     // Do your real processing here, "this" works fine. 
    } 
}; 

// This is a function, not a class method 
void wrappedOnMouse(int event, int x, int y, int flags, void* ptr) 
{ 
    MyClass* mcPtr = (MyClass*)ptr; 
    if(mcPtr != NULL) 
     mcPtr->realOnMouse(event, x, y, flags); 
} 

int main(int argv, char** argc) 
{ 
    // OpenCV setup stuff... 

    MyClass processor; 
    cv::setMouseCallback(windowName, wrappedOnMouse, (void*)&processor); 

    // Main program logic 

    return 0; 
} 

上setMouseCallback最後一個參數是克服一些你通常會遇到這樣的問題非常有用。

+0

太棒了!謝謝。由於我從Graph成員函數調用setMouseCallback,因此我將「處理器」更改爲「this」,效果很好。 – Russbear

+0

是否有可能將mouseCallback和調用者分開,我的意思是setMouseCallback,成爲類的一部分,而不是在主程序中?我認爲讓這個類自帶鼠標功能更方便。可能??謝謝! –

1

您也可以使用onMouse方法爲靜態方法。

class Graph 
{ 
public: 
    static void onMouse(int event, int x, int y, void* param) 
    { 
      //Your code here 
    } 

    //Everything else you may need 
} 

現在,你應該能夠調用onMouse法:

cv::setMouseCallback(windowName, onMouse, (void*) param); 

帕拉姆可以爲空或任何你想傳遞的參數的方法,但你需要做類型轉換爲所需的類型。

希望這是有益的。 再見。