2012-10-21 21 views
6

Bazı kaydırıcılar oluşturmak ve hepsi için bir geri arama yapmak mümkün mü?Tek bir geri bildirim ile birçok sürgü

Yaklaşık 10 parametre ayarlamak istediğim bir pencere oluşturuyorum. 10 işlev yerine hepsi için 1 geri arama fonksiyonu olması daha iyi olurdu.

anda ben böyle trackbar oluşturun:

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

ve sonra

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

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

o albe i değiştirmek istediğiniz parametre göre tüm parametreleri değiştirmek olacaktır tek geri arama oluşturmak mümkün mü ?

+1

aradığını budur: Aşağıda bunu gerçekleştirmek nasıl küçük bir örneğidir. işlev, global_var1'de değeri zaten koydu, bu yüzden işaretçi alır. – shanif

cevap

3

Evet, bunu yapabilmeniz gerekir (en azından C++ arayüzü ile). İsteğe bağlı userData alanını kullanmak isteyeceksiniz.

#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; 
    } 
} 

Hope değerlerle küresel değişkenleri atamak için gerek yoktur :)

İlgili konular