OpenCV videoInput.h Скорость захвата отличается от скорости записи - PullRequest
0 голосов
/ 18 февраля 2011

Я пытаюсь написать программное обеспечение для записи, которое записывает видео поток, поступающий с компьютера, в файл avi. Я использую OpenCV и сопровождаемый videoInput.h для обработки кода DirectShow. На всякий случай важно использовать Visual Studio 2010 в качестве компилятора.

Проблема, с которой я столкнулся, заключается в том, что записанный файл воспроизводится быстрее, чем предварительно просматриваемый файл. Не очень, но достаточно, чтобы быть заметным. ПРИМЕР: 10-секундный предварительный просмотр - это примерно 7-секундный файл, поэтому все движутся слишком быстро.

if( bWriteVideo )
{
    writer=cvCreateVideoWriter(szFileName,CV_FOURCC('D','I','V','X'),
                                fps,cvSize(width, height),isColor);
    if( !writer ) return 1;
}

if( bDisplayVideo )
    cvNamedWindow("video", 0);

while( key != 'q')
{
    if(VI.isFrameNew(nSource))
    {
        VI.getPixels(nSource, yourBuffer1, false, true);

        frame = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
        frame->imageData = (char*)yourBuffer1;
        frame->imageDataOrigin = frame->imageData;

        if( !frame ) break;

        // Display Image to Screen
        if( bDisplayVideo )
            cvShowImage( "video" , frame );

        if( bWriteVideo )
            cvWriteFrame( writer, frame );      
    }   
        key = cvWaitKey ( 1000 / fps );     
}

1 Ответ

1 голос
/ 19 февраля 2011

Давайте предположим, что кадры поступают с 30 FPS. Ваш код выполняет следующие действия:

  • если поступил новый кадр, сохраните его и подождите 1000 / кадр / с (это ~ 33,3 мс).
  • если нет ... тогда просто подождите.

Давайте предположим, что сохранение кадра занимает 10 мс. Таким образом, один цикл занимает 33,3 мс (без входящего кадра) или 44,3 мс (если мы должны были его сохранить). Поэтому мы не собираемся сохранять их все (иногда у нас будет два входящих кадра за 44,3 мс, но мы сохраняем только один).

Таким образом, выходное видео будет иметь менее 30 кадров в секунду. Если мы играем это с 30 FPS ... это быстрее, чем реальность!

Так что постарайтесь не ждать много в конце цикла. Например, путем уменьшения количества времени, которое занимают вызовы cvWaitKey. (Например, заменив 1000 на 100.) Цикл будет выполняться несколько раз для каждого кадра, ожидая 3,3 миллисекунды за раз, затем проверяя новый кадр (и, если он есть, сохраняет его). В худшем случае это 10 (сохранение) + 3,3 (ожидание) мс, поэтому мы не пропустим ни одного нового кадра за это время.

...