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 无法从视频中获取所有帧的主要内容,如果未能解决你的问题,请参考以下文章