openCV:滑动条之setTrackbarPos与createTrackbar

滑动条(trackbar)

创建滑动条(createTrackbar)

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

// C++ code
int 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
#include
#include
#include

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);
}

你可能感兴趣的:(openCV,opencv,滑动条,trackbar)