openCV:滑动条之setTrackbarPos与createTrackbar

来源:互联网 发布:图片源码是什么 编辑:程序博客网 时间:2024/05/21 19:40

滑动条(trackbar)

创建滑动条(createTrackbar)

openCV提供createTrackbar指定图像窗口创建一个指定名称和范围的滑动条,使用户能够滑动调整输入,然后根据输入值执行程序。还提供了getTrackbarPos和setTrackbarPos以获取和修改bar的当前值。

// C++ codeint createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange=0, void*userdata=0)

Parameters:

  • trackbarname:创建的滑动条名。
  • winname:滑动条的父窗体名。
  • value:滑动条当前值。
  • count:允许的最大值,最小值为0。
  • onChange:回调函数,当滑动条位置发生变化时,调用此函数。函数形如void Foo(int,void*);,第一个是位置值,第二个是userdata
  • userdata:可以被传递给回调函数,可以在没有全局位置变量时起作用。

获取当前值(getTrackbarPos)

int getTrackbarPos(const String& trackbarname, const String& winname)

Parameters:

  • trackbarname:滑动条名称。
  • winname:窗口名称

设置滑动条位置(setTrackbarPos)

void setTrackbarPos(const String& trackbarname, const String& winname, int pos)

Parameters:

  • trackbarname:滑动条名称。
  • winname:窗口名称。
  • pos:新位置。

测试代码

代码功能描述:

  • 通过调整滑动条的位置可以调整视频的帧位;
  • ”r“键播放视频;
  • ”s“键每按一次切换一帧;
//code from "Learning OpenCV 3"#include<opencv2\highgui.hpp>#include<opencv2\imgproc.hpp>#include<iostream>#include<fstream>using namespace std;int g_slider_position = 0;int g_run = 1, g_dontset = 0;cv::VideoCapture g_cap;void onTrackbarSlide(int pos, void *) {    g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);    if (!g_dontset)        g_run = 1;    g_dontset = 0;}int main() {    string winName = "Example2-4";    string trackName = "Position";    cv::namedWindow(winName, cv::WINDOW_AUTOSIZE);    g_cap.open(string("C:\\Users\\LIKE\\Videos\\Bad Apple.mp4"));    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(trackName, winName, &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(trackName, winName, current_pos);            current_pos = cv::getTrackbarPos(trackName, winName);            cout << current_pos << endl;            cv::imshow(winName, frame);            g_run -= 1;        }        char c = (char)cv::waitKey(10);        if (c == 's') {            g_run = 1;            cout << "Single Step, run = " << g_run << endl;        }        if (c == 'r') {            g_run = -1;            cout << "Run_mode, run = " << g_run << endl;        }        if (c == 27)            break;    }    return(0);}
原创粉丝点击