Мне нужна помощь в понимании кода видео-трекера с OpenCV C ++ - PullRequest
0 голосов
/ 19 мая 2019

Есть одна проблема, которую я не понимаю в этом коде. После создания трекера мы вызываем внутри него onTrackbarSlide(), и я полагаю, что pos = 0 равно нулю, так как это начало, и мы не использовали трекер раньше.

Мы входим в цикл, остываем, и после получения текущей позиции (которая, я думаю, 0) мы устанавливаем g_dontset = 1 и g_run -=1, так что теперь g_run равно 0.

Допустим, мы ничего не нажимали, поэтому первый кадр остается в окне. Но затем мы перемещаем позицию трекера, поэтому функция на onTrackbarSlide() вызывается снова, устанавливает правильную позицию, которую мы выбрали, и, как g_dontset = 1, не вводит оператор if, но устанавливает g_dontset в 0.

И мы снова вернулись к циклу for, но g_run по-прежнему равен 0, поэтому мы не вводим if в цикле, так как же удалось показать этот новый кадр?

int g_slider_position = 0;
int g_run = 1, g_dontset = 0;
VideoCapture g_cap;

void onTrackbarSlide(int pos, void *) {
    g_cap.set(CAP_PROP_POS_FRAMES, pos);
    if (!g_dontset)
        g_run = 1;
    g_dontset = 0;
}

int main()
{
    namedWindow("MyMovie", WINDOW_AUTOSIZE);
    g_cap.open("Movie.mp4");
    int frames = (int)g_cap.get(CAP_PROP_FRAME_COUNT);
    int tmpw = (int)g_cap.get(CAP_PROP_FRAME_WIDTH);
    int tmph = (int)g_cap.get(CAP_PROP_FRAME_HEIGHT);
    cout << "Video has " << frames << " frames of dimensions( "
        << tmpw << ", " << tmph << " )." << endl;

    createTrackbar("Position", "MyMovie", &g_slider_position,
        frames, onTrackbarSlide);

    Mat frame;

    for (;;) {
        if (g_run != 0) {
            g_cap >> frame; if (frame.empty()) break;
            int current_pos = (int)g_cap.get(CAP_PROP_POS_FRAMES);
            g_dontset = 1;

            setTrackbarPos("Position", "MyMovie", current_pos);
            imshow("MyMovie", frame);

            g_run -= 1;
        }


        char c = (char)waitKey(10);
        if (c == 's') // single step
        {
            g_run = 1; cout << "Single step, run = " << g_run << endl;
        }
        if (c == 'r') // run mode
        {
            g_run = -1; cout << "Run mode, run = " << g_run << endl;
        }
        if (c == 27) break;
    }
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...