Opencv--滑动条

Opencv–滑动条的创建与使用

滑动条(Trackbar)是Opencv是一个比较重要的工具,依赖于窗口存在

创建滑动条

Opencv中创建滑动条的函数是**createTrackbar()**函数

int createTrackbar(const String& trackbarname,
const String& winname,
int* value,
int count,
TrackbarCallback onChange = 0,
void* userdata = 0);

参数说明:

  1. const string& 类型的trackbarname,是创建的轨迹条的名称
  2. const string&类型的winname,窗口的名字,表示轨迹条依附于哪个窗口上
  3. 一个指向int型的指针,代表滑块的位置
  4. 滑块可以到达的最大位置
  5. 回调函数
  6. 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函数。因此,必须完成以下工作:

  1. 获得函数地址
    函数名(不加任何参数)就是函数的地址。
  2. 声明函数指针
    *返回数据类型 (函数名)(参数列表)
  3. 使用函数指针调用函数

示例: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);
}
回调函数定义与使用

实现回调函数需要以下几步:

  1. 定义一个回调函数
  2. 将回调函数指针传给调用者
  3. 当特定事件或条件发生的时候,调用回调函数对事件进行处理
    超简单示例:
#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 <<"   ";
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值