如何在此OpenCV示例中调用回调函数?

时间:2017-07-26 23:07:26

标签: c++ opencv

我开始阅读学习OpenCV 3 ,但由于我没有用c ++编程,我对以下代码片段中使用回调函数的方式感到困惑:

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(int argc, char** argv)
{
    g_cap.open(std::string(argv[1]));

    int frames = (int)g_cap.get(CV_CAP_PROP_FRAME_COUNT);

    cv::createTrackbar(
        "Position",
        "Example 2-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", "Example 2-4", current_pos);
            cv::imshow("Example 2-4", frame);
            g_run -= 1;
        }

        char c = (char)cv::waitKey(10);

        if (c == 's')
        {
            g_run = 1;
        }

        if (c == 'r')
        {
            g_run = -1;
        }
    }
    return 0;
}

我从中收集到的是按下 Trackbar 上的某个位置会引发一个调用onTrackBarSlide的事件。

我想知道int pos论点来自何处?我无法在功能文档中找到它。

当我单步执行此程序时,onTrackBarSlide之后会调用setTrackbarPos。这让我感到困惑,并让我认为setTrackbarPos只是以current_pos作为onTrackBarSlide侦听的参数来举起一个事件。

但是为什么不能通过setTrackbarPos直接调用g_cap.set来更直接地完成这项工作?

0 个答案:

没有答案