【问题标题】:Recommendations for real-time pixel-level analysis of television (TV) video对电视 (TV) 视频进行实时像素级分析的建议
【发布时间】:2012-01-13 15:49:24
【问题描述】:

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

我需要对电视 (TV) 视频进行一些像素级分析。这种分析的确切性质并不相关,但它基本上涉及查看电视视频每一帧的每个像素,从 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 等)方面特别有效?

【问题讨论】:

  • 您提出的许多与性能相关的问题完全取决于您使用的硬件。
  • @karlphillip 我意识到平台的选择会影响性能,但它不会平等地影响所有库选项吗?如果没有,您可以谈谈选择平台如何使一个图书馆比另一个图书馆受益更多,请分享。硬件尚未购买,因此此信息很有价值。
  • 我已经使用 c++ 包装器使用 opencv 进行了实时网络摄像头帧分析。它循环遍历每个像素并检查颜色,速度非常快,因为我能够运行其他应用程序,如 opera 和 3d 视口应用程序。在 linux 上工作。
  • @Randall 不一定。例如,OpenCV makes heavy usage on Intel's IPP 这意味着它比您可能使用的其他库从英特尔架构中受益更多。 :)

标签: linux video opencv ffmpeg signal-processing


【解决方案1】:

1.
我肯定会推荐 OpenCV 用于“实时”图像分析。我假设实时您指的是跟上电视帧速率(例如 NTSC (29.97 fps) 或 PAL (25 fps))的能力。当然,正如 cmets 中提到的,这当然取决于您可用的硬件以及图像大小 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 

看看它能输入和输出什么。

【讨论】:

  • 真正有用的见解,@mevatron。非常感谢。
【解决方案2】:

仅针对第 4 个问题:

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

注意 1。虽然 OpenCV 本身支持 BGR 图像,但您可以让它处理 YUV,并对其内部结构有所了解。

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

注意2.如果你想在opencv中访问YUV图像,你必须在你的应用程序中直接使用ffmpeg API。 OpenCV 在其 VideoCapture API 中强制将 YUV 转换为 BGR。

【讨论】:

    猜你喜欢
    • 2016-07-29
    • 2020-02-10
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-25
    相关资源
    最近更新 更多