createTrackbar
頭文件:opencv2/highgui/highgui.hpp
**作用:**createTrackbar是Opencv中的API,其可在顯示圖像的窗口中快速創建一個滑動控件,用於手動調節閾值,具有非常直觀的效果。
函數原型:
CV_EXPORTS int createTrackbar(const String& trackbarname,
const String& winname,
int* value,
int count,
TrackbarCallback onChange = 0,
void* 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則退出
}
}