gpt4 book ai didi

c++ - 无法创建 OpenCV 的 mouseCallback 函数的基于类的实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:06 27 4
gpt4 key购买 nike

如标题所示,我在基于类的 C++ 结构中实现 OpenCV 的 mouseCallback 函数时遇到了一些问题。请允许我解释一下。我定义了一个名为 BriskMatching 的类,我在其中创建了一个名为 mouseCallback 的成员函数,其中包含 OpenCV 所需的正确参数(请参阅下面的代码片段)。

**Briskmatching.h**

class BriskMatching
{
public:
BriskMatching();
~BriskMatching();

public:
void mouseCallback(int event, int x, int y, int flags, void *param);
};

这一切都很好,但是当我尝试通过 OpenCV 的 cv::setMouseCallback 函数将此函数设置为指定的鼠标回调函数时,我的问题出现了。

在我的主函数中,我创建了一个名为 briskMatcher 的 BriskMatching 类的实例,然后当需要设置鼠标回调时,我尝试这样做......

cv::setMouseCallback("Matches", BriskMatching::mouseCallback, &matchesImg);

不幸的是,这会引发错误。

Error   3   error C3867: 'BriskMatching::mouseCallback': function call missing argument list; use '&BriskMatching::mouseCallback' to create a pointer to member c:\users\mobilef\documents\visual studio 2010\projects\opencv_objtracking\opencv_briskmatching\main.cpp 54  1   OpenCV_BriskMatching

我可以通过在 BriskMatching.h 中将 mouseCallback 函数声明为 static 来消除此错误,但随后我遇到了一大堆其他错误,因为我引用了很多mouseCallback 函数中的非静态成员变量。

所以我想问你们这个问题。我应该如何修改我的代码才能将在 BriskMatching 类中声明的 mouseCallback 函数正确传递给 cv::setMouseCallback 函数?

感谢您的所有帮助!

最佳答案

由于成员函数采用this 指针,因此您将需要一个静态包装函数。通常,您使用 param 参数作为成员函数所属对象的地址,因此您最终会得到如下内容:

...
static void mouseCallback(int event, int x, int y, int flags, void *param);

void doMouseCallback(int event, int x, int y, int flags);

然后在 mouseCallback 中:

void BriskMatching::mouseCallback(int event, int x, int y, int flags, void *param)
{
BriskMatching *self = static_cast<BriskMatching*>(param);
self->doMouseCallback(event, x, y, flags);
}

关于c++ - 无法创建 OpenCV 的 mouseCallback 函数的基于类的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17589841/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com