【OpenCV_10】 创建滑动条Trackbar & 图像对比度、亮度值调整

原创 2016年06月01日 17:59:44
滑动条 Trackbars在各种场合都非常有用。可以在各种OpenCV应用中通过滑动条来改变参数。


Trackbars的简单应用


不论在任何时候改变trackbar滑块的位置,一个整型变量就随之改变。使用这个功能就可以对图像或者视频的属性进行调节。

OpenCV实例:通过Trackbars来调节图像亮度以及对比度


下面的例子中,通过添加两个trackbars来调节亮度以及对比度。
它是在while循环迭代无限,并实时的将亮度和对比度的图像,因为希望每当用户改变了trackbars的位置将更改应用到图像。

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;

int main( int argc, char** argv )
{
     // Read original image 
     Mat src = imread("MyPic.JPG");

     //if fail to read the image
     if (!src.data) 
     { 
          cout << "Error loading the image" << endl;
          return -1; 
     }

     // Create a window
     namedWindow("My Window", 1);

     //Create trackbar to change brightness
     int iSliderValue1 = 50;
     createTrackbar("Brightness", "My Window", &iSliderValue1, 100);

     //Create trackbar to change contrast
     int iSliderValue2 = 50;
     createTrackbar("Contrast", "My Window", &iSliderValue2, 100);

     while (true)
     {
          //Change the brightness and contrast of the image (For more infomation http://opencv-srf.blogspot.com/2013/07/change-contrast-of-image-or-video.html)
          Mat dst;
          int iBrightness  = iSliderValue1 - 50;
          double dContrast = iSliderValue2 / 50.0;
          src.convertTo(dst, -1, dContrast, iBrightness); 

          //show the brightness and contrast adjusted image
          imshow("My Window", dst);

          // Wait until user press some key for 50ms
          int iKey = waitKey(50);

          //if user press 'ESC' key
          if (iKey == 27)
          {
               break;
          }
     }

     return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

新出现的OpenCV函数

  • int createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0)
这个OpenCV函数是创建一个trackbar并且把它连接到指定好窗口。

PS:。 第五个参数, 第六个参数,。

  • trackbarname - const string&类型的trackbarname,表示轨迹条的名字,用来代表我们创建的轨迹条
  • winname -const string&类型的winname,填窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名
  • value -int* 类型的value,一个指向整型的指针,表示滑块的位置。并且在创建时,滑块的初始位置就是该变量当前的值。
  • count -int类型的count,表示滑块可以达到的最大位置的值(滑块最小的位置的值始终为0)。
  • onChange -TrackbarCallback类型的onChange,首先注意他有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int,void*);其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。
  • userdata -void*类型的userdata,他也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数

其他的函数在之前博客都做了介绍,如果有什么不明白的,可以点击下面链接。


Trackbar 的回调函数


上面的例子中,仅仅使用 "createTrackbar"函数的4个参数,但是还有另外2个参数,在这里再解释一下。使用回调函数的优点在于,它不需要和上面的例子一样在while循环迭代。


下面举个例子,加上两个trackbars来调节图像亮度和对比度,通过使用回调函数来实现。

///////////////////////////////////////////////////////////////////////////////////////
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace std;
using namespace cv;

Mat src;

void MyCallbackForBrightness(int iValueForBrightness, void *userData)
{
     Mat dst;
     int iValueForContrast = *( static_cast<int*>(userData) );

     //Calculating brightness and contrast value
     int iBrightness = iValueForBrightness - 50;
     double dContrast = iValueForContrast / 50.0;

     //Calculated contrast and brightness value
     cout << "MyCallbackForBrightness : Contrast=" << dContrast << ", Brightness=" << iBrightness << endl;

     //adjust the brightness and contrast
     src.convertTo(dst, -1, dContrast, iBrightness); 

     //show the brightness and contrast adjusted image
     imshow("My Window", dst);
}

void MyCallbackForContrast(int iValueForContrast, void *userData)
{
     Mat dst;
     int iValueForBrightness = *( static_cast<int*>(userData) );

     //Calculating brightness and contrast value
     int iBrightness = iValueForBrightness - 50;
     double dContrast = iValueForContrast / 50.0;

     //Calculated contrast and brightness value
     cout << "MyCallbackForContrast : Contrast=" << dContrast << ", Brightness=" << iBrightness << endl;

     //adjust the brightness and contrast
     src.convertTo(dst, -1, dContrast, iBrightness); 

     //show the brightness and contrast adjusted image
     imshow("My Window", dst);
}



