[注:这是对先前的问题的重写,它被认为是不适当的和关闭的。]
我需要做一些像素级的电视(电视)视频分析。这一分析的确切性质并不相关,但它基本上涉及到从MPEG-2传输流开始的每一帧电视视频的每个像素。主机平台将是服务器级、多处理器64位Linux机器.
我需要一个库,它可以处理传输流的解码,并向我提供实时的图像数据。OpenCV和ffmpeg是我为这项工作考虑的两个库。OpenCV很吸引人,因为我听说它很容易使用API和丰富的图像分析支持,但我没有使用它的经验。我过去曾使用ffmpeg从文件中提取视频帧数据进行分析,但缺乏图像分析支持(虽然Intel的IPP可以补充)。
除了对这个问题的处理方法(不包括实际图像分析)的一般性建议外,我还有一些更具体的问题可以帮助我开始:
发布于 2011-12-06 02:49:58
1.
我肯定会推荐OpenCV用于“实时”图像分析。我想你指的是跟上电视帧速率的能力(例如NTSC (29.97 fps)或PAL (25 fps))。当然,正如注释中提到的,这当然取决于您拥有的硬件,以及图像大小SD (480 P)和HD (720 p或1080 p)。FFmpeg当然有它的怪癖,但你很难找到一个更好的免费选择。它的功能和灵活性令人印象深刻;我相信这也是OpenCV开发人员决定使用它作为OpenCV视频解码/编码的后端的原因之一。
2.
在使用OpenCV解码时,我还没有看到高延迟的问题.您的系统有多少延迟?如果需要提高性能,请考虑使用单独的线程进行捕获/解码和图像分析。由于您提到有多处理器系统,这应该更好地利用您的处理能力。我肯定会推荐使用最新的Intel i7(或者可能是与Xeon相当的)体系结构,因为这将给您提供当今最好的性能。
我已经在几个嵌入式系统上使用了OpenCV,所以我非常熟悉您对峰值性能的要求。我已经发现很多次,它是不必要的处理一个完整的帧图像(特别是当试图确定掩码)。我强烈建议,如果您有困难处理您获得的视频流采样图像。这有时可以立即给你4-8X加速(取决于你的低样本因素)。在性能方面,我肯定会推荐使用英特尔的IPP。由于OpenCV最初是一个英特尔项目,IPP和OpenCV很好地融合在一起。
最后,由于图像处理是那些“令人尴尬的并行”问题字段之一,所以请不要忘记,如果需要,可以使用GPU作为硬件加速器来解决您的问题。OpenCV最近在这方面做了很多工作,所以如果需要的话,您应该可以使用这些工具。
3.
我认为FFmpeg是一个很好的起点;我能想到的大多数替代品(手制动器、编码器等)。倾向于使用ffmpeg作为后端,但如果您愿意的话,您可能可以使用IPP的视频编码库。
4.
OpenCV对颜色的内部表示是BGR,除非您使用像cvtColor这样的东西来转换它。如果希望看到FFmpeg支持的像素格式列表,则可以运行
ffmpeg -pix_fmts
看看它能输入和输出什么。
发布于 2011-12-06 06:40:03
仅就第四个问题而言:
视频流以422格式编码: YUV、YUV422、YCbCr等。将它们转换为BGR并返回(用于重新编码)占用了大量时间。因此,如果您可以编写在YUV上运行的算法,您将立即获得性能提升。
备注1.虽然OpenCV本机支持BGR映像,但您可以让它处理YUV,并对其内部进行一些关注和了解。
例如,如果要检测视频中的某些人,只需取解码视频缓冲区的上半部分(它包含图像的灰度表示)并对其进行处理。
备注2.如果您想要访问opencv中的YUV图像,您必须在应用程序中直接使用ffmpeg API。OpenCV在VideoCapture API中强制将YUV转换为BGR。
https://stackoverflow.com/questions/8393207
复制相似问题