1. 程式人生 > 其它 >C++版本OpenCv教程(二十)建立影象視窗滑動條

C++版本OpenCv教程(二十)建立影象視窗滑動條

技術標籤:OpenCV

影象視窗滑動條,顧名思義就是在顯示影象的視窗中建立能夠通過滑動改變數值的滑動條。有時我們需要動態調節某些引數,以使影象處理的效果更加明顯,能夠改變引數數值的滑動條可以很好的勝任這項工作。OpenCV 4中通過**createTrackbar()**函式在顯示影象的視窗上建立滑動條,該函式的函式原型在程式碼清單3-54中給出。

int cv::createTrackbar(const String & trackbarname,
                       const String & winname,
                       int * value,
                       int  count,
                       TrackbarCallback onChange =
0, void * userdata = 0 )
  • trackbarname:滑動條的名稱
  • winname:建立滑動條視窗的名稱。
  • value:指向整數變數的指標,該指標指向的值反映滑塊的位置,建立後,滑塊位置由此變數定義。
  • count:滑動條的最大取值。
  • onChange:每次滑塊更改位置時要呼叫的函式的指標。該函式應該原型為void Foo(int,void
    *);,其中第一個引數是軌跡欄位置,第二個引數是使用者資料。如果回撥是NULL指標,則不會呼叫任何回撥,只更新數值。
  • userdata:傳遞給回撥函式的可選引數

該函式能夠在影象視窗的上方建立一個範圍從0開始的整數滑動條,由於滑動條只能輸出整數,如果需要得到小數,必須進行後續處理,例如輸出值除以10得到含有1位小數的資料。函式第一個引數是滑動條的名稱,第二個引數是建立滑動條的影象視窗的名稱。第三個引數是指向整數變數的指標,該指標指向的值反映滑塊的位置,在建立滑動條時該引數確定了滑動塊的初始位置,當滑動條建立完成後,該指標指向的整數隨著滑塊的移動而改變。第四個引數是滑動條的最大取值。第五個引數是每次滑塊更改位置時要呼叫的函式的指標。該函式應該原型為void Foo(int,void * ),其中第一個引數是軌跡欄位置,第二個引數是使用者資料,如果回撥是NULL指標,則不會呼叫任何回撥,只更新數值。最後一個引數是傳遞給回撥函式的void *型別資料,如果使用的第三個引數是全域性變數,可以不用忽略最後一個引數,使用引數的預設值即可。

為了瞭解滑動條動態改變引數的方法以及動態引數在程式中的作用,在程式碼清單3-55中給出了通過滑動條改變影象亮度的示例程式。程式中滑動條控制影象亮度係數,將影象原始灰度值乘以亮度係數得到最終的影象。為了使影象亮度變化比較平滑,將滑動條引數除以100以得到含有兩位小數的亮度係數。為了保證每次亮度的改變都是在原始影象的基礎上,設定了兩個表示影象的img1、 img2全域性變數,其中img1表示原始影象,img2表示亮度改變後的影象。程式中,通過拖拽滑動塊可以動態的改變影象的亮度,執行結果在圖3-34中給出。

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

#define WINDOW_NAME "線性混合"

//變數宣告
const int g_nMaxAlphaValue = 1000;	//Alpha的最大值
int g_nAlphaValuesSlider;	//滑動條對應的變數
double g_dAlpaValue;
double g_dBetaValue;

//宣告儲存影象的變數
//g_srcImage1和g_srcImage2的圖片大小必須一樣,否則會報錯
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;

//響應滑動條的回撥函式
void on_Trackbar(int, void *)
{
    //求出當前alpha值對於最大值的比例
    g_dAlpaValue = (double)g_nAlphaValuesSlider / g_nMaxAlphaValue;

    //求出第二張圖片的權重
    g_dBetaValue = (1.0 - g_dAlpaValue);

    //線性混合
    addWeighted(g_srcImage1, g_dAlpaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);

    //顯示效果圖
    imshow(WINDOW_NAME, g_dstImage);
}

int main()
{
    g_srcImage1 = imread("699342568.jpg");
    g_srcImage2 = imread("699342568.jpg");
    if (!g_srcImage1.data)
    {
        printf("第一張讀取失敗\n");
        return -1;
    }
    if (!g_srcImage2.data)
    {
        printf("第二張讀取失敗\n");
        return -1;
    }
    //設定滑動條的初始位置
    g_nAlphaValuesSlider = 50;

    //建立窗體
    namedWindow(WINDOW_NAME);
    //在建立窗體中建立一個滑動條
    char TranckbarName[50] = "透明值100";
    createTrackbar(TranckbarName, WINDOW_NAME, &g_nAlphaValuesSlider, g_nMaxAlphaValue, on_Trackbar,0);

    on_Trackbar(g_nAlphaValuesSlider, 0);

    waitKey(0);
    return 0;
}