2012-10-21 7 views
6

È possibile creare alcuni cursori e effettuare una richiamata per tutti?Molti dispositivi di scorrimento con una callback

Sto creando una finestra, in cui vorrei impostare circa 10 parametri. Sarebbe molto meglio avere 1 funzione di callback per tutti loro invece di 10 funzioni.

attualmente creo trackbar come questo:

cvCreateTrackbar("Var1","Window",&global_var1, 250, changing_var1); 
cvCreateTrackbar("Var2","Window",&global_var2, 250, changing_var2); 

e poi

void changing_var1(int pos) { 
    global_var1 = pos; 
}  

void changing_var2(int pos) { 
    global_var2 = pos; 
} 

E 'possibile creare un callback che sarebbe albe per modificare tutti i parametri in base al quale parametro voglio cambiare ?

+1

non v'è alcuna necessità di assegnare le variabili globali con valori. la funzione ha già messo il valore in global_var1, ecco perché prende il puntatore. – shanif

risposta

3

Sì, si dovrebbe essere in grado di farlo (almeno con l'interfaccia C++). Dovrai utilizzare il campo opzionale userData. Di seguito è riportato un piccolo esempio di come è possibile eseguire questa:

#include <opencv2/highgui/highgui.hpp> 
#include <iostream> 

using namespace std; 
using namespace cv; 

struct ColorThresholdData 
{ 
    int redHigh; 
    int redLow; 
}; 

enum ColorThresholdType 
{ 
    RED_HIGH, 
    RED_LOW 
}; 

void fooCallback(int value, void* colorThreshold); 

struct ColorThresholdData data; 
int main(int argc, char** argv) 
{ 
    ... 
    createTrackbar("red high", windowName, NULL, 255, fooCallback, new ColorThresholdType(RED_HIGH)); 
    createTrackbar("red low", windowName, NULL, 255, fooCallback, new ColorThresholdType(RED_LOW)); 
    ... 
} 

void fooCallback(int value, void* colorThreshold) 
{ 
    ColorThresholdType* ct = reinterpret_cast<ColorThresholdType*>(colorThreshold); 
    switch(*ct) 
    { 
    case RED_HIGH: 
     cout << "Got RED_HIGH value" << endl; 
     data.redHigh = value; 
     break; 
    case RED_LOW: 
     cout << "Got RED_LOW value" << endl; 
     data.redLow = value; 
     break; 
    } 
} 

speranza che è quello che stavi cercando :)