【问题标题】:OpenCV videoInput.h Capture speed different than write speedOpenCV videoInput.h 捕获速度不同于写入速度
【发布时间】:2011-06-29 10:48:39
【问题描述】:

我正在尝试编写可以将计算机中的视频流写入 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 );     
}

【问题讨论】:

    标签: c++ opencv directshow video-capture


    【解决方案1】:

    让我们假设帧以 30 FPS 的速度进入。您的代码执行以下操作:

    • 如果有新帧到达,则保存它,然后等待 1000/fps 毫秒(即 ~33.3 毫秒)。
    • 如果没有……那就等着吧。

    假设保存一帧需要 10 毫秒。因此,一次循环运行需要 33.3 毫秒(没有传入帧)或 44.3 毫秒(如果我们必须保存一个)。所以我们不会全部保存(有时我们会在 44.3 毫秒的时间内收到两个传入帧,但我们只保存一个)。

    因此,输出视频的每秒帧数将少于 30 帧。如果我们以 30 FPS 的速度播放……那比现实还要快!

    所以尽量避免在循环结束时等待很多。例如,通过减少 cvWaitKey 调用占用的时间量。 (例如,将 1000 替换为 100。)循环将针对每一帧运行多次,每次等待 3.3 毫秒,然后检查是否有新帧(如果有,则保存)。在最坏的情况下,这是 10(保存)+ 3.3(等待)毫秒,因此在此期间我们不会错过任何新帧。

    【讨论】:

    • 感谢您的帮助!我最终完全去掉了“cvWatiKey”,因为它只能在生成 OpenCV 窗口并且最终这是一个控制台应用程序时使用,但正是等待减慢了它的速度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多