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则退出
}
}