2

目前我有许多用于更改图像值的滑块。我正在为滑块使用 OpenCV 轨迹栏,该滑块对我的每个滑块都有一个不同功能的回调。我想让我的滑块回调指向一个回调函数,然后使用用户数据来识别哪个轨迹栏进行了调用。

这是轨迹栏的文档

我不确定我应该将什么值传递给 void*,以及如何从我的回调函数中检索这个值下面是我的轨迹栏编译的示例。

int ref = 1;
createTrackbar("Name","Window",0, 1, myFunc, &ref);

在我的回调函数中,我尝试检索 ref 的值。

void myFunc(int value, void *userdata)
{
    int val = *((int*)&userdata);
    cout << val << endl;
}

我在尝试将指针转换回 int 时遇到问题,这是我在网上找到的解决方案,它给了我 val 作为 ref 的地址。

int val = *((int*)&userdata);

这似乎很麻烦,因为我必须从 val 的地址中取回值。有没有更简单的方法来做到这一点?

4

2 回答 2

1

不,没有更简单的方法。这是您想要的功能的最低要求。

于 2013-10-28T15:43:27.257 回答
0

传递一个看起来不那么麻烦的变量。

void cb_func(..., void *userdata) {
    int val = *static_cast<int *>(userdata);
}

调用它:

cv_function_takes_callback(..., cb_func, static_cast<void *>(&val));

C++11 传递多个变量的方式。
您可以传递引用甚至 lambda 函数。

type1 var1;
type2 var2;
auto lambda_no_capture = [](...) { ... };

typedef std::tuple<type1, const type2 &, decltype(lambda_no_capture)> tup_t;
tup_t tup(var1, var2, lambda_no_capture);

auto cb_func = [](..., void *userdata) -> void {
    tup_t &tup = *static_cast<tup_t *>(userdata);
    type1 var1 = std::get<0>(tup);
    decltype(auto) var2 = std::get<const type2 &>(tup); // requires c++14
    auto lambda_no_capture = std::get<2>(tup);
};

cv_function_takes_callback(..., cb_func, static_cast<void *>(&tup));

几点注意事项:

  • 你可以使用auto var1 = std::get<0>(tup);,但明确的更好。

  • 如果您使用auto引用变量,请使用const auto &var2 = std::get<1>(tup);. 如果您不受 C++11 的约束,decltype(auto)这就是它的用途。

  • 将 lambda 函数传递给回调函数看起来很酷,但它与在全局范围内使用函数没有什么不同,因为它们不能捕获参数

于 2021-05-14T17:40:11.013 回答