我需要对电视(电视)视频进行像素级分析.这种分析的确切性质并不相关,但它主要涉及从MPEG-2传输流开始查看电视视频每帧的每个像素.主机平台将是服务器级,多处理器64位Linux机器.
我需要一个可以处理传输流解码的库,并实时向我提供图像数据. OpenCV和ffmpeg是我正在考虑进行这项工作的两个库. OpenCV很吸引人,因为我听说它具有易于使用的API和丰富的图像分析支持,但我没有使用它的经验.我过去曾使用ffmpeg从文件中提取视频帧数据进行分析,但它缺乏图像分析支持(尽管英特尔的IPP可以补充).
除了针对此问题的方法的一般建议(不包括实际的图像分析),我还有一些更具体的问题可以帮助我开始:
> ffmpeg或OpenCV通常在工业中用作实时的基础
视频分析,还是我还应该关注其他什么?
> OpenCV可以实时解码视频帧,还能留下足够的空间
cpu留下来进行非平凡的图像分析,也是实时的?
>足以使用ffpmeg进行MPEG-2传输流解码,或者
是否最好直接使用MPEG-2解码库(如果是,哪一个)?
> ffmpeg的输出帧是否有特定的像素格式
或OpenCV在制作时特别有效(如RGB,YUV或YUV422等)?
解决方法
我肯定会推荐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
看看它可以输入和输出什么.