[注意:这是对被认为不合适且已关闭的earlier question的重写。]
我需要对电视(电视)视频进行像素级分析。这种分析的确切性质并不相关,但它主要涉及从MPEG-2传输流开始查看电视视频每帧的每个像素。主机平台将是服务器级,多处理器64位Linux机器。
我需要一个能够处理传输流解码的库,并实时向我提供图像数据。 OpenCV和ffmpeg是我正在考虑进行这项工作的两个库。 OpenCV很吸引人,因为我听说它具有易于使用的API和丰富的图像分析支持,但我没有使用它的经验。我过去曾使用ffmpeg从文件中提取视频帧数据进行分析,但它缺乏图像分析支持(尽管英特尔的IPP可以补充)。
除了针对此问题的方法的一般建议(不包括实际的图像分析),我还有一些更具体的问题可以帮助我开始:
答案 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的转换。