关闭

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

473人阅读 评论(0) 收藏 举报
分类:
滑动条 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))

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14941次
    • 积分:434
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:7篇
    • 译文:7篇
    • 评论:4条
    最新评论