5

C++ プロジェクトで cv::setMouseCallback を使用しようとしています。私はそれを理解していません。このクラスにフレームを取得し、このフレームで cv::setMouseCallback を実行する方法を教えてください。これは、私がやろうとしていることの例です。

 class Stuff{
 public: 
Stuff();
void setFrame(cv::Mat); 
void mouse (int,int, int, int,void*);
  private :
cv::Mat frame;
int key;
 };

 Stuff::Stuff(){}

 void Stuff::setFrame(cv::Mat framex){
frame = framex;
 }


  int main (){
Stuff  obj;

cv::Mat frame = cv::imread ("examople.jpg");
char* name;
cv::imshow(name,frame);
cv::setMouseCallback(name,obj.mouse,&frame) // I' stop here because that's exactlly what just don't work 
    }

これは次のエラーメッセージです。

   Stuff::mouse : function call missing argument list; use '&Stuff::mouse ' to create a pointer to member 

実際のプログラムは大きすぎてここにコードを入れることができないため、質問を単純化しようとしています

4

2 に答える 2

3

クラス内でマウス ハンドラーを static として宣言する必要があります。たとえば、呼び出されたいdraggermemberを持つ があります。受け取った void* をキャストしてメンバーを呼び出すmouserヘルパーを宣言します。static void mouser

class dragger {

void mouser(int event, int x, int y) {
  current_img = original_img.clone();
  Point P(x, y);
  ...
}
static void mouser(int event, int x, int y, int, void* this_) {
  static_cast<dragger*>(this_)->mouser(event, x, y);
}

draggerこの方法でコンストラクターのインスタンス

dragger(string w, Mat m) :
    window_id(w), status(0), original_img(m), /*black(0, 0, 0),*/ K(5, 5)
{
   ...
   setMouseCallback(w, mouser, this);
}

...
}
于 2013-01-11T16:01:12.463 に答える
1

まず、main関数内に名前付きウィンドウを作成する必要があります。namedWindow( "image", 0 );または同様の何かが仕事をします。

マウス コールバック関数はframe変数に関連付けられていませんが、ウィンドウに関連付けられています。あなたの場合は次のようになります。

char* name = "image";
cv::namedWindow( name, 0 );
cv::setMousCallback(name, obj.mouse,&frame);

コールバックは、ウィンドウでイベントが発生したときに他の関数を呼び出す関数です。マウスの場合、イベントはマウスの移動、左クリック、右クリック、または中クリックです。ここでは、それらのリストと適切な説明を見つけることができます。

したがって、この「イベント」がウィンドウで発生すると、 opencv は、setMouseCallbackあなたの場合、引数として指定された名前の関数を呼び出しますStuff::mouse。次のように関数を定義すると:

Stuff::mouse( int event, int x, int y, int flags, void* params )

イベント変数が呼び出されると、トリガーの値、画像上のマウスから離れた位置の x と y などが入力されます。マウス関数でフレームを渡したい場合は、この質問のように使用します、patxiskaの回答の修正を検討する場合。

したがって、スイッチを使用すると、それがどのようなイベントであったかを確認できます。

switch( event ){
    case CV_EVENT_LBUTTONDOWN:
        //...
        break;

    case CV_EVENT_RBUTTONDOWN:
        //...
        break;

    case CV_EVENT_FLAG_CTRLKEY:
        //...
        break;
}

フレームを型キャストしてからvoid*a に戻しcv::Matます。

ここでは、マウス コールバックの使用方法に関する Opencv のサイトの別の例を見つけることができます。

しばらくの間 opencv を使用しておらず、サンプル ソース ファイルもありません。コールバックは Opencv GUI で単純化されていますが、それはどの GUI でも動作するロジックです。マウスやキーボードのトリガー イベントなどの入力と、コールバック関数がイベントを実装の関数に渡します。

于 2013-01-11T15:22:28.647 に答える