一、知識點
1、int createTrackbar(const String & trackbarname, const String & winname, int * value, int count, TrackbarCallback onChange = 0, void * userdata = 0);
? (1)、創建一個滑動條并將其附在指定窗口上。
? (2)、參數說明:
? ? ? trackbarname: 創建的滑動條顯示名稱。
?? ? ?winname: 包含滑動條的窗口名稱。
?? ? ?value: 將由滑動條更改的整數值的指針。
?? ? ?count: 滑動條的最大位置。
? ? ? onChange: 回調函數,每次滑塊改變位置時會調用此函數。 函數原型void Foo(int, void *),第一個參數是滑動條位置,第二個參數是用戶數據。 如果為nullptr,則不會調用回調函數,但是value仍然自動更新。
?? ? ?userdata: 用戶數據,傳遞給回調函數。
?? ? ?
2、void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
? (1)、計算兩個數組的加權和。 在多通道情況下,每個通道都是獨立處理的。
? (2)、算法代碼: dst = src1 * alpha + src2 * beta + gamma;
? (3)、參數說明:
? ? ? src1: 第一個輸入數組。
?? ? ?alpha: 第一個數組元素的權重。
?? ? ?src2: 第二個輸入數組,和src1大小和通道數相同。
?? ? ?beta: 第二個數組元素權重。
?? ? ?gamma: 標量,會添加到總和中。
?? ? ?dst: 輸出數組。
?? ? ?dtype: 輸出數組的可選深度。 當兩個輸入數組具有相同的深度時,dtype可以設置為-1,這相當于src1.depth()。
? (4)、src1 * alpha可以改變對比度,比如原先2個值為2、4,相差2,分別乘以2后為4、8,相差4,差值變大。
? (5)、gamma可以改變亮度,總和中每個像素的每個通道值都會加上gamma。
??
?? ? ?
?? ? ?
二、示例代碼: 滑動條調整圖像對比度和亮度
#include <iostream>
#include <opencv2/opencv.hpp>void onContrast(int value, void * pSrc)
{cv::Mat src = *((cv::Mat *)pSrc);cv::Mat temp = cv::Mat::zeros(src.size(), CV_8UC3);cv::Mat dst;double contrast = value / 50.0;cv::addWeighted(src, contrast, temp, 0.0, 0.0, dst);cv::imshow("對比度和亮度調整", dst);
}void onLightness(int value, void * pSrc)
{cv::Mat src = *((cv::Mat *)pSrc);cv::Mat temp = cv::Mat::zeros(src.size(), CV_8UC3);cv::Mat dst;cv::addWeighted(src, 1.0, temp, 0.0, value, dst);cv::imshow("對比度和亮度調整", dst);
}int main()
{cv::Mat src = cv::imread("../images/8.png");if (src.empty()){std::cout << "load src image error..." << std::endl;return -1;}cv::imshow("原始圖像", src);cv::namedWindow("對比度和亮度調整", cv::WINDOW_AUTOSIZE);int contrastValue = 50;cv::createTrackbar("對比度", "對比度和亮度調整", &contrastValue, 100, onContrast, &src);int lightnessValue = 50;cv::createTrackbar("亮度", "對比度和亮度調整", &lightnessValue, 100, onLightness, &src);cv::waitKey(0);return 0;
}