Trackbar滾動條操作
前置知識:
亮度調整:對所有像素點同時增減相同的值。
對比度調整:對所有像素點同時乘或除相同的值。
一、調整亮度滾動條
函數:
createTrackbar(滾動條名,視窗名,初始增加亮度,最大增加亮度,trackbar callback函數)
過程
1、定義3個全局Mat,初始亮度變化值,用于建立靜态trackbar callback函數
Mat src1, dst1, m1;
int lightness = 50;
static void on_track(int, void*) {
m1 = Scalar(lightness, lightness, lightness);
subtract(src1, m1, dst1);
imshow("亮度調整", dst1);
}
2、在函數體内初始化上一步定義的全局Mat,定義最大亮度值,最後傳入createTrackbar函數。
最後可以得到如下代碼。
Mat src1, dst1, m1;
int lightness = 50;
static void on_track(int, void*) {
m1 = Scalar(lightness, lightness, lightness);
subtract(src1, m1, dst1);
imshow("亮度調整", dst1);
}
void QuickDemo::trackBar_Demo(Mat& image) {
namedWindow("亮度調整", WINDOW_AUTOSIZE);
dst1 = Mat::zeros(image.size(), image.type());
m1 = Mat::zeros(image.size(), image.type());
int max_light = 100;
src1 = image;
createTrackbar("vlaue Bar", "亮度調整", &lightness, max_light, on_track);//需要輸入trackbar名, 視窗名,亮度初始值,亮度最大值,自定義的trackbar處理函數。
on_track(50, 0);
}
二、參數傳遞速度,同時調整亮度與對比度
對createTrackbar函數傳入參數如下:
createTrackbar("vlaue Bar", "亮度調整", &lightness, max_light, on_track,(void*)&image)
這裡多了一個 被強制轉換為void類型的 指向image的 指針 參數(void*)&image。
由此可以對應修改一步中的代碼如下(速度更快):
static void on_track(int b , void* underdata) {
Mat image = *((Mat*)underdata);
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
m = Scalar(b, b, b);
subtract(image, m, dst);
imshow("亮度調整", dst);
}
void QuickDemo::trackBar_Demo(Mat& image) {
namedWindow("亮度調整", WINDOW_AUTOSIZE);
int lightness = 10;
int max_light = 100;
createTrackbar("vlaue Bar", "亮度調整", &lightness, max_light, on_track,(void*)&image);//需要輸入trackbar名, 視窗名,亮度初始值,亮度最大值,自定義的trackbar處理函數,最後一個輸入是用于适應輸入類型的,一般可以不輸入。
on_track(50, &image);
}
為了實作對比度的更改,需要用到:
addWeighted函數,主要是将兩張不同亮度的圖,各自分派一定占比,再合成生成新的圖像
addWeighted(image, alpha, m, beta, gamma, dst);
代碼如下:
static void on_lightness(int b , void* underdata) {
Mat image = *((Mat*)underdata);
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
addWeighted(image, 1, m, 0, b, dst);
imshow("亮度與對比度調整", dst);
}
static void on_contrast(int b, void* underdata) {
Mat image = *((Mat*)underdata);
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
double contrast = b / 100.0;
addWeighted(image, contrast, m, 0.0, 0, dst);
imshow("亮度與對比度調整", dst);
}
void QuickDemo::trackBar_Demo(Mat& image) {
namedWindow("亮度與對比度調整", WINDOW_AUTOSIZE);
int lightness = 10;
int max_light = 100;
float contrast_value = 2.0;
createTrackbar("vlaue Bar", "亮度與對比度調整", &lightness, max_light, on_lightness,(void*)&image);//需要輸入trackbar名, 視窗名,亮度初始值,亮度最大值,自定義的trackbar處理函數,最後一個輸入是用于适應輸入類型的,一般可以不輸入。
createTrackbar("contrast Bar", "亮度與對比度調整", &lightness, 200, on_contrast, (void*)&image);//需要輸入trackbar名, 視窗名,亮度初始值,亮度最大值,自定義的trackbar處理函數,最後一個輸入是用于适應輸入類型的,一般可以不輸入。
on_lightness(50, &image);
}