Есть одна проблема, которую я не понимаю в этом коде. После создания трекера мы вызываем внутри него 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;
}