摘要:主要记录滑动条函数使用方法
创建滑动条函数:
C++:
int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange=0, void* userdata=0)
参数:
trackbarname=》所创建的跟踪条的名字
winname=》跟踪条所依附的窗口的名字
value=》可选的指向整型变量的指针,整型变量的值对应于滑动条的位置。初始创建时,滑动条的值就是这个整型变量的值。
count=》滑动条最大的值。最小值总是为0。
onChange=》指向回调函数的指针,每次滚动条改变位置时,这个函数就会被调用。这个函数的原型应该为:void Foo(int, void*);其中第一个参数是跟踪条的位置,第二个参数是用户数据(见下一个参数)。如果回调为空,表示没有回调函数被调用,仅仅value会有变化。
userdata=》通过回调函数传递的用户数据。它可以控制跟踪条事件而不需要使用全局变量。
这个createTrackbar函数创建一个具有特定名称和范围的轨迹条(滚动条,或者说是滑块范围控制工具),指定一个和轨迹条位置同步的变量。而且要指定回调函数,在轨迹条位置改变的时候来调用这个回调函数。创建的轨迹条显示在指定的winname所代表的窗口上。
注:如果回调函数中使用的是全局变量 则userdata可以默认为0(空)
回调函数解释:
知乎神答:
https://www.zhihu.com/question/19801131
百度百科:
https://baike.baidu.com/item/%E5%9B%9E%E8%B0%83%E5%87%BD%E6%95%B0
我的理解就是把函数当作参数传到另一个函数中,当另一个函数运行时,遇到特定条件可以触发传进来的调用函数。回调函数是丫鬟,主调函数是主人。
示例中展示了回调函数中的userdata使用的一种情况:
#include <iostream>
#include <opencv/cv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
//定义了窗体名
string winName = "二值化";
//TrackBar发生改变的回调函数
void onChangeTrackBar(int pos, void* userdata);
//主函数
int main()
{
//trackbar名
string trackBarName = "pos";
//图像文件名
string imgName = "1.jpg";
//trackbar的值
int posTrackBar = 0;
//trackbar的最大值
int maxValue = 255;
Mat img;
//读入图像,以灰度图形式读入
img = imread(imgName, 0);
//新建窗口
namedWindow(winName);
imshow(winName, img);
//创建trackbar,我们把img作为数据传进回调函数中
createTrackbar(trackBarName, winName, &posTrackBar, maxValue, onChangeTrackBar, &img);
waitKey();
return 0;
}
// 回调函数
void onChangeTrackBar(int pos, void* usrdata)
{
// 强制类型转换
Mat src = *(Mat*)(usrdata);
Mat dst;
// 二值化
threshold(src, dst, pos, 255, 0);
imshow(winName, dst);
}