2017-10-16 10 views
0

ich zur Zeit zwei Maus-Callback-Funktionen haben beide getrennte Dinge zu tunVerwendung einzelne oder mehrere mousecallback für verschiedene Mausoperationen in einem einzigen opencv Fenstern

// Function to choose midpoint of a circle 
static void onMouse(int event, int x, int y, int, void*) 
{ 
    //Detect Mouse button event 
    if(event == EVENT_LBUTTONDOWN) 
    { 
     //store point clicked 
    } 
} 

den zweiten Rückruf zieht eine Linie von einem Punkt auf dem Fenster, während der angeklickt linke Maustaste auf den Punkt gedrückt gehalten wird, an den es veröffentlicht hat

// Draws a line from the beginning of a point to another. 
// This line is the diameter of a circle 
// The first point isn't the coordinates stored by onMouse 
static void DrawLine(int event, int x, int y, int, void*) 
     { 
      switch (event) 
      { 
      case EVENT_LBUTTONDOWN: 
       // start point 
       case EVENT_LBUTTONUP: 
       //endpoint 
       break; 
       case EVENT_MOUSEMOVE: 
        if(clicked) 
        { 
        // store point 
        } 
       break; 
       default : break; 
       } 
     } 

Wie rufe ich jede Funktion jeweils in der angegebenen Reihenfolge. dh laufen OnMouse Rückruf erste und die laufen DrawLine Callback-Funktion

Main() 
{ 
    setMouseCallback("WinName", onMouse, 0); 

    setMouseCallback("WinName", DrawLine, 0); 

// capture first frame of video 
    cap >> frame; 

// set midpoint when onMouse is called 

// set coordinates of the line when DrawLine is called 

    while (true) 
    { 
     cap >> frame; 

     // do the rest of your stuff here 
    } 

} 

Antwort

0

einfach eine einzelne Rückruffunktion verwenden onMouse:

setMouseCallback("WinName", onMouse, 0); 

Sie können dann rufen DrawLine von onMouse:

static void DrawLine(int event, int x, int y) 
{ 
    // Do something... 
} 

static void onMouse(int event, int x, int y, int, void*) 
{ 
    //Detect Mouse button event 
    if(SOME_CONDITION) 
    { 
     // Do something... 
    } 
    else 
    { 
     DrawLine(event, x, y) 
    } 
} 

Sie in der Regel verschiedene Dinge nach Modifikatoren wie CTRL, ALT, SHIFT.

+0

das war meine ursprüngliche Idee auf Tastendruck basiert. Ich hatte gehofft, dass es eine eingebaute opencv-Funktion geben würde, um mit dieser – MaskedAfrican

+0

genau was zu tun? – Miki

+0

Ich habe mich entschieden, stattdessen diese Methode zu verwenden. Weniger unordentlich. – MaskedAfrican

Verwandte Themen