OpenCV跟踪条回调的c++类
OpenCV trackbar callback in C++ class
我有一个关于如何在OpenCV中定义trackbar回调的问题,当在c++中使用类时。
当我定义我的trackbar,让我们说在我的。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用户邮件列表中的这篇文章)。
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.
}
请注意,只要在创建trackbar时提供指向它的指针(如上所述),您就不需要自己显式地更新变量,但如果您需要先处理它,我建议您在回调函数中显式地设置它。
必须将回调函数实现为全局函数或静态成员函数。为了使它看起来更面向对象,您可能更愿意将其实现为静态成员函数:)
我使用不同的解决方案来获取类变量中的滑块值(在我的情况下,获得实况视频流的选择旋转角度)。createTrackbar函数中的int* value
是一个公共类变量,然后在循环中使用(当获取视频时,但这可能会混乱地重复重画单个图像)。
这不是最好的解决方案,但对我来说很有效。
cv::createTrackbar("Rotation Angle(deg)", "Preview", &rotationAngle,
alpha_slider_max, NULL);
for(;;)
{
int rotAngle = this -> rotationAngle;
cv::Mat frame;
cv::Mat rot_frame;
this -> capture >> frame;
rot_frame = rotateVideo (frame, rotAngle);
imshow("Preview", rot_frame);
if(cv::waitKey(30) >= 0) break;
}
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 处理影响跨不同线程共享对象的定时回调的最佳方法是什么?
- 访问类C++ C 样式回调
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- 在C++中实现回调
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数