【從零學習OpenCV 4】創建影像窗口滑動條

  • 2019 年 12 月 13 日
  • 筆記

經過幾個月的努力,小白終於完成了市面上第一本OpenCV 4入門書籍《從零學習OpenCV 4》。為了更讓小夥伴更早的了解最新版的OpenCV 4,小白與出版社溝通,提前在公眾號上連載部分內容,請持續關注小白。

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

程式碼清單3-54 createTrackbar()函數原型  1.  int cv::createTrackbar(const String & trackbarname,  2.                             const String & winname,  3.                             int * value,  4.                             int  count,  5.                             TrackbarCallback onChange = 0,  6.                             void * userdata = 0  7.                             )
  • 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中給出。

程式碼清單3-55 myCreateTrackbar.cpp在影像中創建滑條改變影像亮度  1.  #include <opencv2/opencv.hpp>  2.  #include <iostream>  3.  4.  using namespace std;  5.  using namespace cv;  6.  7.  //為了能在被調函數中使用,所以設置成全局的  8.  int value;  9.  void callBack(int, void*); //滑動條回調函數  10.  Mat img1, img2;  11.  12.  int main()  13. {  14.    img1 = imread("lena.png");  15.    if (!img1.data)  16.    {  17.      cout << "請確認是否輸入正確的影像文件" << endl;  18.      return -1;  19.    }  20.    namedWindow("滑動條改變影像亮度");  21.    imshow("滑動條改變影像亮度", img1);  22.    value = 100; //滑動條創建時的初值  23.    //創建滑動條  24.    createTrackbar("亮度值百分比", "滑動條改變影像亮度", &value, 600, callBack, 0);  25.    waitKey();  26.  }  27.  28.  static void callBack(int, void*)  29. {  30.    float a = value / 100.0;  31.    img2 = img1 * a;  32.    imshow("滑動條改變影像亮度", img2);  33.  }

圖3-34 myCreateTrackbar.cpp程式中滑動條不同位置對影像亮度的改變