使用cvShowImage()滞后视频显示

时间:2010-07-28 09:32:21

标签: c++ image-processing opencv

我正在尝试以25fps平滑地显示视频文件,没有任何延迟。下面的代码执行此操作,但只能达到大约10fps,执行大约需要0.1ms。使用cvWaitKey(1)我得到0.03到0.04ms左右,这将是完美的,但命名窗口只是保持灰色,不显示视频!

这是因为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 个答案:

答案 0 :(得分:1)

你是否尝试过没有所有cout的东西?

Microsoft STL的调试版本具有cout处理功能,几乎令人难以置信地缓慢。

答案 1 :(得分:1)

尝试在需要1000 / fps的情况下调用cvWaitKey:

cvWaitKey(1000年至1025年)

答案 2 :(得分:0)

您可以尝试以下方式:

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

if (key == 27)            //and if ESC is pressed, get out of the loop
  break;