OpenCV學習-3:圖像亮度和對比度調整

一、建立滑動控件
int createTrackbar(conststring& trackbarname, conststring& winname, int* value, int count, TrackbarCallback onChange=0,void* userdata=0);  
第一個參數,const string&類型的trackbarname,表示軌跡條的名字,用來表明咱們建立的軌跡條。
第二個參數,const string&類型的winname,填窗口的名字,表示這個軌跡條會依附到哪一個窗口上,即對應namedWindow()建立窗口時填的某一個窗口名。
第三個參數,int* 類型的value,一個指向整型的指針,表示滑塊的位置。而且在建立時,滑塊的初始位置就是該變量當前的值。
第四個參數,int類型的count,表示滑塊能夠達到的最大位置的值。PS:滑塊最小的位置的值始終爲0。
第五個參數,TrackbarCallback類型的onChange,首先注意他有默認值0。這是一個指向回調函數的指針,每次滑塊位置改變時,這個函數都會進行回調。而且這個函數的原型必須爲void XXXX(int,void*);其中第一個參數是軌跡條的位置,第二個參數是用戶數據(看下面的第六個參數)。若是回調是NULL指針,表示沒有回調函數的調用,僅第三個參數value有變化。
第六個參數,void*類型的userdata,他也有默認值0。這個參數是用戶傳給回調函數的數據,用來處理軌跡條事件。若是使用的第三個參數value實參是全局變量的話,徹底能夠不去管這個userdata參數。ios

//建立滑塊函數:名稱+窗口名稱+關聯數據+最大值+回調函數接口
createTrackbar("對比度:", wndName2, &g_nContrastValue, 300, cvTrackbarCallback);
createTrackbar("亮   度:", wndName2, &g_nBrightValue, 200, cvTrackbarCallback);

二、獲取滑動控件的位置
int getTrackbarPos(conststring& trackbarname, conststring& winname);  
第一個參數,const string&類型的trackbarname,表示軌跡條的名字。
第二個參數,const string&類型的winname,表示軌跡條的父窗口的名稱。c++

示例代碼:函數

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

using namespace std;
using namespace cv;

const string wndName1 = "原始圖片";
const string wndName2 = "效果圖片";
const string trackName = "track";
int g_nContrastValue; //對比度值
int g_nBrightValue;  //亮度值
Mat g_srcImage;
Mat g_dstImage;

void cvTrackbarCallback(int pos, void* data)
{
    //三個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++) {
                g_dstImage.at<Vec3b>(y,x)[c]= saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y,x)[c] ) + g_nBrightValue );
            }
        }
    }

    //顯示圖像
    imshow(wndName1, g_srcImage);
    imshow(wndName2, g_dstImage);
}

void TrackAndAdjustImage()
{
    g_srcImage = imread("2.jpg"); //讀取圖片1
    g_dstImage= Mat::zeros(g_srcImage.size(), g_srcImage.type()); //按照圖片1的尺寸和類型初始化圖片2
    g_nContrastValue = 60; //設置對比度初始值
    g_nBrightValue = 60;   //設置亮度初始值
    namedWindow(wndName1, 1); //建立兩個窗口用來對比圖片
    namedWindow(wndName2, 1);
    //建立滑塊函數:名稱+窗口名稱+關聯數據+最大值+回調函數接口
    createTrackbar("對比度:", wndName2, &g_nContrastValue, 300, cvTrackbarCallback);
    createTrackbar("亮   度:", wndName2, &g_nBrightValue, 200, cvTrackbarCallback);

    cvTrackbarCallback(0, 0);
}

int main(int argc, char *argv[])
{
    //ReadImgaeAndShow();
    //ROIAndShowImage();
    TrackAndAdjustImage();

    while(1) {
        waitKey(6000);
    }

    return 0;
}
相關文章
相關標籤/搜索