文章目錄
- 1 創建trackbar
- 2 使用userdata傳入函數
- 3 鍵盤響應
1 創建trackbar
1.trackbar名稱 2.創建在哪個窗口上 3.拖動trackbar改變的值 4.trackBar的最大值
5.trackbar改變時的回調函數 6. 帶入回調函數的數據,可以不用帶,是一個void指針
createTrackbar(“Value bar”, “亮度調整”, &lightness, max_value, on_tract);
Mat temp;
Mat dst;
Mat m;
Mat src;
int lightness = 50;
static void on_tract(int, void*)
{m = Scalar(lightness, lightness, lightness);add(src, m, dst);imshow("亮度調整", dst);}void QuickDemo::trackbar_demo(Mat &image)
{namedWindow("亮度調整", WINDOW_AUTOSIZE);dst = Mat::zeros(image.size(), image.type());//dst = image + Scalar(50, 50, 50);m = Mat::zeros(image.size(), image.type());src = image;int max_value = 100;// 1.trackbar名稱 2.創建在哪個窗口上 3.傳的值 4.trackBar的最大值// 5.trackbar改變時的回調函數 6. 需要帶入的數據,可以不用帶,是一個void指針createTrackbar("Value bar", "亮度調整", &lightness, max_value, on_tract);on_tract(50, 0);
}
2 使用userdata傳入函數
在createTrackbar中,將image通過參數傳入到回調函數中,(void*)(&image);
在下面調用on_tract函數中,需要傳入image
void QuickDemo::trackbar_demo(Mat &image)
{namedWindow("亮度調整", WINDOW_AUTOSIZE);dst = Mat::zeros(image.size(), image.type());//dst = image + Scalar(50, 50, 50);m = Mat::zeros(image.size(), image.type());int max_value = 100;int lightness = 50;// 1.trackbar名稱 2.創建在哪個窗口上 3.傳的值 4.trackBar的最大值// 5.trackbar改變時的回調函數 6. 需要帶入的數據,可以不用帶,是一個void指針createTrackbar("Value bar", "亮度調整", &lightness, max_value, on_tract,(void*)(&image));on_tract(50, &image);
}
修改on_tract的函數,獲取userdata
static void on_tract(int b, void* userdata)
{Mat image = (*(Mat*)userdata);Mat dst = Mat::zeros(image.size(), image.type());;Mat m = Mat::zeros(image.size(), image.type());;m = Scalar(lightness, lightness, lightness);add(dst, m, image);imshow("亮度調整", dst);}
同樣可以調整其他的屬性
比如增強對比度,這里用addWeighted();來進行疊加
這個函數主要是dst = src1alpha + src2beta + gamma;
alpha 是 src1的權重,beta是src2的權重,gamma加到最終結果的標量值用于調整圖像的整體亮度
int contrast_value = 100;createTrackbar("Contrast Bar", "亮度調整", &contrast_value, 200, on_weighted_tract, (void*)(&image));on_weighted_tract(50, &image);static void on_weighted_tract(int b, void* userdata)
{Mat image = (*(Mat*)userdata);Mat dst = Mat::zeros(image.size(), image.type());;Mat m = Mat::zeros(image.size(), image.type());;double alpha = b/100.0;double beta = 0.0;double gamma = 0;// 這里相當于m沒有權重,只有第一張圖有權重,通過調整alpha的值來調整值的對比度addWeighted(image, alpha, m, beta, gamma, dst);imshow("亮度調整", dst);}
對比度是兩個像素點的差值,增加對比度,會讓兩個像素點之間的差距會變大
亮度是所有像素點的值都同步改變
3 鍵盤響應
監聽視頻的時候,waitkey(1);永遠是1
void QuickDemo::key_demo(Mat &image)
{Mat dst;while (true){// 監聽鍵盤操作int c = waitKey(100);if (c == 27) // key #esc{break;}if (c == 49){std::cout << "print key #1" << std::endl;cvtColor(image, dst, COLOR_BGR2GRAY);}if (c == 50){std::cout << "print key #2" << std::endl;cvtColor(image, dst, COLOR_BGR2GHSV);}if (c == 51){std::cout << "print key #3" << std::endl;dst = Scalar(50, 50, 50);add(image, dst, dst);}imshow("鍵盤響應", dst);}