【问题标题】:FFMpeg vs. OpenCV for format conversion/simple transformation用于格式转换/简单转换的 FFMpeg 与 OpenCV
【发布时间】:2019-06-26 01:34:17
【问题描述】:

我必须创建一个可以实时处理图像的系统。我已经用 C++ 实现了一个像素格式转换系统,它也可以进行一些简单的转换(目前:旋转和镜像)。

系统的输入/输出格式为以下格式的帧:

  • RGB (24, 32)
  • YUYV420, YUYV 422
  • JPEG
  • 原始灰度

例如,一个操作可以是:

  • YUYV422 -> 旋转 90 -> 翻转水平 -> RGB24
  • 灰度 -> 旋转 270 -> 翻转垂直 -> YUYV420

系统的目标是为旋转/镜像和像素格式转换提供最佳性能。我目前的实现依赖于 OpenCV,但在处理超过 2k 分辨率的数据时会遇到性能问题。

当前实现使用 cv::Mat 和 cv::transpose/cv::flip/cv::cvtColor,我对系统进行了优化以去除过渡缓冲区并尽可能多地复制。

不太乐意重新发明轮子,我知道使用 swscale 和 FFMpeg 的一些过滤器,可以达到相同的结果。我的问题是:

  1. FFMpeg 系统相当通用,您认为我可能会因使用此解决方案而受到占用空间/性能警告的困扰吗?

  2. OpenCV 中的格式转换似乎有些优化,但我不知道 FFMpeg 的实现...(注意:我在带有 SSE 的 x86_64 intel 平台上)

  3. 你知道有什么库可以实时处理这种简单的转换吗?

谢谢

【问题讨论】:

  • 2k 是巨大的。硬件设置是否有足够的提升空间? (I/O 带宽等)
  • OpenCV 可以使用 FFMpeg 作为其背景:docs.opencv.org/3.4/d0/da7/videoio_overview.html 实时是什么意思?你想达到多少fps?正如@9dan 所发现的那样——可能存在硬件限制。
  • @9dan 你有什么建议?

标签: c++ performance opencv ffmpeg vision


【解决方案1】:

OpenCV 实现已针对您的配置进行了优化。不要期待 ffmpeg 的改进。最近,OpenCV 切换到 libjpeg-turbo 具有 SSE 优化,这可能会改善 JPEG 转换。

【讨论】:

  • 它是 libjpeg-turbo,但目前不包含 SIMD(请参阅 here)。随时提交拉取请求以添加 SIMD 支持。
  • @Catree 感谢您的澄清。我知道这涉及到官方版本,本地构建可以轻松启用 SIMD,不是吗?
  • libjpeg-turbo 作为第三方包含在 OpenCV 中,没有 SIMD 代码。是的,您应该能够安装libjpeg-turbo(例如,从包管理器)并且OpenCV 应该能够自动检测并链接到主机libjpeg-turbo
  • 嗨亚历克斯,你有一些资源/数字/链接可以给这个评估吗?是你的亲身经历吗?谢谢
  • 不,我手头没有严格的测量值。我在类似转换中使用 ffmpeg 的经验相当令人失望。如果您发现确认或矛盾的证据,请在此处发布。
猜你喜欢
  • 2015-05-29
  • 2021-07-20
  • 2014-05-24
  • 2015-10-12
  • 2022-01-03
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
相关资源
最近更新 更多