【问题标题】:How to pass user data using OpenCV trackbar如何使用 OpenCV 轨迹栏传递用户数据
【发布时间】:2013-11-07 06:50:03
【问题描述】:

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

Here is the documentation for the track bar

我不确定我应该将什么值传递给 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 的地址取回值。有没有更简单的方法来做到这一点?

【问题讨论】:

  • 不应该是int val = *((int *)userdata)吗?
  • 返回值而不是地址是的。我只是想知道是否有比这更好的发送用户数据的方法。

标签: c++ opencv void-pointers trackbar


【解决方案1】:

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

【讨论】:

  • 如果是这样的话,我会保持原样。
【解决方案2】:

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

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&lt;0&gt;(tup);,但最好是明确的。

  • 如果您将auto 与引用变量一起使用,请使用const auto &amp;var2 = std::get&lt;1&gt;(tup);。 如果您未绑定到 C++11,decltype(auto) 就是它的用途。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    相关资源
    最近更新 更多