opencv学习笔记(三)----轨迹条的使用

创建轨迹条

createTrackbar

int createTrackbar(
    const string& trackbarname,  //轨迹条的名字
    const string& winname,  //窗口的名字
    int* value,  //一个指向整型的指针,表示滑块的位置。并且在创建时,滑块的初始位置就是该变量当前的值。
    int count,  //表示滑块可以达到的最大位置的值。PS:滑块最小的位置的值始终为0。
    TrackbarCallback onChange = 0,  /*这是一个指向回调函数的指针。每次滑块位置改变时,这个函数都会进行回调。
                                    *这个函数的原型必须为void XXXX(int,void*);其中第一个参数是轨迹条的位置,第二个参数是用户数据userdata。
                                    */如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。
    void* userdata = 0  //用户传给回调函数的数据,用来处理轨迹条事件,默认值0。如果使用的第三个参数value实参是全局变量的话,就不用管这个参数。
 );

获取轨迹条位置

getTrackbarPos:获取并返回轨迹条位置

int getTrackbarPos(
    conststring& trackbarname,  //轨迹条名称
    conststring& winname   //窗口名称
); 

改变图片亮度和对比度

两个参数 alpha > 0 和 beta 一般称作 增益 和 偏置 参数。我们往往用这两个参数来分别控制 对比度 和 亮度 。且一般取\alpha = [0.0, 3.0] , \beta = [0, 100]

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

using namespace std;
using namespace cv;

static void ContrastAndBright(int, void *);

int g_nContrastValue; //对比度值
int g_nBrightValue;  //亮度值
Mat g_srcImage,g_dstImage;

int main(  )
{
    //改变控制台前景色和背景色
    system("color5F");
    
    //读入用户提供的图像
    g_srcImage= imread( "/Users/zhouyang/Desktop/opencvCode/materialLibrary/lena2.jpg");
    
    g_dstImage= Mat::zeros( g_srcImage.size(), g_srcImage.type() );
    
    //设定对比度和亮度的初值
    g_nContrastValue=80;
    g_nBrightValue=80;
    
    //创建窗口
    namedWindow("new", 1);
    
    //创建轨迹条  
    createTrackbar("duibidu", "new", &g_nContrastValue, 300, ContrastAndBright);
    createTrackbar("liangdu", "new", &g_nBrightValue, 200, ContrastAndBright);
    
    //调用回调函数
    ContrastAndBright(g_nContrastValue,0);
    ContrastAndBright(g_nBrightValue,0);
    
    waitKey(0);
    return 0;
}

// 改变图像对比度和亮度值的回调函数
static void ContrastAndBright(int, void *)
{   
    //创建窗口
    namedWindow("old", 1);
    
    //三个for循环,执行运算 g_dstImage(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++ )
            {
                //saturate_cast 防止数据溢出
                g_dstImage.at<Vec3b>(y,x)[c]= saturate_cast<uchar>( (g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y,x)[c] ) + g_nBrightValue );
            }
        }
    }
    
    //显示图像
    imshow("old", g_srcImage);
    imshow("new", g_dstImage);
}

猜你喜欢

转载自blog.csdn.net/zyhhhh233/article/details/80421496
今日推荐