天天看點

opencv c++ 滾動條操作(6)

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);
opencv c++ 滾動條操作(6)

 代碼如下:

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);
}
           

繼續閱讀