2012-10-21 3 views
6

いくつかのスライダを作成して、すべてのコールバックを作成できますか?1つのコールバックを持つ多くのスライダ

私は約10のパラメータを設定したいウィンドウを作成しています。 10個の関数の代わりに1個のコールバック関数を持つ方が良いでしょう。

は現在、私はこのようなトラックバーを作成します。

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

、その後

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

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

はそれがALBEは私が変更したいパラメータに応じて、すべてのパラメータを変更することであろう1つのコールバックを作成することが可能です?

+1

探していたものです。以下は、これを実現する方法の小さな例があります。この関数はすでにglobal_var1に値を入れています。そのため、ポインタが必要です。 – shanif

答えて

3

はい、これはできるはずです(少なくともC++インターフェイスでは)。オプションのuserDataフィールドを使用することをお勧めします。

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

希望あなたが値を持つグローバル変数を割り当てる必要はありません:)

関連する問題