Emgu CV 无法从视频中获取所有帧

Posted

技术标签:

【中文标题】Emgu CV 无法从视频中获取所有帧【英文标题】:Emgu CV doesn't get all frames from video 【发布时间】:2013-11-30 01:39:48 【问题描述】:

我想从大约 30 秒 (30fps) 的视频中获取并保存所有帧。

VirtualDub 程序显示我的电影有 930 帧,但我的程序只保存了 474 帧。我的代码如下:

string name = @"D:\movie-01-no.avi";
Capture _capture = new Capture(name);
int frame = 0;
while (_capture.Grab())

    frame++;
    Image<Bgr, byte> image = _capture.RetrieveBgrFrame();
    Bitmap bmp = new Bitmap(image.ToBitmap());
    bmp.Save(@"D:\" + frame + ".bmp");
    bmp.Dispose();

string name = @"D:\movie-01-no.avi";

Capture _capture = new Capture(name);
int frame = 0;
bool Reading = true;

while (Reading)

    frame++;
    Image<Bgr, Byte> image = _capture.QueryFrame();
    if (image != null)
    
        Bitmap bmp = new Bitmap(image.ToBitmap());
        bmp.Save(@"D:\" + frame + ".bmp");
        bmp.Dispose();
    
    else
    
        Reading = false;
    

在这两种情况下,它都不会保存 930 帧。为什么?我该如何解决?

【问题讨论】:

您好,您可以将其发布在答案部分,并将其标记为已接受以关闭问题 【参考方案1】:

我找到了解决办法。该程序工作正常。在视频描述中是视频具有 30 FPS 的信息。 VirtualDub 也显示 30 FPS。但是 VirtualDub 复制帧以从描述中获取帧的值。视频有 15 FPS,但 ViurualDub 每隔一帧重复一次,看起来像 30 FPS。如果您使用标准相机录制视频,您必须知道当视频中的帧较暗时,您的相机会录制 15 FPS。相机在明亮的地方记录 30 FPS。我已经在 Lumix 摄像头和笔记本电脑 Acer 的内置网络摄像头中检查了这一点。

【讨论】:

【参考方案2】:

我很难在 Egmu CV V3.0.0 下找到有关 Capture 的任何文档

在执行一些跟踪和错误测试后,我发现 Grab 和 QueryFrame 似乎都处理了一帧,有效地使 Grab() 在每个循环中丢弃一帧。 此代码似乎给出了预期的结果:

video = new Capture(filename);
bool reading;

int nframes = (int)video.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.FrameCount);
nframes++;

Mat frame;
Image<Bgr, byte> image;

int i = 0;

reading = true;

while (reading)

    frame = video.QueryFrame();
    if (frame != null)
    
        image = frame.ToImage<Bgr, byte>();

        mainPic.Image = image.ToBitmap();

        image.Dispose();
        frame.Dispose();
    
    else
    
        reading = false;
    
    i++;

【讨论】:

以上是关于Emgu CV 无法从视频中获取所有帧的主要内容,如果未能解决你的问题,请参考以下文章

使用 Opencv 加速从摄像头读取视频帧

无法使用videoCapture opencv打开视频

使用 OpenCV 从 .avi 视频中获取帧

如何通过 OpenCV 和 Python 通过索引从视频中获取帧?

从两个视频源读取帧不同步 |开放式CV

opencv之从视频帧中截取图片