关于电视(TV)视频的实时像素级分析的建议

时间:2011-12-05 23:07:05

标签: linux video opencv ffmpeg signal-processing

[注意:这是对被认为不合适且已关闭的earlier question的重写。]

我需要对电视(电视)视频进行像素级分析。这种分析的确切性质并不相关,但它主要涉及从MPEG-2传输流开始查看电视视频每帧的每个像素。主机平台将是服务器级,多处理器64位Linux机器。

我需要一个能够处理传输流解码的库,并实时向我提供图像数据。 OpenCV和ffmpeg是我正在考虑进行这项工作的两个库。 OpenCV很吸引人,因为我听说它具有易于使用的API和丰富的图像分析支持,但我没有使用它的经验。我过去曾使用ffmpeg从文件中提取视频帧数据进行分析,但它缺乏图像分析支持(尽管英特尔的IPP可以补充)。

除了针对此问题的方法的一般建议(不包括实际的图像分析),我还有一些更具体的问题可以帮助我开始:

  1. ffmpeg或OpenCV是工业中常用的实时基础 视频分析,还是我还应该关注其他什么?
  2. OpenCV能否实时解码视频帧,并且仍然留有足够的空间 CPU还剩下来做实时的非平凡图像分析吗?
  3. 足以使用ffpmeg进行MPEG-2传输流解码,或者 是不是直接使用MPEG-2解码库(如果是,哪一个)?
  4. ffmpeg的输出帧是否有特定的像素格式 或OpenCV在制作时特别有效(如RGB,YUV或YUV422等)?

2 个答案:

答案 0 :(得分:6)

<强> 1
我肯定会推荐OpenCV进行“实时”图像分析。我假设您实时指的是能够跟上电视帧速率(例如,NTSC(29.97 fps)或PAL(25 fps))。当然,正如评论中所提到的,它当然取决于您可用的硬件以及SD(480p)与HD(720p或1080p)的图像大小。 FFmpeg肯定有它的怪癖,但你很难找到一个更好的免费替代品。它的力量和灵活性令人印象深刻我确信这是OpenCV开发人员决定将其用作OpenCV视频解码/编码后端的原因之一。

<强> 2
在使用OpenCV进行解码时,我没有看到高延迟问题。您的系统有多少延迟?如果需要提高性能,请考虑使用单独的线程进行捕获/解码和图像分析。由于您提到了多处理器系统,因此这应该会更好地利用您的处理能力。我肯定会建议使用最新的Intel Core-i7(或者可能是Xeon等价物)架构,因为这将为您提供当今最佳性能。

我在几个嵌入式系统上使用过OpenCV,所以我对你对峰值性能的渴望非常熟悉。我已经多次发现没有必要处理全帧图像(特别是在尝试确定蒙版时)。如果您难以处理获取的视频流,我强烈建议您对图像进行下采样。这有时可以立即为您提供4-8倍的加速(取决于您的下采样因子)。同样在性能方面,我肯定会建议使用英特尔的IPP。由于OpenCV最初是一个英特尔项目,因此IPP和OpenCV很好地融合在一起。

最后,因为图像处理是那些“令人尴尬的并行”问题领域之一,所以不要忘记在需要时使用GPU作为硬件加速器的可能性。 OpenCV最近在这方面做了很多工作,所以如果需要,你应该可以使用这些工具。

第3
我认为FFmpeg将是一个很好的起点;我能想到的大多数替代品(Handbrake,mencoder等)都倾向于使用ffmpeg作为后端,但如果你愿意的话,看起来你可能会使用IPP的Video Coding库。

<强> 4
OpenCV的颜色内部表示是BGR,除非你使用cvtColor之类的东西来转换它。如果您想查看FFmpeg支持的像素格式列表,可以运行

ffmpeg -pix_fmts 

查看输入和输出的内容。

答案 1 :(得分:3)

仅针对第4个问题:

视频流以422格式编码:YUV,YUV422,YCbCr等。将它们转换为BGR并返回(用于重新编码)会占用大量时间。因此,如果您可以编写您的算法以在YUV上运行,您将立即获得性能提升。

注1。虽然OpenCV原生支持BGR图像,但您可以使用它来处理YUV,并对其内部结构有所了解。

例如,如果您想要检测视频中的某些人,只需获取解码视频缓冲区的上半部分(它包含图像的灰度表示)并进行处理。

注意2。如果要在opencv中访问YUV图像,则必须直接在应用程序中使用ffmpeg API。 OpenCV在其VideoCapture API中强制从YUV到BGR的转换。