7

いくつかのスライダーを作成し、それらすべてに対して 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;
}

変更したいパラメータに応じてすべてのパラメータを変更するコールバックを1つ作成することは可能ですか?

4

2 に答える 2

4

はい、これを行うことができるはずです (少なくとも 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;
    }
}

それがあなたが探していたものであることを願っています:)

于 2012-10-24T04:55:07.263 に答える