int main(int argc, char** argv)
{
     // Read original image 
     src = imread("MyPic.JPG");

     //if fail to read the image
    if (src.data == false) 
    { 
          cout << "Error loading the image" << endl;
          return -1; 
    }

    // Create a window
    namedWindow("My Window", 1);

    int iValueForBrightness = 50;
    int iValueForContrast = 50;

    //Create track bar to change brightness
    createTrackbar("Brightness", "My Window", &iValueForBrightness, 100, MyCallbackForBrightness, &iValueForContrast);

    //Create track bar to change contrast
    createTrackbar("Contrast", "My Window", &iValueForContrast, 100, MyCallbackForContrast, &iValueForBrightness);
  
    imshow("My Window", src);

    // Wait until user press some key
    waitKey(0);


    return 0;
}
///////////////////////////////////////////////////////////////////////////////////////




Trackbar回调函数

代码解析


这里用到了2个回调函数"MyCallbackForBrightness(int, void*)" 对应 "Brightness" 滑动条trackbar 以及"MyCallbackForContrast(int, void*)"对应 "Contrast" 的trackbar.

这里src是全局变量,所以三个函数都可以对他访问。


一旦 "Brightness" “亮度”的TrackBar的位置改变时, "MyCallbackForBrightness(int, void*)" ”将被调用。第1个整形参数持有“亮度”跟踪条的位置值。 “对比度”"Contrast"的TrackBar的位置,第二个参数传递。 (注意第5和第6个参数;createTrackbar("Brightness""My Window", &iValueForBrightness, 100, MyCallbackForBrightness, &iValueForContrast);)


一旦"Contrast"“对比度”的TrackBar的位置改变时,"MyCallbackForContrast(int, void*)" 将被调用。第1个整形参数持有“亮度”跟踪条的位置值。 “亮度”的TrackBar的位置,第二个参数传递。 (注意第5和第6个参数; createTrackbar(("Contrast""My Window", &iValueForContrast, 100, MyCallbackForContrast, &iValueForBrightness))

版权声明:本文为博主原创文章,未经博主允许不得转载。

opencv(九)之轨迹条条创建和使用createTrackbar

上篇介绍图像混合时,需要设置两幅图像的权重,每次改变图像权重只能从代码改变,没有那么直观。opencv提供了一种称为轨迹条或滑动条(Trackbar)的控件工具,能够直观的改变出现处理时的参数,实时看...

图像轮廓检测,创建Trackbar & 图像对比度、亮度值调整

今天学习到@浅墨_毛星云博主的关于OpenCV的第六篇博文,详细的讲解了创建Trackbar & 图像对比度、亮度值调整 ,也给出了具体的实例,再此我将自学的记录做一个总计与汇总,欢迎各位朋友一起学习...

Python下使用OpenCV——使用Trackbar实现绘图板

本次实验利用到了createTrackbar和getTrackbarPos函数实现一个绘图板的功能,用户可以选择矩形或是画笔模式,并设置调色板中值来选择颜色,选择画笔大小,进行绘图。除此之外,还可以用...

Python下使用OpenCV——使用Trackbar实现绘图板

本次实验利用到了createTrackbar和getTrackbarPos函数实现一个绘图板的功能,用户可以选择矩形或是画笔模式,并设置调色板中值来选择颜色,选择画笔大小,进行绘图。除此之外,还可以用...

背景建模技术:帧处理(FrameProcessor)模块

这篇文章是我从自己的QQ(632846506)日志中移过来的。https://user.qzone.qq.com/632846506/infocenter。 本文将简单介绍帧处理模块,即对每一帧...

【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

转自http://blog.csdn.net/poem_qianmo/article/details/21479533 本系列文章由@浅墨_毛星云 出品,转载请注明出处。   ...

【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

本系列文章由@浅墨_毛星云 出品,转载请注明出处。   文章链接: http://blog.csdn.net/poem_qianmo/article/details/21...

【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

本系列文章由@浅墨_毛星云 出品,转载请注明出处。   文章链接: http://blog.csdn.NET/poem_qianmo/article/details/21479533 作者...

OpenCV学习笔记(14)创建Trackbar & 图像对比度、亮度值调整

本系列文章由@浅墨_毛星云 出品,转载请注明出处。   文章链接: http://blog.csdn.net/poem_qianmo/article/details/21...

【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

本系列文章由@浅墨_毛星云 出品,转载请注明出处。   文章链接: http://blog.csdn.net/poem_qianmo/article/details/21...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OpenCV_10】 创建滑动条Trackbar & 图像对比度、亮度值调整
举报原因:
原因补充:

(最多只允许输入30个字)