Trackbar介绍
opencv提供了一种称为轨迹条或滑动条(Trackbar)的控件工具,能够直观的改变出现处理时的参数,实时看到更改这些参数时对于图像处理结果的影响。
Trackbar API
createTrackbar()函数
OpenCV 提供的 GUI 库在(highgui.h)里
createTrackbar()函数用来创建一个可以调节输入变量值的滑动条,并将改控件依附于指定的窗口上。在使用时需要和一个回调函数配合使用。其原型如下:
CV_EXPORTS int createTrackbar( const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0 );
其各个参数含义如下:
- trackname: 滑动条名字
- winname: 想要把该滑动条依附到的窗口名字,在程序中可能该窗口名称由namedWindow()声明。
- value: 创建滑动条时,滑动条的初始值
- count: 滑动条的最大值,即所有滑动条的数据变动都要在0-count之间,滑动条最小值为0
- onChange= 0 : 这是指的回调函数,每次滑动条数据变化时都对该函数进行回调
- userdata= 0 : 这个是用户传给回调函数的数据,用来处理滑动条数值变动。如果在创建滑动条时,输入value实参是全局变量,则本参数userdata可使用默认值0.
Trackbar案例
代码示例1:混合图像透明度变换显示
效果展示:
代码如下:
#include <iostream> #include <stdio.h> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> using namespace std; using namespace cv; //声明全局变量 const int g_nTrackbarMaxValue = 100; // 滑动条最大值 int g_nTrackbarValue; // 滑动条对应的值 double g_dAlphaValue; // 第一幅图权重 double g_dBetaValue; // 第二幅图权重 Mat g_srcImage1, g_srcImage2, g_distImage; //声明回调函数 void on_Trackbar(int, void*); int main() { g_srcImage1 = imread("./test2.jpg"); g_srcImage2 = imread("./test.jpg"); //判断图像是否加载成功 if (g_srcImage1.data && g_srcImage2.data) cout << "图像加载成功!" << endl << endl; else { cout << "图像加载失败!" << endl << endl; return -1; } namedWindow("混合后图像", WINDOW_NORMAL); // 滑动条依附的窗口 g_nTrackbarValue = 20; // 设置滑动条初始值 //在创建的窗体中创建滑动条控件并命名 char trackBarName[100]; /*Linux下使用sprintf需要添加头文件"stdio.h" *在Windows下微软一直在推广其安全函数即后缀加上_s *否则会有警告出现 *所以本段代码将有两个版本*/ sprintf(trackBarName, "透明度 %d", g_nTrackbarMaxValue); // Linux版本语句 // sprintf_s(trackBarName, "透明度 %d", g_nTrackbarMaxValue); // Windows版本语句 createTrackbar(trackBarName, "混合后图像", &g_nTrackbarValue, g_nTrackbarMaxValue, on_Trackbar); on_Trackbar(g_nTrackbarValue, 0); // 结果在回调函数中显示 waitKey(0); return 0; } void on_Trackbar(int, void*) { //图像融合的权重在0-1之间,转换输入值和权重之间的比例 g_dAlphaValue = (double)g_nTrackbarValue / g_nTrackbarMaxValue; g_dBetaValue = 1.0 - g_dAlphaValue; // 第二幅图像权重 //使用addWeighted函数对图像进行线性混合 addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_distImage); imshow("混合后图像", g_distImage); }
代码示例2:图像亮度与对比度滑动调整
效果展示:
代码如下:
#include <iostream> #include <math.h> #include <opencv2/opencv.hpp> #include<opencv2/highgui.hpp> #include <opencv2/highgui/highgui_c.h> using namespace cv; using namespace std; int g_nContrastValue; //对比度值 int g_nBrightValue; //亮度值 Mat g_srcImage, g_dstImage; static void ContrastAndBright(int, void*); int main() { //【0】初始化、配置 // system("color 5F"); g_srcImage = imread("./test2.jpg"); if (!g_srcImage.data) { printf("Oh,damm,读取g_srcImage图像错误!!!!"); return false; } g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type()); // 设定对比度和亮度的初值 g_nContrastValue = 80; g_nBrightValue = 80; namedWindow("【效果图窗口】", 1); // 创建轨迹条 createTrackbar("对比度:", "【效果图窗口】", &g_nContrastValue, 300, ContrastAndBright); createTrackbar("亮 度:", "【效果图窗口】", &g_nBrightValue, 200, ContrastAndBright); // 调用回调函数 ContrastAndBright(g_nContrastValue, 0); ContrastAndBright(g_nBrightValue, 0); cout << endl << "嗯,好了,请调整滚动条观察图像效果!!!\n\n" << "\t按下“q”键时,程序退出!!!\n" << "\n\n\t\t\t\tby"; waitKey(0); return 0; } // ContrastAndBright( int, void* ) 描述:改变图像对比度和亮度值的回调函数 static void ContrastAndBright(int, void*) { // 创建窗口 namedWindow("【原始图窗口】", 1); // 三个for循环,执行 g_dsImage(i,j) = a*g_srcImage(i,j) + b for (int y = 0; y < g_srcImage.rows; y++) { for (int x = 0; x < g_srcImage.cols; x++) { for (int c = 0; c < 3; c++) { g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar> ((g_nContrastValue*0.01) * (g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue); } } } // 显示图像 imshow("【原始图窗口】", g_srcImage); imshow("【效果图窗口】", g_dstImage); }