gpt4 book ai didi

c++ - C++ 类中的 OpenCV 轨迹栏回调

转载 作者:太空狗 更新时间:2023-10-29 20:00:08 26 4
gpt4 key购买 nike

我有一个问题,关于在 C++ 中使用类时如何在 OpenCV 中定义轨迹栏的回调。

当我定义我的轨迹栏时,让我们在我的 .cpp 类的构造方法中说我如何定义回调?

我一直在尝试使用函数指针,但没有成功。我想我一定是做错了什么 :-)

这是我的头文件:

class SliderwithImage {

public:
SliderwithImage(void);
~SliderwithImage(void);

void sliderCallBack(int pos);
};

这是实现文件:

#include "SliderwithImage.h"

void SliderwithImage::sliderCallBack(int pos) {


}

SliderwithImage::SliderwithImage(void) {

const char* windowName = "window";
int lowvalue =1;

namedWindow(windowName, CV_GUI_EXPANDED);

createTrackbar("mytrackbar", windowName, &lowvalue, 255, sliderCallBack);

}

SliderwithImage::~SliderwithImage(void) {

}

显然 createTrackbar 方法无法识别 sliderCallBack...我猜这是范围问题。但我不确定如何解决这个问题?

如有任何帮助,我们将不胜感激。

非常感谢。

最佳答案

回调函数必须是静态的或全局的,但您可以将它传递给您要操作的对象的引用(参见 OpenCV 用户邮件列表上的 this post)。

createTrackbar方法有一个传递给调用函数的 userdata 参数。在 C 中有一个未记录的 cvCreateTrackbar2 方法,定义在 highgui_c.h 中,它具有相同的功能:

CVAPI(int) cvCreateTrackbar2( const char* trackbar_name, const char* window_name,
int* value, int count, CvTrackbarCallback2 on_change,
void* userdata CV_DEFAULT(0));

这些方法让您可以创建一个带有静态回调函数的类,该回调函数采用指向该类对象的指针。您可以像这样创建轨迹栏:

cv:createTrackbar("Label", "Window" &variable, MAX_VAL, &MyClass::func, this);

回调看起来像这样:

void MyClass:func(int newValue, void * object) {
MyClass* myClass = (MyClass*) object;
// ...do stuff.
}

请注意,只要在创建轨迹栏时提供指向它的指针(如上所述),您就不需要自己显式更新变量,但如果您需要先处理它,我建议您在回调函数。

关于c++ - C++ 类中的 OpenCV 轨迹栏回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8636689/

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