如何读取视频的像素值?

时间:2010-04-27 20:11:16

标签: image-processing video-processing

我最近为BMP图像的图像处理编写了C程序,我不得不读取像素值并处理它们,我非常简单地遵循BMP标题内容,我可以获得BMP图像的大部分信息。 / p>

现在的挑战是处理视频(逐帧),我该怎么办?如何在视频剪辑中读取连续图像帧流的标题?或者,就像,例如,mpeg格式也将具有通用标题,在阅读时我可以获得有关整个视频的信息,在标题之后,所有数据都只是像素。

我希望我能传达。

有没有人有处理视频的经验?

任何书籍或教程链接都会非常有用。

3 个答案:

答案 0 :(得分:4)

视频流,如MPEG,由许多帧组成,这些帧依赖于(显然)其持续时间和帧速率。要读取像素,您必须从所谓的帧内帧开始,帧内帧不依赖于前一帧到流中。任何连续帧都是一个时间上依赖于其前一帧的帧,因此要获得其像素,您必须将流从Intra解码到您想要的帧。
注意,通常,周期性地插入帧内帧以向解码器提供与流同步的方式。这在可能发生错误的环境中非常有用 你想做的不是一件容易的事。如果要进行后期处理,如过滤器或其他,则必须使用MPEG解码器,然后在对其进行双工处理之前修改帧。
我建议你学习视频编码,你可以从标准的MPEG中找到很多材料。

答案 1 :(得分:2)

我建议调查FFMpeg。它有一个命令行实用程序,可以从电影中抓取帧并将它们转储到像JPG这样的图像。然后,您可以修改现有的阅读器来处理JPG文件(只需使用像libjpeg这样的东西将JPG解码为原始像素缓冲区)。

或者,您可以使用FFMpeg API(C,Python,其他),并以编程方式执行帧捕获,并在浏览视频时查看像素。视频格式很复杂,因此除非您想要开始理解所有不同的编解码器,否则您可能需要抓取一个库来为您解码原始像素缓冲区。

答案 2 :(得分:1)

MPEG 1/2/4视频比位图更难处理,因为它们是压缩的。使用位图数据,您可以将实际颜色值直接存储到文件中。在MPEG或JPEG中,颜色信息在写入文件之前经过数字转换。其中包括

  • RGB - > YUV 420P(子采样色度)
  • 离散余弦变换
  • 加权量化
  • zig-zag ordered
  • 差分编码
  • 可变长度编码(类似霍夫曼)

所有这些意味着没有简单的方法来解析文件中的像素数据。您要么必须研究标准的每一分钟细节并编写自己的解码器,要么使用像ffmpeg这样的视频解码库来为您完成工作。 ffmpeg可以将您的视频转换为静止图像(see answers this recent question)。此外,您可以直接连接到ffmpeg库(libavformat和libavcodec)。有关优秀教程,请参阅this question的答案。