1. 程式人生 > 其它 >OpenCV createTrackbar() 滑動條建立使用簡單線性混合

OpenCV createTrackbar() 滑動條建立使用簡單線性混合

函式原型:

int createTrackbar(const string & trackbarname, const string & winname, int *value,  int count, TrackbarCallback onChange=0, void *userdata=0);
  1. 第一個引數:軌跡條的名字,用來代表我們建立的軌跡條;
  2. 第二個引數:視窗名字,表示軌跡條會依附到哪個視窗上,即對應 nameWindow()建立的某一個視窗;
  3. 第三個引數:滑塊的位置,建立時的初始位置就是其當前值;
  4. 第四個引數:滑塊的最大值,最小值始終位 0;
  5. 第五個引數:回撥函式指標,每次滑塊位置改變時,這個函式都會進行回撥,這個函式的原型必須是 void XXXX(int, void*)
    ,第一個引數:軌跡條的位置,第二個引數:使用者資料(下面的第6個引數);如果位 NULL 指標,表示沒有回撥函式呼叫,僅第三個引數 value 有變化;
  6. 第六個引數:這個是使用者傳給回撥函式的引數,如果第三個引數是全域性變數的話,可以不用管這個 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