[OpenCV3函數] —— createTrackbar

createTrackbar

頭文件:opencv2/highgui/highgui.hpp

**作用:**createTrackbar是Opencv中的API,其可在顯示圖像的窗口中快速創建一個滑動控件,用於手動調節閾值,具有非常直觀的效果。

函數原型:

CV_EXPORTS int createTrackbar(const String& trackbarname,
                                                const String& winname,
                                                int* value, 
                                                int count,                     
                                                TrackbarCallback onChange = 0void* userdata = 0);     
  • 參數1 trackbarname:滑動條軌跡名

  • 參數2 winname:滑動條依附的窗口名

  • 參數3 value:滑塊的位置,創建時,滑塊初始位置就是這個變量當前的值

  • 參數4 count:軌跡的最大值

  • 參數5 onChange:回調函數

  • 參數6 userdata:默認0,用戶傳給回調函數的數據,如果第三個值爲全局變量,忽略這個值.

如果使用第6個參數,則作爲參數傳給回調函數的usrdata

回調函數TrackbarCallback轉定義如下

typedef void (*TrackbarCallback)(int pos, void* userdata);
  • 參數1 pos:其中第一個參數是跟蹤欄位置

  • 參數2 userdata:第二個參數是用戶數據,如果回調函數是NULL指針,則不會調用回調函數,而只會更新值(比如窗口中的圖像數據地址)

    TrackbarCallback)爲函數void (int pos,void userdata)的別名

#include<opencv2/highgui/highgui.hpp>
#include<bits/stdc++.h>
using namespace std;

int g_slider_position = 0;	//滑動條起始位置
cv::VideoCapture g_cap;	//視頻
int g_run = 1, g_dontset = 0;	//以單步模式啓動
void onTrackbarSlide(int pos, void *) {
	g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);	//視頻流第幾幀
	if (!g_dontset)g_run = 1;	//當點擊滾動條時,將g_dontset設爲0,然後setTrackbarPos進入後,便會將run賦值爲0
	g_dontset = 0;	//滾動條有點擊
}
int main() {
	cv::namedWindow("Example2_4", 1);
	g_cap.open("C:/Users/Administrator/Desktop/test.avi");
	assert(g_cap.isOpened());
	int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);	//獲取幀數
	int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH);
	int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);
	cout << "video has" << frames << " frames of dimensions("
		<< tmpw << ", " << tmph << ")." << endl;
	//創建一個滾動條
	cv::createTrackbar("Position", "Example2_4", &g_slider_position, frames, onTrackbarSlide);
	cv::Mat frame;
	for (;;) {
		if (g_run != 0) {
			g_cap >> frame;
			if (frame.empty())break;
			int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);	//獲取當前幀數
			g_dontset = 1;	//滾動條沒有點擊
			cv::setTrackbarPos("Position", "Example2_4", current_pos);	//設置滾動條位置
			cv::imshow("Example2_4", frame);
			g_run -= 1;
		}
		char c = (char)cv::waitKey(10);
		if (c == 's') {
			g_run = 1;
			cout << "單步" << endl;
		}
		if (c == 'r') {
			g_run = -1;
			cout << "連續" << endl;
		}
		if (c == 27)break;	//如果鍵入的是esc則退出
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章