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则退出
    }
}
Last modification:August 10th, 2020 at 02:58 pm