1. 程式人生 > >OpenCV 2.4.10: createTrackbar()+getTrackbarPos()

OpenCV 2.4.10: createTrackbar()+getTrackbarPos()

如何在OpenCV中用createTrackbar函式建立和使用軌跡條,以及影象對比度、亮度值的動態調整?

<1>建立軌跡條——createTrackbar()

功能:建立一個可以調整數值的軌跡條,並將軌跡條附加到指定的視窗上,它往往會和一個回撥函式配合起來使用。
格式:

C++: 
int createTrackbar(
                   conststring& trackbarname,//軌跡條名字
                   conststring& winname,//視窗名字
                   int
* value,//滑塊的位置 int count,//滑塊達到的最大的位置 TrackbarCallback onChange=0,//回撥函式 void* userdata=0//使用者傳給回撥函式的資料 );

引數:

  • 第一個引數,const string&型別的trackbarname,表示建立的軌跡條的名字。
  • 第二個引數,const string&型別的winname,依附視窗的名字,表示這個軌跡條會依附到哪個視窗上,即對應namedWindow()建立視窗時填的某一個視窗名。
  • 第三個引數,int* 型別的value,一個指向整型的指標,表示滑塊的位置。並且在建立時,滑塊的初始位置就是該變數當前的值。
  • 第四個引數,int型別的count,表示滑塊可以達到的最大位置的值。PS:滑塊最小的位置的值始終為0。
  • 第五個引數,TrackbarCallback型別的onChange,首先注意他有預設值0。這是一個指向回撥函式的指標,每次滑塊位置改變時,這個函式都會進行回撥。並且這個函式的原型必須為void XXXX(int,void*);其中第一個引數是軌跡條的位置,第二個引數是使用者資料(看下面的第六個引數)。如果回撥是NULL指標,表示沒有回撥函式的呼叫,僅第三個引數value有變化。
  • 第六個引數,void*型別的userdata,他也有預設值0。這個引數是使用者傳給回撥函式的資料,用來處理軌跡條事件。如果使用的第三個引數value實參是全域性變數的話,完全可以不去管這個userdata引數。

<2>獲取當前軌跡條的位置——getTrackbarPos函式

功能:用於獲取當前軌跡條的位置並返回。
格式:

C++: 
int getTrackbarPos(
                   conststring& trackbarname,
                   conststring& winname
                  );

引數:

  • 第一個引數,const string&型別的trackbarname,表示軌跡條的名字。
  • 第二個引數,const string&型別的winname,表示軌跡條的父視窗的名稱。

示例:

//標頭檔案
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

//名稱空間
using namespace cv;
using namespace std;

//全域性函式宣告
Mat img;//全域性變數
int threshval = 160;//軌跡條滑塊對應的值,給初值160

//軌跡條的回撥函式
static void on_trackbar(int, void*)
{
    Mat bw = threshval < 128 ? (img < threshval) : (img > threshval);


    vector<vector<Point> > contours;//定義二維點型變數
    vector<Vec4i> hierarchy;//定義向量

    //查詢輪廓
    findContours( 
                 bw, //查詢輪廓的影象
                 contours, //影象中的各個輪廓,集合
                 hierarchy, //輪廓的索引
                 CV_RETR_CCOMP, //檢測所有輪廓,
                 CV_CHAIN_APPROX_SIMPLE//只儲存水平,垂直,對角直線的起始點 
                 );

    //初始化dst
    Mat dst = Mat::zeros(img.size(), CV_8UC3);

    //開始處理
    if( !contours.empty() && !hierarchy.empty() )
    {
        //遍歷所有頂層輪廓,隨機生成顏色值繪製給各連線組成部分
        int idx = 0;
        for( ; idx >= 0; idx = hierarchy[idx][0] )
        {
            Scalar color( 
                         (rand()&255), 
                         (rand()&255), 
                         (rand()&255) 
                         );//隨機生成顏色值

            //繪製填充輪廓
            drawContours( 
                         dst,//目標影象 
                         contours, //輸入的輪廓
                         idx, //知名畫第幾個輪廓
                         color, //輪廓的顏色
                         CV_FILLED, //填充輪廓內部
                         8,//線型
                         hierarchy //輪廓結構資訊
                        );
        }
    }

    //顯示視窗
    imshow( "Connected Components", dst );
}



//控制檯應用程式的入口函式
int main()
{
    system("color 5F");//color是調整控制檯顏色的命令
    img = imread("1.jpg", 0);//載入圖片並轉換為灰度圖

    if( !img.data ) { 
    printf("Oh,no,讀取img圖片檔案錯誤~! \n"); 
    return -1; 
    }//判斷是否讀取失敗

    namedWindow( "Image", 1 );//建立命名視窗
    imshow( "Image", img );//顯示原圖

    //建立處理視窗
    namedWindow( "Connected Components", 1 );
    //建立軌跡條
    createTrackbar( 
                   "Threshold",//軌跡條的名字
                   "Connected Components", //軌跡條所依附視窗的名字
                   &threshval, //軌跡條位置變數
                   255, //達到最大的值
                   on_trackbar //回撥函式
                 );

    on_trackbar(threshval, 0);//軌跡條回撥函式

    waitKey(0);
    return 0;
}

結果:
1
2
3