2016-12-07 2 views
-1

Я читаю видеофайл, и он медленнее, чем фактический FPS файла (59 FPS @ 1080p), даже если я не делаю никакой обработки изображения:Изменение FPS на захват видео из файла с opencv

 using namespace cv; 
     using namespace std; 
     // Global variables 
     UMat frame; //current frame 
     int main(int argc, char** argv) 
     { 

       VideoCapture capture("myFile.MP4"); 
       namedWindow("Frame"); 
       capture.set(CAP_PROP_FPS, 120); //not changing anything 
       cout>>capture.get(CAP_PROP_FPS); 
       while (charCheckForEscKey != 27) { 

         capture >>frame; 
       if (frame.empty()) 
        break; 
       imshow("Frame", frame); 

       } 

    } 

Даже если бы я попытался установить CAP_PROP_FPS 120 это не меняет кадров в секунду файла и, когда я получаю (CAP_PROP_FPS) Я все еще получаю 59.9 ...

когда я прочитал видео фактической результат - более или менее 54 FPS (даже с использованием UMat).

Есть ли способ прочитать файл с более высокой скоростью FPS?

я спросил вопрос о OpenCV Q & веб-сайт, а также: http://answers.opencv.org/question/117482/change-fps-on-video-capture-from-file/

Является ли это просто потому, что мой компьютер слишком медленно?

+0

Поиск в Интернете для «двойной буферизации», концепция, когда один поток пишет буфер, а другой поток читает буфер. Для настройки скорости можно использовать несколько буферов. –

+0

Чтение из файла, FPS - это просто метаданные, которые вы можете использовать.'VideoCapture' просто декодирует фреймы как можно быстрее. –

+0

@ThomasMatthews спасибо, я хочу проверить –

ответ

1

TL, DR FPS имеет никакого отношения к проблеме, вероятно, проблема производительности

Что FPS используется для? Прежде чем вы сможете отобразить один кадр видео, вам необходимо прочитать данные (с жесткого диска, DVD, сети, Интернета и т. Д.) И декодировать его. Обе эти операции требуют времени, количество которых отличается от системы к системе, в зависимости от скорости HDD/Internet, скорости процессора и т. Д. Если мы просто покажем каждый кадр, как только он будет готов, полученная скорость видео, следовательно, варьируются от системы к системе. Обычно это не то, что мы хотим, поэтому вместе с последовательностью видеокадров мы получаем значение «кадров в секунду» (ака FPS), которое сообщает нам, как скоро мы будем отображать каждый последовательный кадр (один раз каждые 1/30 секунда для 30 FPS, один раз каждые 1/60 секунды для 60 FPS и т. д.). Если кадр готов к отображению, но слишком рано, мы можем подождать, пока наступит его время. Если пришло время отображать фрейм, но он не готов (в системе с недостаточной/слишком занятой потребностью), мы не можем много сделать (возможно, в некоторых ситуациях в кадре). Чтобы увидеть эффект для себя, попробуйте изменить значение FPS для x2, сохраните файл и отобразите его с помощью VLC: за тот же объем данных и одинаковое количество кадров вы заметите, что скорость вашего видео удвоилась и время - вдвое. Попробуйте записать каждый кадр дважды для вашего x2 FPS - вы увидите, что скорость воспроизведения вернулась к нормальной (с удвоенным количеством кадров и бессмысленным увеличением размера файла).

Какой FPS не используется? При обработке (не отображении) видео мы не ограничены исходным FPS, и обработка идет как можно быстрее. Если ваш ПК может обрабатывать 1000 кадров в секунду - хорошо, если 1500 - еще лучше. Излишне говорить, что изменение значения FPS в файле не улучшит скорость вашего CPU/HDD, поэтому, если вы сможете обрабатывать 54 кадра в секунду, вы все равно сможете обрабатывать только 54 кадра в секунду.

Но как VLC может работать быстрее? Предполагая, что вы не забыли переключиться с Debug на Release build перед измерением времени, есть еще ряд возможностей: VLC, вероятно, лучше оптимизирован для конкретной задачи воспроизведения видео (OpenCV на самом деле не так быстро работает с некоторыми задачами, плюс он должен преобразовать каждый кадр в более общую структуру Mat/UMat), многопоточность (включая «двойную буферизацию», как упоминается в комментариях) является еще одной возможной причиной, возможно, кэшированием (например, чтение блока данных, содержащего много кадров из жесткий диск одновременно вместо чтения и обработки кадров один за другим).