在图像处理时,有时需要动态调节某些参数,以便图像处理的效果更加明显,故改变参数数值的滑动条可以更好的操作。
1、createTrackbar()函数
Opencv中使用createTrackbar()函数在显示图像的窗口上创建滑动条
int cv::createTrackbar(const String & trackbarname,
const String & winname,
int * value,
int count,
TrackbarCallback onChange = 0,
void * userdata = 0
)
trackbarname:滑动条的名称
winname:创建滑动条窗口的名称
value:指向整数变量的指针,该指针指向的值反映滑块的位置,创建后,滑块位置由此变量定义
count:滑动条的最大取值
onChange:每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo(int,void *);,其中第一个参数是轨迹栏位置,第二个参数是用户数据。如果回调是NULL指针,则不会调用任何回调,只更新数值
userdata:传递给回调函数的可选参数
该函数能够在图像窗口的上方创建一个范围从0开始的整数滑动条,由于滑动条只能输出整数,如果需要得到小数,必须进行后续处理,例如输出值除以10得到含有1位小数的数据。函数第一个参数是滑动条的名称,第二个参数是创建滑动条的图像窗口的名称。第三个参数是指向整数变量的指针,该指针指向的值反映滑块的位置,在创建滑动条时该参数确定了滑动块的初始位置,当滑动条创建完成后,该指针指向的整数随着滑块的移动而改变。第四个参数是滑动条的最大取值。第五个参数是每次滑块更改位置时要调用的函数的指针。该函数应该原型为void Foo(int,void *),其中第一个参数是轨迹栏位置,第二个参数是用户数据,如果回调是NULL指针,则不会调用任何回调,只更新数值。最后一个参数是传递给回调函数的void *类型数据,如果使用的第三个参数是全局变量,可以不用忽略最后一个参数,使用参数的默认值即可。
2、代码
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
//为了能在被调函数中使用,所以设置成全局的
int value;
void callBack(int, void*);//滑动条回调函数
Mat img1, img2;
int main()
{
img1 = imread("");
if(!img1.data)
{
cout << "请确认是否输入正确的图像文件" << endl;
return -1;
}
namedWindow("滑动条改变图像亮度");
imshow("滑动条改变图像亮度", img1);
value = 100;//滑动条创建时的初值
//创建滑动条
createTrackbar("亮度值百分比", "滑动条改变图像亮度", &value, 600, callBack, 0);
waitKey(0);
return 0;
}
static void callBack(int, void*)
{
float a = value / 100.0;
img2 = img1 * a;
imshow("滑动条改变图像亮度", img2);
}