2011-07-21 13 views
8

必須 - 私は初心者です。プログラミングを含む仕事をして、私が行くように私は自分自身を教えています。言うまでもなく、教師として頻繁に、そして徹底的に事を間違っています。OpenCV 2.3 with 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; 
} 

が、私はグラフ自体変更したい - Graphオブジェクト内CV ::マット変数として格納されます。そして、私はそれを行う方法を理解することはできません。

何か助けていただければ幸いです。私は本当にこれがちょっとばかげていないことを願っています。

+0

素敵な質問!私はまったく同じ問題を抱えている。 –

答えて

11

はい、C++のコールバック関数は喜びですね。 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上の最後のパラメータは、あなたが通常のように発生した問題のいくつかを克服するために非常に便利です。ただし、以下の技術を使用して、このawfulness周りハックすることができます。

+0

恐ろしい!ありがとうございました。私はGraphメンバ関数からsetMouseCallbackを呼び出すので、私は&processorを "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); 

paramはNULLであるか、またはあなたがメソッドのパラメータとして渡したいものは何でも、しかし、あなたは確認する必要があります目的の型への型キャスト

これは役に立ちました。 さようなら。