Отставание отображения видео с помощью cvShowImage () - PullRequest
2 голосов
/ 28 июля 2010

Я пытаюсь отображать видео файл со скоростью 25 кадров в секунду без каких-либо задержек. Приведенный ниже код делает это, но достигает только 10 кадров в секунду, для выполнения требуется около 0,1 мс. С cvWaitKey (1) я получаю около 0,03 до 0,04 мс, что было бы идеально, но названное окно просто остается серым и не показывает видео!

Это потому, что cvShowImage () работает слишком медленно? Есть ли другой способ ускорить код и плавно выводить видео?

См. Мой код ниже.

Заранее большое спасибо,

Адриан

#include <cv.h>
#include <iostream>
#include <highgui.h>
#include <cxcore.h>
#include <cvaux.h>
#include <sstream>
#include <time.h>
using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    CvCapture* vid = 0;

    IplImage* input; //Input image

    int fps;
    int i=0;

    clock_t start, end;

    /*Creates the GUI to output the processed images*/
    cvNamedWindow("Video input", 0);

    /*Open input video*/
    if (argc!=2)
    {
 cout << "Please specify an input video." << endl;
 return -1;
    }
    else
    {
 vid=cvCreateFileCapture(argv[1]);
 if (!vid)
 {
     cout << "Could not extract frame." << endl;
     return -1;
 }
    }

    input = cvQueryFrame(vid);

    fps = (int)cvGetCaptureProperty(vid, CV_CAP_PROP_FPS);
    cout << fps << endl;

    cout << "Video found." << endl;
    /*Extraction loop */
    while (input)
    {
 start = clock();

 cout << flush;
 cout << i << "\r";

 i++;

 /*Show image*/
 cvShowImage("Video input", input);

 cvWaitKey(2); //Wait is needed or else we see a grey box

 input = cvQueryFrame(vid); //Read next frame from video
 end = clock();
 cout << (double)(end-start)/CLOCKS_PER_SEC << " s" << endl;
    };

    /*Release the allocated memory for the frames */
    cvReleaseImage(&input);
    cvDestroyWindow("Video input");
    return 1;
}

Ответы [ 3 ]

1 голос
/ 29 июля 2010

Попробуйте вызвать cvWaitKey с требуемой 1000 / fps, в вашем случае:

cvWaitKey (1000/25)

1 голос
/ 28 июля 2010

Вы пробовали это без всяких проблем с cout?

Отладочная сборка Microsoft STL имеет обработку cout, которая почти невероятно медленная.

0 голосов
/ 30 июля 2010

Вы можете попробовать что-то вроде:

char key = cvWaitKey(10); //waits 10 milliseconds

if (key == 27)            //and if ESC is pressed, get out of the loop
  break;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...