OpenCV createTrackbar() 滑動條建立使用簡單線性混合
阿新 • • 發佈:2021-12-08
函式原型:
int createTrackbar(const string & trackbarname, const string & winname, int *value, int count, TrackbarCallback onChange=0, void *userdata=0);
- 第一個引數:軌跡條的名字,用來代表我們建立的軌跡條;
- 第二個引數:視窗名字,表示軌跡條會依附到哪個視窗上,即對應 nameWindow()建立的某一個視窗;
- 第三個引數:滑塊的位置,建立時的初始位置就是其當前值;
- 第四個引數:滑塊的最大值,最小值始終位 0;
- 第五個引數:回撥函式指標,每次滑塊位置改變時,這個函式都會進行回撥,這個函式的原型必須是
void XXXX(int, void*)
- 第六個引數:這個是使用者傳給回撥函式的引數,如果第三個引數是全域性變數的話,可以不用管這個 userdata(函式內部可以直接訪問全域性變數,不用傳值)。
示例程式碼用的是全域性變數:
▲ 兩張圖混合在一起#include <opencv2/opencv.hpp> #include "opencv2/highgui/highgui.hpp" using namespace cv; #define WINDOW_NAME "線性混合示例" // 視窗標題巨集 /***全域性變數***/ const int g_nMaxAlphaValue = 100; // Alpha 值最大值 int g_nAlphaValueSlider; // 滑動條對應變數 double g_dAlphaValue; double g_dBetaValue; // 宣告影象儲存變數 Mat g_srcImage1; Mat g_srcImage2; Mat g_dstImage; /***響應滑動條回撥函式***/ void on_Trackbar(int, void*) { // alpha 值相對於最大值的比例 g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue; // beta 值為 1 減 alpha 值 g_dBetaValue = 1.0 - g_dAlphaValue; // 根據 alpha 和 beta 值進行線性混合 addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage); // 顯示 imshow(WINDOW_NAME, g_dstImage); } int main(int argc, char** argv) { g_srcImage1 = imread(".//image3_2_1//1.jpg"); g_srcImage2 = imread(".//image3_2_1//2.jpg"); if (!g_srcImage1.data) { printf("影象1讀取錯誤,請確定路徑下是否存在圖片!\n"); return -1; } if (!g_srcImage2.data) { printf("影象2讀取錯誤,請確定路徑下是否存在圖片!\n"); return -1; } g_nAlphaValueSlider = 70; // 設定滑動條初始值 70 namedWindow(WINDOW_NAME, 1); // 建立窗體 // 在建立的窗體中建立一個滑動條控制元件 char TrackbaName[50]; sprintf_s(TrackbaName, "透明值 %d", g_nMaxAlphaValue); createTrackbar(TrackbaName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar); // 結果在回撥函式中顯示 on_Trackbar(g_nAlphaValueSlider, NULL); waitKey(0); return 0; }
參考:
《OpenCV3 程式設計入門》 毛星雲 P75