Opencv–滑动条的创建与使用
滑动条(Trackbar)是Opencv是一个比较重要的工具,依赖于窗口存在
创建滑动条
Opencv中创建滑动条的函数是**createTrackbar()**函数
int createTrackbar(const String& trackbarname,
const String& winname,
int* value,
int count,
TrackbarCallback onChange = 0,
void* userdata = 0);
参数说明:
- const string& 类型的trackbarname,是创建的轨迹条的名称
- const string&类型的winname,窗口的名字,表示轨迹条依附于哪个窗口上
- 一个指向int型的指针,代表滑块的位置
- 滑块可以到达的最大位置
- 回调函数
- void* 类型的userdata,默认值是0,用户传给回调函数的数据,用来处理轨迹事件,如果第三个参数传递的是全局变量的话,就可以不去管userdata。
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
#define WINDOW_NAME "亮度调整"
int SliderValue = 60;
int MaxSliderValue = 100;
Mat m,src,dst;
//回调函数
void On_Track(int, void*)
{
int ratio = SliderValue * 255/ MaxSliderValue ;
m = Scalar(ratio, ratio, ratio);
add(src, m, dst);
imshow(WINDOW_NAME, dst);
}
int main(int argc, char** argv)
{
src= imread("D:\\English-dictionary\\bottle_R.png");
m = Mat::zeros(src.size(), src.type());
dst = Mat::zeros(src.size(), src.type());
namedWindow(WINDOW_NAME, 1);
createTrackbar("亮度调节滑动条", WINDOW_NAME, &SliderValue, MaxSliderValue, On_Track);
On_Track(SliderValue, 0);
waitKey(0);
}
回调函数
什么是回调函数?
有两个模块A和B,A调用了B中的函数FuncB,但是FuncB中的部分功能实现需要用到A中的函数FuncA,那么这么一个过程就叫做回调,FuncA就叫做回调函数。
函数指针
在理解回调函数之前,需要掌握函数指针的概念。与数据项相似,函数也有地址。函数的地址就是存储函数机器语言代码的内存开始的地址。函数指针有什么用呢?可以将A函数指针当作参数传给B函数,这样B参数就可以找到A函数。
例子:假如我们想设计一个estimate()函数来估算指定行的运算时间,不同的程序员都将使用这个函数。对于不同的程序员来说,大家使用的算法可能不一样,有的人用X算法,有的人用Y算法,但是对于所有的用户来说,estimate()中的一部分代码都是相同的,因此为了实现这个目标,只需要将程序员使用的算法函数地址传给estimate函数。因此,必须完成以下工作:
- 获得函数地址
函数名(不加任何参数)就是函数的地址。 - 声明函数指针
*返回数据类型 (函数名)(参数列表) - 使用函数指针调用函数
示例:estimate函数
#include<iostream>
using namespace std;
double betsy(int lns) {
return 0.05 * lns;
}
double pam(int lns) {
return 0.03 * lns + 0.0004 * lns * lns;
}
void estimate(int lines, double (*pf)(int))
{
cout << lines << " lines will take ";
cout << (*pf)(lines) << " hour(s)\n";
}
int main()
{
int code;
cout << "How many lines of code do you need?"<<endl;
cin >>code;
cout << "here is betsy's estimate: ";
estimate(code, betsy);
cout << endl;
cout << "here is pam's estimate: ";
estimate(code, pam);
}
回调函数定义与使用
实现回调函数需要以下几步:
- 定义一个回调函数
- 将回调函数指针传给调用者
- 当特定事件或条件发生的时候,调用回调函数对事件进行处理
超简单示例:
#include<iostream>
using namespace std;
//定义回调函数
void callbackfunc()
{
cout << "我是回调函数" << endl;
}
//调用函数
void callbackExe(void(*pf)())
{
return pf();
}
int main()
{
//当i计数到10的倍数时,调用回调函数
for (int i = 0; i < 100; i++)
{
if (i % 10 == 0)
{
cout << endl;
callbackExe(callbackfunc);
}
cout << i <<" ";
}
}