OpenCV 2.4.10: createTrackbar()+getTrackbarPos()
阿新 • • 發佈:2018-11-16
如何在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;
}
結果: