使用相同的回调函数opencv c++管理多个轨迹栏



我想知道在opencv中是否可以做这样的事情。我想在每个轨迹条上调用相同的回调函数onChange,并在onChange((内部以某种方式提取3个滑块中的哪一个发生了变化。

cv::createTrackbar("bar_0", "window", &bSliderValue1, 100, onChange, (void*)&data);
cv::createTrackbar("bar_1", "window", &bSliderValue2, 100, onChange, (void*)&data);
cv::createTrackbar("bar_2", "window", &bSliderValue3, 100, onChange, (void*)&data);

onChange的功能如下:

static void onChange(int value, void* userdata)
{
}

您可以添加带有跟踪栏 ID的用户数据

struct Userdata {
int sliderId;
std::string sliderName;
};
const Userdata userdata0 {0, "bar_0"};
cv::createTrackbar("bar_0", "window", &bSliderValue1, 100, onChange, const_cast<Userdata*>(&userdata0));
const Userdata userdata1 {1, "bar_1"};
cv::createTrackbar("bar_1", "window", &bSliderValue2, 100, onChange, const_cast<Userdata*>(&userdata1));
const Userdata userdata2 {2, "bar_2"};
cv::createTrackbar("bar_2", "window", &bSliderValue3, 100, onChange, const_cast<Userdata*>(&userdata2));
static void onChange(int value, void* userdata)
{
const auto &slider = const_cast<const Userdata&>(*static_cast<Userdata*>(userdata));
auto sliderId = slider.sliderId;
auto sliderName = slider.sliderName;
}

您应该用C++强制转换替换C强制转换。

下面是一个没有常量的例子。

struct Userdata {
int sliderId;
std::string sliderName;
};
Userdata userdata0 {0, "bar_0"};
cv::createTrackbar("bar_0", "window", &bSliderValue1, 100, onChange, &userdata0);
Userdata userdata1 {1, "bar_1"};
cv::createTrackbar("bar_1", "window", &bSliderValue2, 100, onChange, &userdata1);
Userdata userdata2 {2, "bar_2"};
cv::createTrackbar("bar_2", "window", &bSliderValue3, 100, onChange, &userdata2);
static void onChange(int value, void* userdata)
{
const auto &slider = *static_cast<Userdata*>(userdata);
auto sliderId = slider.sliderId;
auto sliderName = slider.sliderName;
}

最新更新